0:000> dds 0x042f4dcc042f4dcc 00000000042f4dd0 00006001042f4dd4 000d0000042f4dd8 78aba8b0 verifier!AVrfDebugPageHeapAllocate+0x240042f4ddc 77e0ef8e ntdll!RtlDebugAllocateHeap+0x39042f4de0 77d76150 ntdll!RtlpAllocateHeap+0xf0042f4de4 77d757fe ntdll!RtlpAllocateHeapInternal+0x3ee042f4de8 77d753fe ntdll!RtlAllocateHeap+0x3e042f4dec 00ad1690 ConsoleApplication1!main+0x30 [D:\net6\ConsoleApp1\ConsoleApplication1\DisplayGreeting.cpp @ 14]042f4df0 00ad1bc3 ConsoleApplication1!invoke_main+0x33 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 78]042f4df4 00ad1a17 ConsoleApplication1!__scrt_common_main_seh+0x157 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288]042f4df8 00ad18ad ConsoleApplication1!__scrt_common_main+0xd [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 331]042f4dfc 00ad1c48 ConsoleApplication1!mainCRTStartup+0x8 [D:\a\_work\1\s\src\vctools\crt\vcstartup\src\startup\exe_main.cpp @ 17]042f4e00 7646fa29 KERNEL32!BaseThreadInitThunk+0x19042f4e04 77d975f4 ntdll!__RtlUserThreadStart+0x2f042f4e08 77d975c4 ntdll!_RtlUserThreadStart+0x1b...接下来再回答一个问题 , 页堆的堆块有没有头部附加信息呢?当然是有的,叫做 DPH_BLOCK_INFORMATION,即在 UserPtr-0x20 的位置,我们可以用 dt 显示一下 。
0:000> ?? sizeof(ntdll!_DPH_BLOCK_INFORMATION)unsigned int 0x200:000> dt ntdll!_DPH_BLOCK_INFORMATION 056e5ff0-0x20 +0x000 StartStamp : 0xabcdbbbb +0x004 Heap : 0x056e1000 Void +0x008 RequestedSize : 9 +0x00c ActualSize : 0x1000 +0x010 FreeQueue : _LIST_ENTRY [ 0x0 - 0x0 ] +0x010 FreePushList : _SINGLE_LIST_ENTRY +0x010 TraceIndex : 0 +0x018 StackTrace : 0x042f4dcc Void +0x01c EndStamp : 0xdcbabbbb ...根据上面两个输出,在脑海中应该可以绘出如下图:
文章插图
这里要稍微解释下 栅栏页 的概念 。
4. 栅栏页每一个 heap_entry 都会占用 8k 的空间,第一个 4k 是用户区,第二个 4k 是栅栏区,为了就是当代码越界时访问了这个 栅栏页 会立即报错,因为栅栏页是禁止访问的,我们可以提取 UserAddr 附近的内存,看看 056e6000= 056e5000+0x1000 后面是不是都是问号 。
0:000> dp 056e5ff0056e5ff0 c0c0c0c0 c0c0c0c0 d0d0d0c0 d0d0d0d0056e6000 ???????? ???????? ???????? ????????056e6010 ???????? ???????? ???????? ????????056e6020 ???????? ???????? ???????? ????????056e6030 ???????? ???????? ???????? ????????056e6040 ???????? ???????? ???????? ????????056e6050 ???????? ???????? ???????? ????????056e6060 ???????? ???????? ???????? ????????0:000> !address 056e5000+0x1000Usage: PageHeapBase Address: 056e6000End Address: 057e0000Region Size: 000fa000 (1000.000 kB)State: 00002000 MEM_RESERVEProtect: <info not present at the target>Type: 00020000 MEM_PRIVATEAllocation Base: 056e0000Allocation Protect: 00000001 PAGE_NOACCESSMore info: !heap -p 0x56e1000More info: !heap -p -a 0x56e6000Content source: 0 (invalid), length: fa000
推荐阅读
- [CG从零开始] 6. 加载一个柴犬模型学习UV贴图
- [CG从零开始] 5. 搞清 MVP 矩阵理论 + 实践
- 华为如何查看手机屏幕厂商_华为如何查看手机屏幕供应商
- Java并发编程 | 从进程、线程到并发问题实例解决
- 从缓存入门到并发编程三要素详解 Java中 volatile 、final 等关键字解析案例
- [CG从零开始] 4. pyopengl 绘制一个正方形
- [CG从零开始] 3. 安装 pyassimp 库加载模型文件
- 网购的兔子怎么养(从小摊买的兔子怎么养)
- 企业运维 | MySQL关系型数据库在Docker与Kubernetes容器环境中快速搭建部署主从实践
- 如何0到1构建DevOps?