0x00前言
通过该实验了解逆向分析的一些技巧,能够通过winhex,PEID,OD,IDA等工具的一些熟练使用,达到事半功倍的效果。因作者能力有限,文章中可能存在错误,请读者批评指正。
0x01本文需要的工具
1、对本节课使用到的winhex的简单描述
Winhex是一款非常优秀的16进制编辑器,事实上,使用winhex单纯进行16进制编译在某些程度上有些大材小用,市场上很难找到像winhex一样功能强大的16进制编辑器。当然,它是收费的。本节课我们使用的是winhex的评估版本,可以满足需要。如果你想对winhex有更深层次的了解。
2、PEID
PEiD是一款著名的查壳工具,其功能强大,几乎可以侦测出所有的壳,其数量已超过470 种PE 文档的加壳类型和签名,新增加WinNT平台下的自动脱壳器插件,可以应对现在大部分的软件脱壳(包括PEiD自身的UPXS壳)!现在软件越来越多的加壳了,给破解带来非常大的不便,但是这个软件可以检测出 450种壳,非常方便!增加病毒扫描功能,是目前各类查壳工具中,性能最强的。
3、Ollydbg
Ollydbg通常称作OD,是反汇编工作的常用工具,将IDA与SoftICE结合起来的思想,Ring 3 级的调试器,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。基本上,调试自己的程序因为有源码,一般用vc,破解别人的程序用OllyDebug。
4、IDA重命名等功能
在IDA中,我们可以通过按下N键来对一个变量/函数/标记等进行重命名操作,函数和变量命名对于帮主我们理解程序的内部逻辑非常重要,就好比我们在编程的时候,培养良好的编程风格非常重要一样。
比如如果函数sub_4012E0经过我们分析之后,确定其功能为将传入的字符串转为大写形式,那么我们可以选中sub_4012E0后按下N键对其进行重命名(将函数名命名为fnStringToUpper):
IDA通过还可以给汇编指令或者伪代码来添加注释。如果要对某一条汇编指令添加注释,只需要在汇编指令所在行按下封号(即;)即可弹出对话框来接收注释;如果要给伪代码添加注释,则只需在伪代码所在行按下斜杠(即/)即可弹出对话框来接收注释。
0x02 实战步骤一
任务描述:使用winHEX搜索软件界面字符串修改并保存内容实现界面修改
一开始我们首先看看软件有什么内容可以修改,我们可以看到标题内容和消息框内容,其中消息框内容为“失败”而这个软件并没有判断是否成功那么我们就只可以通过修改内容实现成功。
打开winHEX,双击即可,然后拖入软件,我们可以看到很多的16进制,这里并不需要管他。
单击上面的搜索这时我们可以看到同步搜索继续单击
然后输入要搜索的内容的现在我们要修改的是消息框内的内容所以搜索“失败”
我们可以看到发现了35次而且是用16进制表示我们的“失败”
然后我们一样点单击上面的搜索,单击文本替换把失败替换成成功
可以看到搜索到35个“失败”并以16进制表示出来
然后继续单击上面的搜索在单击替换文本把失败替换成成功
替换后我们单击菜单栏文件,另存为然后打开软件看看是否修改成功
很明显是成功的!
0x03 实验步骤二
任务描述:通过winHEX的搜索找到软件的注册码
还是看看软件界面这次多了一个框,这个框就是验证内容,单击按钮出现失败消息框。这样就知道程序有一个判断,是否等于正确的注册码,如果输入正确就会跳出成功
继续拖入Hex 搜索消息框内容“失败”
成功搜索到16进制字符串
这时我们可以看到失败的上面一串数字
我们猜他就是判断的注册码了我们把他复制到程序看果然是正确的!
0x04 实验步骤三
认识各种流行压缩壳和加密壳
现在的软件一般都加壳,因为加壳可以防止软件被逆向,防止修改版权等等。壳也分2种壳,一种是压缩壳,一种是加密壳。压缩壳可以让程序的文件大小变小,加密壳则相反加密壳侧重在软件保护上。通常加密壳会将程序代码混淆加密,已达到防破解的目的.
目前流行的压缩壳有:UPX,ASP,ZP,等
而加密壳有:VMP,SE,TMD等
而我们怎么知道程序加壳了没有,加了什么壳呢?
这就要用了我们的查壳工具!现在一般使用的查壳工具有:exeinfoPE或者 PEID 。
这课重要的内容就是:如何查壳,如果没有查壳工具的情况下知道软件加了什么壳
我们看一下把已经加了UPX VMP 壳的情况下 PEID是怎么表示出来的
下面图UPX
这个可以清楚的看到下面的一个框已经明显的表示了软件加了UPX壳,加壳的版本也出现了!还有表示加壳UPX壳的地方就是上面的区段,基本上加密壳都不会出现在大框里面只会在区段中出现!(包括感染文件)
下面图VMP
这里我们就可以看到PEid的下面的框已经看不到是什么壳了!!这里我们只可以看区段判断是什么壳了!区段也很明显的显示了VMP壳!
PEID的使用例子就这么多那么如果我们没查壳工具怎么办呢?那么就要用到我们OD了
有壳没壳,看入口便知是啥壳。这句话说的没错!每个壳都一个入口点 (当然是随即的)
只要我们把软件放入OD就会停在一个地方 这个地方就程序的入口点了!
我们还是来看看 VMP和UPX的入口点
下图 UPX
基本每个加了UPX壳的 OD入口点都是这样的!
下图 VMP
这个是VMP的入口点!
0x05 实验步骤四
分析注册机
运行这个程序后要求输入一个用户名和密码进行注册,当注册失败的时候,程序将弹出一个消息框提示不正确,如图所示:
那么我们可以通过IDA的交叉引用功能来定位这一块的代码。使用IDA载入CrackMe.exe程序,待分析结束后,通过Imports TAB页面找到MessageBoxA,双击来到反汇编视图,在MessageBoxA按下X按键对其进行交叉引用查找,经过一个一个进行分析,我们发现sub_4016B0就是我们所要找的关键函数,我们通过F5得到这个函数的伪代码。通过对伪代码添加注释,以及对变量进行重命名操作,我们得到如下的代码片段:
上面的伪代码有两个错误,就是在第一个if语句中会判断密码的长度是否为33,如果不是33就弹出错误提示。其实这里是32(而用户名的长度则不能大于10)只是Hex-Rays Decompiler这个插件生成伪代码时出错了,所以需要记住,F5生成的伪代码并不保证完全正确。32这个长度对应汇编指令中的代码片段如下:
通过上面的伪代码的分析,我们发现只有sub_401510这个函数的功能并不清楚,通过双击sub_401510查看对应的伪代码,发现有点复杂,暂时无法理解,不过这并不要紧。
如果程序使用了标准算法进行处理,那么可以使用PEiD的Krypto ANALyzer进行快速识别,将CrackMe.exe载入PEiD,点击PEiD主界面右下角的“=>”按钮,选择“插件”菜单项,然后选择“Krypto ANALyzer”,就可以弹出Krypto ANALyzer插件了,Krypto ANALyzer提示程序使用了MD5算法,如下图所示:
我们记住00401E5C这个地址,在IDA的反汇编指令视图(IDA View)中按下G键,输入00401E5C,就会自动跳转到计算MD5的函数代码中,如图所示:
从这里并不能得到什么有用的信息,我们需要通过不断的回溯来理解程序的代码逻辑。通过往上查阅代码,我们知道00401E5C 位于函数sub_401D10之中,我们对sub_401D10进行交叉引用查找,如图所示:
可以从sub_401D10回溯到sub_4026F0,继续通过交叉引用往上回溯,依次为sub_4027B0、sub_401C00、sub_401BB0、sub_401510,而sub_401510就是我们在实验步骤一种为一个暂时不理解的函数。那么我们可以猜测sub_401510这个函数就是用来计算用户名的MD5值的,我们可以通过OD动态调试来验证我们的想法。
通过阅读IDA中的反汇编代码,我们知道在00401752处调用了sub_401510这个函数,
.text:00401752 call sub_401510
现在OD载入CrackMe.exe程序,在00401752处设置一个断点,然后按F9运行程序,用户名输入test,密码输入一个32个字符的任意字符串,单击“注册”按钮,程序便会自动断下,断下后按F8进行单步跟踪,执行sub_401510这个函数后,我们看到eax寄存器的值为098F6BCD4621D373CADE4E832627B4F6,这个恰好就是test的MD5值。
现在我们已经将程序的注册算法分析清楚了,下面就可以编写一个注册机了。程序的注册算法为:将用户名进行MD5计算得到一个哈希值,将哈希值转换为答谢字符串即可,其中用户名的长度在1~10之间,不能超过10.
Python内置了MD5算法,可以非常方便的计算MD5值,我们编写这样一段脚本即可:
import hashlib
while True:
username = raw_input("input username:")
md5 = (username).hexdigest().upper()
serial = md5[::-1] # 翻转字符串
print "serial: %s" % serial
我们输入用户名demo,就可以得到注册码为922E40A289C7DEAFAF8CABF7A2EC10EF,
输入程序可以成功注册,如图所示:
总结
本文我们通过使用常用的逆向分析分析,去解决一些小问题,而这些小技巧正是工作比赛中不可或缺的。希望大家可以多动手操作,熟练掌握工具的使用。但如果做出危害网络安全的行为后果自负,与合天智汇及本人无关,特此声明。