ღ Miranda

windows堆头结构的加密

测试程序

win7上调试堆的时候看到堆头会非常困惑,因为堆头看起来并不正常,测试程序如下:

环境为win7 32bit

调试分析

第一个块会被分配在002907d00x002907c8有8字节的HEAP_ENTRY结构,win7中堆头信息是加密的,看起来是这样的:

这时的HEAP_ENTRY显然是不正常的,其实从XP后,windows_HEAP结构体中新增了如下字段:

表示了是否加密_HEAP_ENTRY堆头信息,被加密后的堆头如果以结构体方式查看的话是:

显然不对,XP中这个结构体差不多是这样:

这个看起来很正常,Size之类的值也是正确的。

win7中堆头的加密秘钥在_HEAP结构偏移0x50Encoding字段:

这就是加密的秘钥,这个秘钥也可以用mona插件得到:

0x00290000处的堆头加密秘钥是0x3299cb38,尝试用秘钥解密堆头:

可以看出还原出了前4字节的头,注意小端序,2字节的Size0002,也就是16字节,因为第一次申请了8字节,加上8字节的头一共是16字节。

发表评论

电子邮件地址不会被公开。