如何获取kernel32.dll的内存地址!BaseThreadStartThunk?

时间:2014-07-11 12:37:18

标签: c++ memory-address

我在procexp中看到一些具有起始地址kernel32.dll+0x106e9的线程,在解析符号后,我得到了地址:kernel32.dll!BaseThreadStartThunk

我想枚举系统中的所有线程并使用此起始地址打印线程,但是当我尝试获取BaseThreadStartThunk的地址时,通过:

PVOID BaseThreadStartThunk_addr = GetProcAddress(LoadLibrary(L"Kernel32.dll"), "BaseThreadStartThunk");

我回来0

如何获取BaseThreadStartThunk()的地址?

1 个答案:

答案 0 :(得分:1)

GetProcAddress是解析EAT(导出地址表)的实现,此函数尝试在EAT中查找名称或序号,然后从模块库获取delta函数,并将此delta添加到模块库中。

如果“BaseThreadStartThunk”不是导出符号,则GetProcAddress无法获取它。

你可以:

  1. 使用pdb符号获取解析名称并从模块库中获取delta(每台PC上需要加载符号的互联网)

  2. 创建“BaseThreadStartThunk”的二进制签名并在内存中找到它

  3. 使用“kernel32 version”,“function delta”创建表 - 为每个版本的kernel32制作硬编码增量到func

  4. 使用反汇编程序查找函数的地址 - 我认为,这是最好的方法