-
-
[旧帖]
[求助]关于win2k下堆结构的疑问
0.00雪花
-
发表于:
2014-7-12 11:08
2894
-
[旧帖] [求助]关于win2k下堆结构的疑问
0.00雪花
这是我在看0day第二版第五章时的疑问。
书里说占用态堆块结构的前4个字节表示了它的大小,也就是1,2字节表示了堆块有几个单位,3,4字节表示一个单位有几个字节。我按照书里这一个程序做实验:
#include<windows.h>
main()
{
HLOCAL h1,h2,h3,h4,h5,h6;
HANDLE hp;
hp = HeapCreate(0,0x1000,0x10000);
//__asm int 3
h1 = HeapAlloc(hp,HEAP_ZERO_MEMORY,3);
//__asm int 3
h2 = HeapAlloc(hp,HEAP_ZERO_MEMORY,5);
__asm int 3
h3 = HeapAlloc(hp,HEAP_ZERO_MEMORY,6);
//__asm int 3
h4 = HeapAlloc(hp,HEAP_ZERO_MEMORY,8);
h5 = HeapAlloc(hp,HEAP_ZERO_MEMORY,19);
h6 = HeapAlloc(hp,HEAP_ZERO_MEMORY,24);
__asm int 3
HeapFree(hp,0,h1);
HeapFree(hp,0,h3);
HeapFree(hp,0,h5);
HeapFree(hp,0,h4);
}
第一个分配,也就是h1,很正常,它的块首是这样:
02 00 08 00 00 01 0D 00
也就是说大小是16字节,已使用13字节(剩余正好是3字节)
但是从第二个开始就很奇怪了:
02 00 02 00 00 01 0B 00
02 00 02 00 00 01 0A 00
02 00 02 00 00 01 08 00
04 00 02 00 00 01 0D 00
04 00 04 00 00 01 08 00
看起来只有堆块单位数是对的,但是每单位字节数是错的。但是我用heapsize都能得到想要的大小(3 5 6 8 19 24)
请问是我理解错了块首那个size那里吗?还是什么问题?
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课