我在procexp中看到一些具有起始地址kernel32.dll+0x106e9
的线程,在解析符号后,我得到了地址:kernel32.dll!BaseThreadStartThunk
我想枚举系统中的所有线程并使用此起始地址打印线程,但是当我尝试获取BaseThreadStartThunk
的地址时,通过:
PVOID BaseThreadStartThunk_addr = GetProcAddress(LoadLibrary(L"Kernel32.dll"), "BaseThreadStartThunk");
我回来0
如何获取BaseThreadStartThunk()
的地址?
答案 0 :(得分:1)
GetProcAddress是解析EAT(导出地址表)的实现,此函数尝试在EAT中查找名称或序号,然后从模块库获取delta函数,并将此delta添加到模块库中。
如果“BaseThreadStartThunk”不是导出符号,则GetProcAddress无法获取它。
你可以:
使用pdb符号获取解析名称并从模块库中获取delta(每台PC上需要加载符号的互联网)
创建“BaseThreadStartThunk”的二进制签名并在内存中找到它
使用“kernel32 version”,“function delta”创建表 - 为每个版本的kernel32制作硬编码增量到func
使用反汇编程序查找函数的地址 - 我认为,这是最好的方法