如何在Windows中获取线程起始地址?

逆向工程 视窗 线 进程黑客
2021-06-29 02:01:10

我正在模块中编写线程查找器。我的目标是找到进程中的所有线程并找到当前工作地址位置的线程。喜欢下面的图片。我使用 NtQueryInformationThread API 来实现这个目标。

在此处输入图片说明

我正在搜索所有网络,我发现了一些代码片段。我编译并运行我的程序,但线程起始地址始终为 0x00000 或 0xccccc。我哪里做错了?我的线程起始地址查找器功能在这里:

#define ThreadQuerySetWin32StartAddress 9

typedef NTSTATUS(WINAPI* NTQUERYINFOMATIONTHREAD)(HANDLE, LONG, PVOID, ULONG, PULONG);
DWORD WINAPI GetThreadStartAddress(__in HANDLE hThread)
{
    NTSTATUS ntStatus;
    DWORD dwThreadStartAddr = 0;
    NTQUERYINFOMATIONTHREAD NtQueryInformationThread;

    if ((NtQueryInformationThread = (NTQUERYINFOMATIONTHREAD)GetProcAddress(GetModuleHandleA("ntdll.dll"), "NtQueryInformationThread"))) {
        ntStatus = NtQueryInformationThread(hThread, ThreadQuerySetWin32StartAddress, &dwThreadStartAddr, sizeof(DWORD), NULL);
    }

    return dwThreadStartAddr;
}
1个回答

就像我评论过的那样,这个函数记录在 Winternl.h 中,您可以使用 ntdll.lib 与起始地址链接,因为指针在 x64 中需要 8 个字节

#include <windows.h>
#include <winternl.h>
#include <stdio.h>

int main(void)
{
    ULONG64 Tinfo = 0;
    ULONG retlen = 0;
    NTSTATUS ntqitret = NtQueryInformationThread(GetCurrentThread(), (THREADINFOCLASS)9,
    &Tinfo, sizeof(PVOID), &retlen);
    printf("START  = %I64x\nret    = %x\nretlen = %x\n",Tinfo, ntqitret, retlen );
}

编译、执行、比较

:>cl /Zi /W4 /analyze /Od /EHsc /nologo ntqit.cpp /link /release ntdll.lib
ntqit.cpp

:>ntqit.exe
START  = 7ff73b0d1434
ret    = 0
retlen = 8

:>cdb -c "x ntqit!*maincrt*;q" ntqit.exe | awk "/Reading/,/quit:/"
0:000> cdb: Reading initial command 'x ntqit!*maincrt*;q'
00007ff7`3b0d1434 ntqit!mainCRTStartup (void)
quit: