Спросите о NtCreateThreadEx в Windows 7 x64!
I am used to NtCreateThreadEx in window 7 x32 and it work done. But in in window 7 x64 i couldn't. It failed with error: 0xC0000005 Access Violation. It may be fail at struct NtCreateTheadExBuffer, but i can't got it. Please, help me. My source bellow:
typedef struct { ULONG Size; ULONG Unknown1; ULONG Unknown2; PULONG Unknown3; ULONG Unknown4; ULONG Unknown5; ULONG Unknown6; PULONG Unknown7; ULONG Unknown8; } NtCreateTheadExBuffer; typedef DWORD WINAPI NtCreateThreadExProc(PHANDLE, ACCESS_MASK, LPVOID, HANDLE, LPTHREAD_START_ROUTINE, LPVOID, BOOL, DWORD, DWORD, DWORD, LPVOID); HANDLE NtCreateThreadEx(HANDLE hProcess, LPVOID lpRemoteThreadStart, LPVOID lpRemoteCallback) { HANDLE hRemoteThread = NULL; ULONG dw0 = 0, dw1 = 0; NtCreateTheadExBuffer Buffer; memset(&Buffer, 0, sizeof(NtCreateTheadExBuffer)); Buffer.Size = sizeof(NtCreateTheadExBuffer); Buffer.Unknown1 = 0x10006; Buffer.Unknown2 = 0x16; Buffer.Unknown3 = &dw1; Buffer.Unknown4 = 0; Buffer.Unknown5 = 0x10008; Buffer.Unknown6 = 8; Buffer.Unknown7 = &dw0; Buffer.Unknown8 = 0; NtCreateThreadExProc *NtCreateThreadX = (NtCreateThreadExProc*)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtCreateThreadEx"); if(NtCreateThreadX == NULL) return NULL; DWORD dw = 0; if(!SUCCEEDED(dw = NtCreateThreadX( &hRemoteThread, //THREAD_ALL_ACCESS, // STANDARD_RIGHTS_ALL | SPECIFIC_RIGHTS_ALL, 0x1FFFFF, // All access NULL, hProcess, (LPTHREAD_START_ROUTINE)lpRemoteThreadStart, lpRemoteCallback, FALSE, NULL, NULL, NULL, //NULL &Buffer ))) { return NULL; } return hRemoteThread; }
[no name]
Вы получаете правильную версию ntdll.dll? Вы должны быть в состоянии использовать отладчик, чтобы точно узнать, где это происходит.
[no name]
Это может означать что угодно - вам нужно использовать отладчик, чтобы выяснить, где это происходит. Кроме того, используйте Google, чтобы узнать, как убедиться, что вы получаете правильный ответ ntdll.dll. Сначала сделайте все это, а потом задавайте свой вопрос.
Philippe Mori
Это недокументированная функция, поэтому вам не следует ее использовать. Если он работает в 32-битном режиме, то это может быть проблема с 32- или 64-битными границами, как описано в одном из решений, или может быть, что определение выше не совсем правильное (поскольку оно не из официальной документации, но обратный инжиниринг). Если информация недоступна в Интернете, то отладка кода сборки может быть единственным способом понять, что происходит. Также могут быть некоторые ограничения на то, кому разрешено вызывать эту функцию, и 64-битная среда также может быть строже, чем 32-битная. Наконец, поскольку это не задокументировано, возможно, функция даже не работает должным образом.