///////////////////////////////////////////////////////////////////////////////////////////////////
文件名称:逆向动态调试分析“基于MFC对话框(非文本框)程序”时,定位主程序代码开头的方法
目标程序:由VC++ 6.0 MFC类库框架编写的对话框程序
操作环境:Windows XP-SP2
使用工具:Ollydbg 1.10版
编写作者:Coderui
编写时间:2008年01月08日
联系方式:coderui@163.com
作者博客:http://hi.baidu.com/coderui
==================================================================
前言:
目前网络上流传的程序有一部分是使用VC++ 6.0(MFC)开发编写而成的,当然木马病毒也占据着一定的数量。了解MFC框架的朋友都知道它是一套功能比较强大的封装类库,在编程时可能会给程序员带去一定的方便性。但进行逆向工程反汇编动态调式分析MFC编写的程序时,就显得比较麻烦了。因为在反汇编出来的代码中,有非常多的代码都是由MFC封装类库产生的,而不是由程序作者编写出来的,这些代码严重干扰着我们的分析。所以我们在逆向分析由MFC编写而成的程序时,就需要跳过所有由MFC类库生成的代码,直接跳到作者编写的代码中去调试分析有价值的代码。
说明:
今天所讲的内容比较适合用在调试分析木马病毒上,大家都知道病毒运行后,是不需要点击什么按钮就可以直接运行,这也就表示病毒作者把程序代码的启动调用都加在了初始化函数上,一般为“InitInstance”和“OnInitDialog”函数。但为了开发方便,一般使用居多的都是“OnInitDialog”函数,所以我们的突破口就在这里,在下文讲解了详细的定位方法。
用途:
使用到这种技术的理由有两个。
第一个是:在调试分析由MFC编写的程序时,可以不去看类库框架生成的代码,直接定位到关键代码处,会节省很多的时间。
第二个是:获得由MFC编写程序的开头代码处,这样就可以知道作者最开始在初始化程序时都做了些什么。分析病毒时是必要使用这种技术的,如果不能准确的定位到这个地址上,就不知道病毒第一步做了什么,然后接着做了什么,最后做了什么,分析清楚工作顺序是非常重要的。
==================================================================
第一启动函数“InitInstance”:
这个一般很少使用,所以这个就不做说明了,等以后需要时我再给大家加上。
-----------------------------------------------------------
第二启动函数“OnInitDialog”:
方法一:(作者:Coderui)
对“SendMessageA”函数下断(这种方法相对简单些,还不容易出错),然后[Alt+F9]返回主程序领空,当我们执行过两个“SendMessageA”函数以后,会看到在“SendMessageA”函数下边不远处有一个CALL(特征:这个CALL所调用的是主程序的代码,也就是说所执行的代码需要在主程序领空。切记:是“SendMessageA”函数下边最靠近的第一个CALL,并且如果CALL调用的是其它领空代码的不算。),然后我们执行到这个CALL上,再[F7]跟进去,进去后的代码就是这个程序最开始运行的功能代码了(作者编写的代码)。
方法二:(作者:Coderui)
对“73D4A873”地址下断点(在这里下断会跟的更详细些),这个地址一般固定(如下:“$ ==> 73D4A873 #4710_?OnInitDialog@CDialog@@UAEHXZ 8BFF MOV EDI,EDI”),然后[Alt+F9]返回主程序领空,当我们执行过两个“SendMessageA”函数以后,会看到在“SendMessageA”函数下边不远处有一个CALL(特征:这个CALL所调用的是主程序的代码,也就是说所执行的代码需要在主程序领空。切记:是“SendMessageA”函数下边最靠近的第一个CALL,并且如果CALL调用的是其它领空代码的不算。),然后我们执行到这个CALL上,再[F7]跟进去,进去后的代码就是这个程序最开始运行的功能代码了(作者编写的代码)。
==================================================================
总结:
其实,在调试由MFC编写的木马病毒时,想定位到程序第一步(只要定位出第一步,后边的按照顺序就很好跟了)执行了什么真不是件很容易的事,我为这个苦恼了很久。在网络上没搜索到什么结果(貌似我搜索能力很差,呵呵),后来只能去自己慢慢的调试找寻规律了,大概用了2到3个小时的时间,终于搞定了,呵呵。个人感觉想准确定位MFC程序中,作者的代码最先执行了什么真的不是件容易的事(相反由汇编和C语言直接编写的程序会容易调试些)。MFC类库封装出来的东西是绝对可以难住新手去进行详细的逆向调试分析的,因为它在启动初始化程序时(初始化对话框、初始化消息响应循环等等)所使用的代码都是跳到MFC的动态连接库中去执行的,里边还用到了消息响应循环,想得到程序被初始化后返回主程序代码领空的地址,真的不容易。不了解的朋友一般在单步调试分析由MFC编写的程序时,都是在系统的函数(DLL)中跑来跑去,根本回不到主程序的领空上,一着急程序就跑飞了,这样调试危险的病毒时是件很郁闷的事。估计我上边所写的方法会有一些朋友看不懂,大家慢慢理解吧,多实际调试几次就明白原理了。以前的前辈们所总结的类似文章网络上一定应该是存在的,可能我只是没找到。本文总结的方法是我自己想出来的,希望对需要的朋友们有些帮助。
==================================================================
///////////////////////////////////////////////////////////////////////////////////////////////////
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课