W32内存溢出或者越界调试方法

使用 GFlags打开完全页堆块结构

GFlags是windows debug tools 工具包下的一个工具,在Windows 2000的Resource Kit中也可以找得到。用来设置一些调试属性,总体上分为3个级别System, Kernel, 和 Image File。

我们设置好Path环境变量,将其指向Debug tools工具的目录下。

输入如下命令行:

gflags -p /enable test.exe /full /unaligned


完全页堆块结构

链接:http://msdn.microsoft.com/zh-cn/library/ms220938%28v=vs.80%29.aspx


在启用完整页堆块时,将使用保护页并且将立即捕获缓冲区溢出/不足,因为在溢出/不足时程序将出现访问冲突。这些故障很容易调试,因为当前堆栈跟踪直接指向中断的代码。如果采用普通页堆,或者出于对齐的原因在缓冲区末尾的小填充图案中出现损坏,则只有在释放了该块的情况下才可以检测出损坏。在这些情况下,需要更为复杂的检测技术。为简化在此类情况下进行检查的过程,页堆管理器在所有分配(完全或常规)前都放置了一个头。该头包含几个重要的信息位(用于在某些情况下分配的拥有的堆、用户请求的大小和堆栈跟踪)。下面将介绍完全和常规页堆块的结构。

常规页堆块结构

完全页堆块结构

信息块具有以下结构:

DPH_BLOCK_INFORMATION

ULONG         StartStamp;

PVOID         Heap;

SIZE_T        RequestedSize;

SIZE_T        ActualSize;

LIST_ENTRY    FreeQueue;

PVOID         StackTrace;

ULONG         EndStamp;

Heap 字段存储拥有的堆。块的用户请求的大小以 RequestedSize 为单位。堆栈跟踪地址存储于 StackTrace 字段中。

StackTrace 字段将不是始终包含用于各种原因的非空值。首先,只有在 x86 平台上才支持堆栈跟踪检测;其次,即使在 x86 计算机上,堆栈跟踪检测算法也并不完全可靠。如果该块是一个已分配的块,则堆栈跟踪将针对分配那一刻。如果该块已被释放,则堆栈跟踪将针对释放那一刻。



然后,没有然后了,打开以后在发生越界时应该能抓第一现场了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值