2012-06-20 3 views

ответ

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)); 
+0

Какие заголовочные файлы следует включать? THREAD_BASIC_INFORMATION не существует в Tlhelp32.h или Windows.h. – Mehrdad

+0

Как я писал: вы должны включить заголовочный файл, содержимое которого я перечислил в pastebin. –

+0

Попробуйте 'ntapi.h' (часть DDK) или просто определите себя. – Damon

5

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

 Смежные вопросы

  • Нет связанных вопросов^_^