Ay's Blog@CNSSUESTC

谁动了我的指针?--记一次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

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

posted on 2012-01-03 15:07 __ay 阅读(3800) 评论(3)  编辑 收藏 引用 所属分类: Debugging

Feedback

# re: 谁动了我的指针?--记一次windbg内存断点的使用 2012-01-05 09:33 zuhd

和楼主分享一下:
一般遇到这种需要下内存断点的调试,我可能会先检查代码,应该会有90%的概率是越界造成的,确定该内存是在堆还是栈,然后排查该变量上下的两个变量,基本都能找到,呵呵。请问楼主是UESTC的吗?  回复  更多评论   

# re: 谁动了我的指针?--记一次windbg内存断点的使用 2012-01-05 13:30 __ay

呵呵 你也是UESTC的?不过我已经毕业了
当然如果越界的时候能直接引发崩溃,那么看代码直接就能解决问题
但是在越界读写不引发crash,直到引用被覆盖的数据的时候才崩溃,如果这个时候代码中很难定位到被覆盖数据是什么时候写的,那应该用内存断点会比较好了@zuhd
  回复  更多评论   

# re: 谁动了我的指针?--记一次windbg内存断点的使用 2012-01-05 14:24 dourgulf

好经验分享,不错  回复  更多评论   



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理