本文主要使用吾爱破解版OllyDBG对VS编译的C++程序进行反汇编分析
Ollydbg从以上网站选择“吾爱破解专用版Ollydbg.rar”下载
参考书籍是钱林松,赵海旭著《C++反汇编与逆向分析技术揭秘》(第一版)
笔者是刚开始学习逆向的小白,如有错误还望诸位大神不吝赐教
一、先写一个简单的C程序
这里创建了一个控制台应用,写了一个简单的for循环语句进行累加。
注意因为吾爱破解版Ollydbg只支持32位的,所以在红色画线的部分要改为x86,另外建议把Release改为Debug
以上修改都完成之后选择本地调试器的空心三角生成对应的exe程序
随后在项目的文件夹中会出现Debug文件夹,打开文件夹后有一个以项目名命名的exe。这个exe是我们待会放在Ollydbg里分析的对象。(项目名\Debug\项目名.exe)
二、打开Ollydbg
按照吾爱破解专用版Ollydbg压缩包里的使用说明完成路径修复,然后打开吾爱破解[LCG].exe
左上角选择文件——打开,选中刚才生成的exe文件
此时会同时生成程序窗口和加载汇编代码
程序窗口记得一定不要关,先最小化放在一边
Ollydbg基本操作介绍
以下是从吾爱破解论坛找的Ollydbg快捷键的介绍(原文:破解入门(二)-----认识OllyDBG - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn)
下图两个按钮中左边两个三角是重新运行程序,右边叉号是清空窗口,回到刚打开文件时全黑的状态。
(就像打幽灵行者的时候会摁烂R键一样,以后会有无数遍重新运行的……)
F5键可以切换界面,变化为一个窗口占据整个屏幕或者多个窗口层叠排列
(在前文一个窗口占据整个屏幕时可以通过F6来切换显示窗口)
三、程序分析
不同的程序有不同的分析目的,前文写的程序的最重要的主体是for循环语句(也是唯一有意义下手的地方)故我们本次分析的主要目标就是找到for语句在哪里执行。进一步我们可以在仅有exe文件的基础上对一个执行程序进行修改。(但是本文暂不包括修改的部分,因为笔者还没学会)
穷举找主函数
对于新手来说比较直接且比较笨的一个办法就是,直接把程序中所有的call语句都进去看一遍……
F8可以执行单步步过,在遇到call语句的时候换成F7步入,然后一直运行到retn语句返回上一层(或者出现死循环的时候可以通过Ctrl+F9返回上一层)
尽管这不是一种应该被提倡的方法,但是笔者确实通过这种遍历的过程加深了理解……
关于主函数的特征此处引用另一篇博客的内容
笔者个人总结规律如下,不完全适用(可能对于复杂的程序会完全不适用)列出来只是觉得实战时可以这般总结经验
在遇到以下语句之前只需要F8单步步过,直到到达这些语句进入执行操作
jmp for_test.mainCRTStartupr_initialize_mtapachdled >pper (F7/F8)
call for_test.__scrt_common_mainrt_uninitialize_criticalhar>>::sentry::operator booly_base(F7)
call for_test.__scrt_common_main_sehr,std::char_traits<char> >::_Sentry_base::~_Sentry_base(F7)
call for_test.invoke_main_slow_path_check_os_handled >pper(F7)
(这里会有一个call语句,就是前面主函数特征中紧挨着三个mov和push语句的call语句)(F7)
jmp for_test.mainept_handler4_noexcepte_modetfaillength(F7/F8)
在单步步过时还要注意中间可能出现的黄底红字标识的跳转语句(jmp/jnz/je等等),可能摁着F8就不小心把该步入的call语句步过了……
根据教材上的说法对比,可以明确地发现红框里的代码就是for循环的代码了
善用搜索引擎
以上是普适的笨办法,相对而言效率更高的方法就是使用自带的搜索引擎搜索出现过的字符。
前面编写的程序,在结尾有一个很明确的输出字符串“累加结果为”的语句。或者在刚才笨办法找出来的代码里,可以很明确地看到右侧注释区有一个“累加结果为”。
不难确认这是一个在主程序里执行的语句。通过搜索引擎可以检索出字符串及所在位置
在代码区域右键,选中“中文搜索引擎——智能搜索”
这是检索结果
有很多结果,但是不难发现“累加结果为”的那一行
如果查出来的字符串极多,可以右键Find检索特定字符串
在Find框里输入检索词
如果想找的结果正好在首位,右键“Find Next”找下一个就行
另外检索词尽量不要输入完全的字符串,因为在程序中有时看起来连贯的字符串可能其实是几部分拼起来的,输入完整的反而导致可能搜不到。
总之我们找到了这条关键的字符串对应的语句,直接双击就会跳转到它在代码中的位置。
我们无论如何找到了for循环在代码中对应的位置,在对应段落单步步过的时候,也会发现很明显地循环了程序里对应的次数。
至此,我们的分析任务告一段落。
在写这篇的时候萌生了下一篇利用Ollydbg修改破解的思路,不过何时实现……就让笔者先挖个坑吧