[Question] Xin giúp đỡ về gọi Nt... Functions qua syscall trên HDH 64bit |
11/06/2011 23:22:04 (+0700) | #1 | 240374 |
|
.lht.
Member
|
0 |
|
|
Joined: 26/09/2010 10:06:38
Messages: 75
Location: Inside you
Offline
|
|
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 |
|
Trash from trash is the place for new good things ~ |
|
|
|
[Question] Xin giúp đỡ về gọi Nt... Functions qua syscall trên HDH 64bit |
12/06/2011 00:04:47 (+0700) | #2 | 240380 |
|
.lht.
Member
|
0 |
|
|
Joined: 26/09/2010 10:06:38
Messages: 75
Location: Inside you
Offline
|
|
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 ~ |
|
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|
|
|