在开发过程中,我们经常会调用第三方库,当程序出了问题时,有时候崩在了第三方库内,问题就比较难查了,这个时候要找出原因,就需要我们有一定的逆向功底,因为一般第三方库的源代码我们是看不到的,只能通过反汇编的方法来查找。
近日,在某项目的开发过程中,遇到一个问题。我们一台服务器在运行过程中出现了几次崩溃,产生若干DMP文件。我们用windbg打开,设置符号路径,并加载符号。输入
!analyze -v,稍等片刻,windbg便输出了初步的分析结果。如下图所示:
其中FAULTING_IP显示了发生错误的那行代码,其汇编代码为:
cmp dword ptr [eax+14h], edi , 即将以eax为基址,偏移14h处的数值与edi比较。
紧接着这行代码的是EXCEPTION_RECORD这个结构体的信息,当异常发生的时候,系统会自动生成这么一个结构体,来记录异常发生时的信息。我们来看ExceptionAddress表示异常发生时那条指令的地址,图中为100057cb,ExceptionCode为异常代码,为c0000005,这个显而易见,是访问违例了。
NumberParameters是一个用于描述异常的附加参数的数组,对于不同类型的异常,有不同的解释。当异常类型为访问违例时,该数组的第一个元素包含了一个读写标志,表示引起访问违归的操作类型。如果这个值为0,表示线程试图读取不可访问的数据,如果这个值为1,表示线程试图写入不可访问的地址,如果这个值为8,表示线程引发了一个用户模式的DEP违规。数组的第二个元素指定了不可访问数据的虚拟地址。因此综合起来就是,试图读取00000014处的数据时,发生了访问违例。再结合之前的汇编代码,可以推断出根本原因是因为eax是0,那么接下来ÿ