SuperAPI AI 工具集

windbg-user-heap-corruption-investigation

通用与其它

查看项目

更新于 10-16 00:32

技能介绍

本技能适用于应用、服务或用户态驱动宿主(如 UMDF 宿主进程)出现堆失败,或 Application Verifier 检测到损坏时使用;不适用于内核池问题。使用前若未加载 windbg-diagnostic-method,应先加载并全程应用其证据排序、假设检验、置信度校准与报告验证方法。

检测信号包括 STATUS_HEAP_CORRUPTION(0xC0000374)、Application Verifier 停止,以及堆 allocate/free/reallocate 路径失败。分配器内部崩溃可能只是更早错误写入的首次暴露,而非出错操作本身。需区分损坏与分配失败,后者应改用 windbg-user-virtual-memory-exhaustion。分配/释放历史取决于进程插桩方式与已捕获页面,历史缺失是局限,不能证明泄漏或释放后使用。

工作流分四步。一、解码停止:使用 .exr -1、.ecxr、!analyze -v、k,记录停止原因、损坏块、损坏地址及检测到损坏的操作;若验证器停止帧有参数或局部符号,用 .frame /r <frame> 后查 dv,否则依据捕获输出与文档化停止定义,不要假定固定参数布局。二、恢复块历史:!heap -p -a <address> 用于 Page Heap 分配,!avrf -hp -a <address> 搜索可用的 Application Verifier 堆操作历史;可用 !heap -? 与 !avrf -? 确认扩展支持;未插桩转储可能无法恢复写入者信息;如有分配与释放栈则一并捕获,并确认地址位于用户分配内部而非头部或相邻块。三、检验竞争性解释:针对释放后使用、双重释放、越界写、野写、分配/释放契约不匹配等假设,分别寻找对应证据;用 db <address> L<size> 查看字节并结合访问处反汇编,填充模式与疑似指针只是线索而非因果证明,需与源码、历史或复现关联,追踪所有权转移。四、必要时获取更强证据:经用户批准,对指定测试可执行文件启用完整 Page Heap:gflags /p /enable target.exe /full,重启进程并在调试器下复现;Application Verifier 堆检查也可为该测试程序配置;操作前说明内存开销、时序变化与可能的主动停止,记录并恢复原有设置,若本次新启用则用 gflags /p /disable target.exe 关闭;未经批准不得更改现有应用的验证策略。若有用户态 TTD 跟踪,可用 windbg-user-ttd-reverse-debugging-triage 定位相关修改或释放。

修复模式:用所有权类型或显式获取/释放规则落实真实生命周期契约,仅当设计确有多所有者时使用共享所有权;共享状态需单独同步,shared_ptr 所有权不保证并发修改的缓存或所指对象线程安全;为缓冲区确定大小并检查算术、长度与终止符,适当使用边界感知容器;跨 DLL/API 边界保持分配与释放兼容。

验证:确定受影响块与受支持的损坏类别,指出违反边界或所有权的路径,区分检测者与写入者;在相同插桩与相关并发/负载下验证修复;写入者历史未解决时应如实报告,不得将猜测的修复当作已证结论。反馈按 FEEDBACK.md 执行并发送至 WinDbg-Feedback,注明 windbg-user-heap-corruption-investigation 与 plugin.json 中的包版本,不自动上传转储、源码或记录。