注册

CpuDbg x96

查看: 928|回复: 0
收起左侧

64位程序NtQueryInformationProcess获取PEB不对的问题

[复制链接]
发表于 2023-6-11 14:33:02 | 显示全部楼层 |阅读模式
我在测试的时候,发现在64位系统中,编译32位的调试器,调用 NtQueryInformationProcess 获取 PEB的基址总是错误的,
如下代码:

[Asm] 纯文本查看 复制代码
0:000:x86> !peb
PEB at 0000000000337000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            Yes
    ImageBaseAddress:         0000000000400000
    Ldr                       00007ff8056653a0
    *** unable to read Ldr table at 00007ff8056653a0
    SubSystemData:     0000000000000000
    ProcessHeap:       00000000004d0000
    ProcessParameters: 00000000004d3ca0
    CurrentDirectory:  'C:\Windows\'
    WindowTitle:  'Z:\Code\Code_2020\OllyDBG\Debug Demo\TraceMe.exe'
    ImageFile:    'Z:\Code\Code_2020\OllyDBG\Debug Demo\TraceMe.exe'
    CommandLine:  '"Z:\Code\Code_2020\OllyDBG\Debug Demo\TraceMe.exe"'
    DllPath:      '< Name not readable >'
    Environment:  00000000004d1120


peb基址明明是 0337000, 而调用 NtQueryInformationProcess 获取到的确是 0338000.
获取到的基址和实际的基址总是相关一个分页的大小(0x1000).

在网上搜到一个回答:

0x1000.png

而上面说win8又开始失效了.而win8中的1分页也改成2分页了.

win8.png

以后有机会再细测这些吧.
暂时就先这样用着...
-------------------------------------------------------------------
2023.06.15
这两天又阳了, 一直不在状态,一个断链写了几天还没写好...
现在已经搞清楚了, 在64系统中,32位进程会有两套PEB.
32位和64位的PEB偏移正好相差 0x1000.
如果cpudbg是64位的, 则使用 NtQueryInformationProcess 或者 GS:[0x60] 获取的PEB是64位的.
相反如果cpudbg是32位的, 则使用 NtQueryInformationProcess 或者 FS:[0x30] 获取的PEB是32位的.
在使用64位调试器里, 要想使用32位的 PEB 只需将得到的 PEB 加上 0x1000 即可.如下:

[C++] 纯文本查看 复制代码
pbi.PebBaseAddress = (PPEB)((DWORD64)pbi.PebBaseAddress+0x1000);


这里需要注意的是, 如果是64位程序, 再获取32位进程的LDR,有部分使用指针类型的,在64位程序上是8字节的, 因此需要重定义.
或者因为偏移不一致,得到数据看上去可能是凌乱不匹配的.
-------------------------------------------------------------------
end...


回复

使用道具 举报

游客
回复
您需要登录后才可以回帖 登录 | 注册

QQ|Archiver|手机版| CpuDbg x96

GMT, 2024-4-29 15:30 , Processed in 0.109375 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表