thuyphuongid Ответов: 1

Спросите о 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-битная. Наконец, поскольку это не задокументировано, возможно, функция даже не работает должным образом.

1 Ответов

Рейтинг:
1

Rotted Frog

Звучит глупо, но вы пытаетесь пересечь границу 32-бит/64-бит? Если вы пытаетесь внедрить поток из 32-битного процесса в 64-битный процесс, это не удастся. Вам нужно будет скомпилировать как 64-битную версию, если это так, и все будет работать.