反汇编定位release版本程序bug

时间:2021-11-17 00:57:29

 

今天帮忙调试了一个release版本的程序,此程序运行较长一段时间后终于(不挂就不好查了)挂了,系统报错是某处的指令访问了非法地址,显然是内存访问越界(不测试也能猜到,呵呵)。

点击系统报错对话框的cancel,进入vc6的反汇编调试模式,定位到指令所在的汇编代码,将此指令所在函数(函数以0x10对齐,结尾一般都有nop指令)的所有汇编代码拷贝出来分析。搜索cmp指令,运气比较好,汇编代码中的cmp指令中有一些特殊值,搜索特殊值定位到了程序的一个函数(运气又特别好,是定位到了一个函数,而不是多个函数)。

函数太长(500多行),只好继续分析,根据反汇编后的指令位置可以估计大概在此函数的2/3处有问题。结合c++代码和非法指令附近的asm代码,找到一个esp相关的临时量,可以肯定是函数内的栈上临时变量,这个变量在非法指令中×8,c++代码中有个POINT刚好大小就是8,非法指令中还+10h,于是可以猜测有这样一个POINT[i+2]操作越界。

分析完毕。

以前学asm主要是为了辅助理解系统、c/c++语言等,今天基本上是第一次用于查bug(我自己的程序基本上没多少bug,即是有我也能直接猜出来大概在哪,呵呵),感觉asm的知识所记不多,还是应该加强学习。