谁动了我的指针?--记一次windbg内存断点的使用

谁动了我的指针?--记一次windbg内存断点的使用

 

写驱动的时候有个地方老是蓝屏,看了dump发现数据被非法篡改了.

数据初始化如下

 

if(record_set_ptr != NULL )
{
    record_set_ptr->look_aside_pool_ptr = g_user_control_context.look_aside_pools[type] ;
    record_set_ptr->type = type ;
    record_set_ptr->buffer_size = notify_count * unit_size_of ;
    record_set_ptr->units_count = notify_count ;
    record_set_ptr->complete_count = 0 ;
}

然后在调用ExFreeToNPagedLookasideList传入record_set_ptr->look_aside_pool_ptr 的时候挂了,发现record_set_ptr->look_aside_pool_ptr已经被改了.

 

为了跟踪数据在哪里被修改了,先在数据初始化的地方下断,然后记下record_set_ptr->look_aside_pool_ptr 的地址:0x85c16018

对这个内存下个断点

1: kd> ba w4 85c16018

w表示在写入时断下,4表示监控范围,单位是字节 

整个命令的意思就是让调试器在系统写入内存85c16018-85c1601b这个地址范围的时候中断

OK,命令下完,F5一下就立马断下来了

1: kd> g
Breakpoint 3 hit
nt!memcpy+0x33:
8053b583 f3a5            rep movs dword ptr es:[edi],dword ptr [esi]


此时edi的值: 0x85c16018

 

最后看一下函数堆栈,发现是字符串拷贝越界覆盖了后面的数据.... 

后面又想到,出错时record_set_ptr->look_aside_pool_ptr 的值是0x005c0065

这么明显的字符串特征竟然没意识到....一看出错值就应该知道是字符串覆盖造成的.....

你可能感兴趣的:(谁动了我的指针?--记一次windbg内存断点的使用)