banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thủ thuật reverse engineering Xin giúp đỡ về gọi Nt... Functions qua syscall trên HDH 64bit  XML
  [Question]   Xin giúp đỡ về gọi Nt... Functions qua syscall trên HDH 64bit 11/06/2011 23:22:04 (+0700) | #1 | 240374
[Avatar]
.lht.
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 10:06:38
Messages: 75
Location: Inside you
Offline
[Profile] [PM]
Chào mọi người,

Hiện tại mình đang gặp rắc rối với vấn đề gọi hàm Nt trên HDH 64bit. Mình có tham khảo qua 1 số tài liệu và được biết trên những HDH từ XP trở đi, Syscall của nó có dạng:
Each syscall number is moved into EAX and invoked through INT 2Eh. In Windows XP and later, the syscall mechanism had changed.

MOV EAX, 101h ; syscall number: NtTerminateProcess
MOV EDX, 7FFE0300h ; EDX = 7FFE0300h
CALL EDX ; call 7FFE0300h
RETN 8

Notice the difference. Instead of INT 2Eh, now it is replaced by CALL EDX which leads us to ntdll.KiFastSystemCall, a tiny stub containing the SYSENTER instruction.

MOV EDX, ESP
SYSENTER
RETN

 


Dựa vào tài liệu trên, mình code như sau:

Code:
#define SYSENTER __asm _emit 0x0F __asm _emit 0x34
    DWORD NtOpenProcessCall,;
    typedef struct _CLIENT_ID{
        HANDLE UniqueProcess;
        HANDLE UniqueThread;
    } CLIENT_ID, *PCLIENT_ID;

    DWORD GetCallNUM(LPCSTR FuncName)
    {
        HMODULE ntdll = GetModuleHandle("ntdll.dll");
        if (!ntdll)
            LoadLibrary("ntdll.dll");    
        DWORD sysenter = *(DWORD*)((DWORD)GetProcAddress(ntdll, FuncName) + 1);
        return sysenter;
    }
    void InitFunction()
    {
        NtOpenProcessCall = GetCallNUM("NtOpenProcess");
    }

    _declspec(naked) void __stdcall SystemCall(void)
    {
        __asm
        {
            MOV EDX,ESP
            SYSENTER
            RET
        }
    }
    __declspec(naked) NTSTATUS __stdcall 
NtOpenProcess(PHANDLE ProcessHandle, ACCESS_MASK AccessMask, PVOID ObjectAttributes, PCLIENT_ID ClientID)
    {
        __asm
        {
            mov eax, NtOpenProcessCall
            call SystemCall
            retn 10h
        }
    }

    void main()
    {    
        InitFunction();
        CLIENT_ID cid;
        cid.UniqueThread = 0;
        cid.UniqueProcess = (HANDLE)21060;
        BYTE bBuffer[] = {0x90, 0x90, 0x90, 0x90};
        DWORD nWritten;
        HANDLE VictimHandle = 0;
        OBJECT_ATTRIBUTES ObjectAttributes;
        InitializeObjectAttributes(&ObjectAttributes, NULL, 0, 0, NULL);
        NTSTATUS stt = NtOpenProcess(&VictimHandle, PROCESS_QUERY_INFORMATION |
 PROCESS_VM_OPERATION | PROCESS_VM_WRITE, &ObjectAttributes, &cid);
        WriteProcessMemory(VictimHandle, (void*)0x000A8BE0, &bBuffer, sizeof(bBuffer), &nWritten);
        printf("0x%X \n",stt);
        system("pause");
    }
Code của mình nếu chạy ở HDH 32bit thì hoạt động tốt nhưng khi chạy trên nền 64bit thì lại crash ở đoạn gọi NtOpenProcess.

Có ai biết vì sao và giải thích cho mình được không smilie
Trash from trash is the place for new good things ~
[Up] [Print Copy]
  [Question]   Xin giúp đỡ về gọi Nt... Functions qua syscall trên HDH 64bit 12/06/2011 00:04:47 (+0700) | #2 | 240380
[Avatar]
.lht.
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 10:06:38
Messages: 75
Location: Inside you
Offline
[Profile] [PM]
Hì, vấn đề đã được giải quyết:

WinXP Sp2 32bit:

7C90DD7B B8 7A000000 MOV EAX,7A
7C90DD80 BA 0003FE7F MOV EDX,7FFE0300
7C90DD85 FF12 CALL DWORD PTR DS:[EDX]
7C90DD87 C2 1000 RETN 10


Win7 Sp1 64bit:

771BFC10 >/$ B8 23000000 MOV EAX,23
771BFC15 |. 33C9 XOR ECX,ECX
771BFC17 |. 8D5424 04 LEA EDX,DWORD PTR SS:[ESP+4]
771BFC1B |. 64:FF15 C00000>CALL DWORD PTR FS:[C0]
771BFC22 |. 83C4 04 ADD ESP,4
771BFC25 \. C2 1000 RETN 10
Trash from trash is the place for new good things ~
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|