首先从PEID的算法剖析插件来介绍,要知道不管是在CTF竞赛的REVERSE标题中,仍是在实践的商业产品中,很多程序都喜欢运用成熟的规范算法来作为注册算法的一个部分,如MD5、Blowfish等。这些算法本身往往就十分复杂和难以你理解,假如从反汇编指令来阅览这些算规律更是难上 加难。关于规范算法,实践上咱们并不需求知道这些算法的详细核算过程,咱们只需求知道是哪一个算法即可,由于规范算法网上都能找到成熟的库文件或许源码等。
PEiD有一个叫做Krypto ANALyzer的插件,运用这个插件能够对程序进行扫描,经过特征匹配来辨认程序内部或许用到的一些规范算法。Krypto ANALyzer的运用方法为:点击PEiD主界面右下角的“=>”按钮,挑选“插件”菜单项,然后挑选“Krypto ANALyzer”,就能够弹出Krypto ANALyzer插件了。Krypto ANALyzer插件会自动剖析程序内部或许用到的规范算法,如图所示:
下图中显示了程序中在地址00401E5C处存在MD5算法的特征:
除了要知道这些插件呢,还有一些小技巧,在IDA中,咱们能够经过按下N键来对一个变量/函数/符号等进行重命名操作,函数和变量命名关于帮主咱们理解程序的内部逻辑非常重要,就好比咱们在编程的时分,培养良好的编程风格非常重要相同。
比方,假如函数sub_4012E0经过咱们剖析之后,确定其功用为将传入的字符串转为大写方式,那么咱们能够选中sub_4012E0后按下N键对其进行重命名(将函数名命名为fnStringToUpper):
IDA还能够给汇编指令或许伪代码来增加注释。假如要对某一条汇编指令增加注释,只需求在汇编指令所内行按下封号(即**; )即可弹出对话框来接纳注释;假如要给伪代码增加注释,则只需在伪代码所内行按下斜杠(即 /**)即可弹出对话框来接纳注释。
OD也能够给汇编指令增加注释,只需求在汇编指令所内行后一列的空白处双击鼠标左键即可,如图所示:
咱们来看试验吧,相同进入试验链接[《CTF REVERSE练习之算法剖析》](www.hetianlab.com/expc.do?ec=… wemedia)。
好好看下试验描绘,
主机C:\Reverse\4目录下有一个CrackMe4.exe程序,运转这个程序的时分会提示输入用户名和注册码进行注册,当输入正确的用户名和注册码时,会弹出成功提示的消息框,请对CrackMe4.exe程序进行逆向剖析和调试,尝试编写一个注册机程序。
首先运转这个程序后要求输入一个用户名和暗码进行注册,当注册失败的时分,程序将弹出一个消息框提示不正确,如图所示:
那么咱们能够经过IDA的穿插引证功用来定位这一块的代码。运用IDA载入CrackMe4.exe程序,待剖析结束后,经过Imports TAB页面找到MessageBoxA,双击来到反汇编视图,在MessageBoxA按下X按键对其进行穿插引证查找,经过一个一个进行剖析,咱们发现sub_4016B0便是咱们所要找的要害函数,咱们经过F5得到这个函数的伪代码。经过对伪代码增加注释,以及对变量进行重命名操作,咱们得到如下的代码片段:
上面的伪代码有两个过错,便是在第一个if语句中会判断暗码的长度是否为33,假如不是33就弹出过错提示。其实这里是32(而用户名的长度则不能大于10)仅仅Hex- Rays Decompiler这个插件生成伪代码时出错了,所以需求记住,F5生成的伪代码并不保证完全正确。32这个长度对应汇编指令中的代码片段如下:
经过上面的伪代码的剖析,咱们发现只有sub_401510这个函数的功用并不清楚,经过双击sub_401510查看对应的伪代码,发现有点复杂,暂时无法理解,不过这并不要紧。
咱们来用PEID的算法辨认运用PEiD的Krypto ANALyzer进行快速辨认,将CrackMe4.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载入CrackMe4.exe程序,在00401752处设置一个断点,然后按F9运转程序,用户名输入test,暗码输入一个32个字符的任意字符串,单击“注册”按钮,程序便会自动断下,断下后按F8进行单步盯梢,执行sub_401510这个函数后,咱们看到eax寄存器的值为098F6BCD4621D373CADE4E832627B4F6,这个刚好便是test的MD5值。
用东西便是为了帮咱们把复杂的工作变得简单起来,咱们算法剖析完之后就能够直接把标题解了,咱们来编写一个注册机了。程序的注册算法为:将用户名进行MD5核算得到一个哈希值,将哈希值转换为答谢字符串即可,其间用户名的长度在1~10之间,不能超过10.
Python内置了MD5算法,能够非常便利的核算MD5值,咱们编写这样一段脚本即可:(代码坐落C:\Reverse\4\Keygen.py)
import hashlib
while True:
username = raw_input**( “input username:” )**
md5 = hashlib**. md5 ( username ). hexdigest (). upper ()**
serial = md5**[::- 1 ] #** 翻转 字符串
print “serial: %s” % serial
咱们输入用户名Wins0n,就能够得到注册码为51F561458ADAEEBA43A57CF7E59F6CC.4,输入程序能够成功注册,如图所示: