如何在WinDBG中从用户态程序崩溃转储解析RtlDecodePointer?
如何模拟RtlDecodePointer解码崩溃转储中的编码指针
核心原理
RtlEncodePointer 和 RtlDecodePointer 的本质是编码指针与进程TEB(线程环境块)中的随机Cookie值进行异或运算。解码的核心就是找到目标进程的EncodePointerCookie,再用它和编码后的指针执行异或操作。
具体操作步骤
1. 获取目标进程的TEB地址
崩溃转储中每个线程都对应一个TEB,可通过线程上下文寄存器定位:
- 32位程序:从线程
Context结构读取SegFs寄存器值,该值即为TEB地址(32位系统下FS段基址指向TEB)。 - 64位程序:从线程
Context结构读取GsBase寄存器值,直接得到TEB地址。
2. 从TEB中提取EncodePointerCookie
TEB中EncodePointerCookie的偏移是固定的:
- 32位系统:TEB地址 +
0x18 - 64位系统:TEB地址 +
0x30
以WinDbg为例,可直接用命令读取:
- 32位:
dd teb_address+0x18 L1 - 64位:
dq teb_address+0x30 L1
返回的数值就是解码所需的Cookie。
3. 执行异或运算解码指针
拿到编码指针和Cookie后,直接执行异或操作:
解码后的指针 = 编码指针 ^ EncodePointerCookie
比如在WinDbg中,若编码指针为0x1A2B3C4D,Cookie为0xD4C3B2A1,执行命令:
? 0x1A2B3C4D ^ 0xD4C3B2A1
输出结果就是原始未编码的指针。
注意事项
- 每个进程的
EncodePointerCookie是独立生成的,跨进程的编码指针不能混用Cookie解码。 - 崩溃转储必须包含完整的进程内存和线程上下文,否则无法读取TEB及Cookie。
- 同一进程内所有线程的TEB中Cookie值一致,任选一个线程的TEB即可获取。
内容的提问来源于stack exchange,提问作者Codeguard
相关产品推荐
相关产品推荐

