Я хочу получить начальный адрес потока с NtQueryInformationThread
, но мне нужно добавить его библиотеку. Как я могу это сделать?Как добавить ntdll.dll в библиотеки проектов с функциями LoadLibrary() и GetProcAddress()?
3
A
ответ
4
Я использовал 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));
5
Я предпочитаю добавлять ntdll.lib (вы можете найти его в Windows DDK/WDK) к проекту. В этом случае вам не нужен материал GetProcAddress.
Какие заголовочные файлы следует включать? THREAD_BASIC_INFORMATION не существует в Tlhelp32.h или Windows.h. – Mehrdad
Как я писал: вы должны включить заголовочный файл, содержимое которого я перечислил в pastebin. –
Попробуйте 'ntapi.h' (часть DDK) или просто определите себя. – Damon