另一个进程中TEB的平面地址?

时间:2015-01-29 11:38:56

标签: windows systems-programming win32-process win64

通过访问相对于FS / GS的TIB(如NtCurrentTeb()和TLS函数),可以轻松找到当前进程的TE32,PEB等Win32系统结构。

在另一个进程中执行相同操作需要代码注入以执行相对于FS / GS的访问,或者知道某些关键数据项的平面地址,以便可以使用ReadProcessMemory()遍历进程信息结构。

什么是最好的 - 最稳定,最无记录的 - 完成后者的方式?万一重要,目前我最感兴趣的是访问TLS数据。

1 个答案:

答案 0 :(得分:1)

Matt Pietrek在2004年8月的“Under the Hood”专栏Reading another process's environment提到 NtQueryInformationProcess() 功能。

对于信息类0(ProcessBasicInformation),它返回一个包含指向PEB的指针的结构。该函数附带一些健康警告,它不包含在Windows SDK的标准导入库中,但<winternl.h>中提供了它的声明,因此可以正确键入GetProcAddress()的结果。

Google Code上名为utility.cpp的文件演示了如何使用 GetThreadSelectorEntry() 获取给定线程中给定选择器的选择器库。通过GetThreadContext()可以获得段寄存器的实际值,这允许它将分段的用户空间地址解析为线性地址,以便与ReadProcessMemory()一起使用。这些函数是核心调试器支持的一部分,因此可靠地可用。

WOW64增加了一些小的曲折(Wow64GetThreadContext()等),但没有严重的并发症。

在XP,Windows 7和Windows 8.1上测试。