Как добавить ntdll.dll в библиотеки проекта с помощью функций LoadLibrary() и GetProcAddress()?

Я хочу получить начальный адрес потока с NtQueryInformationThread, но мне нужно добавить его библиотеку. Как я могу это сделать?


person Mehrdad    schedule 20.06.2012    source источник


Ответы (2)


Я использовал NtQueryInformationThread без необходимости загрузки ntdll (который, по-моему, загружается автоматически). Мне оставалось только подготовить специальный заголовочный файл с таким содержимым: http://pastebin.com/ieEqR0eL и включить его в моем проекте. После этого я смог сделать что-то вроде этого:

NTSTATUS status;
THREAD_BASIC_INFORMATION basicInfo;
typedef NTSTATUS ( WINAPI *NQIT )( HANDLE, LONG, PVOID, ULONG, PULONG );

/* Open thread */
HANDLE thread = OpenThread(THREAD_ALL_ACCESS, false, threadId);
/* Get the address of NtQueryInformationThread function. */ 
NQIT NtQueryInformationThread = ( NQIT )GetProcAddress( GetModuleHandle(TEXT("ntdll.dll")), "NtQueryInformationThread" );
/* Get basic thread information */
status = NtQueryInformationThread(thread, 0, &basicInfo, sizeof(basicInfo), NULL);
CloseHandle(thread);

/* Get address of the Thread Environment Block, stack start address and last stack address */
tebAddress = (DWORD)basicInfo.TebBaseAddress;
DWORD pebAddress = *((DWORD*)(tebAddress+0x30));
/* For example to get stack base address */
stackBase = *((DWORD*)(tebAddress+4));
stackLimit = *((DWORD*)(tebAddress+8));
person Adam Sznajder    schedule 20.06.2012
comment
Какие файлы заголовков я должен включить? THREAD_BASIC_INFORMATION не существует в Tlhelp32.h или Windows.h. - person Mehrdad; 20.06.2012
comment
Как я уже писал: вы должны включить заголовочный файл, содержимое которого я указал в pastebin. - person Adam Sznajder; 20.06.2012
comment
Попробуйте ntapi.h (часть DDK) или просто определите сами. - person Damon; 20.06.2012
comment
@Yob Итак, как я могу получить начальный адрес из статуса? - person Mehrdad; 20.06.2012
comment
Используя информационный класс ThreadQuerySetWin32StartAddress вместо ThreadBasicInformation. Вы можете прочитать об этом на ntinternals.net. - person Damon; 20.06.2012
comment
В качестве второго параметра функции NtQueryInformationThread вы должны указать ThreadQuerySetWin32StartAddress. Его описание находится здесь: undocumented.ntinternals.net /UserMode/Недокументированные%20Функции/. Пример использования: forum.sysinternals.com / - person Adam Sznajder; 21.06.2012

Я предпочитаю добавлять в проект ntdll.lib (его можно найти в Windows DDK/WDK). В этом случае вам не нужны вещи GetProcAddress.

person Sergey Podobry    schedule 20.06.2012