在另一个进程中执行相同操作需要代码注入以执行相对于FS / GS的访问,或者知道某些关键数据项的平面地址,以便可以使用ReadProcessMemory()遍历进程信息结构。
什么是最好的 - 最稳定,最无记录的 - 完成后者的方式?万一重要,目前我最感兴趣的是访问TLS数据。
答案 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上测试。