今天继续跟着tree_fly大神写的Hopper系列的视频,学习第二章节的内容。
CrackMe样本是在 http://reverse.put.as/crackmes/ 上下载的,本文练习使用的是MSJ2009#2.zip
(SHA1(MSJ2009#2.zip)= 47685aab5f43c064e4b24903f868df1100461ed7)
一、试用
打开软件,要求输入用户名、邮箱和序列号。
二、分析软件
跟上一篇文章类似,通过关键词或关键方法,我们来到verifyRegistration
首先判断了字符串是否为空,不为空进入下一个isValid判断
这里截取了字符串的index 4和index 9的值并和0x2d比较。通过查表发现0x2d是一个短横线,那么就是字符串的第5位和第10位需要是“-”符号。
那么这里取的是哪个字符串可以通过调试看一看。
三、反调试
当我们在进行调试的发现,调试起不来,因此程序存在反调试的代码。从入口开始看,最后发现在main中有ptrace检测,这是一个很常见的反调试方法。
来到汇编代码,把这一行nop掉即可。
之后运行调试,可以发现程序已经能被成功调试了。
四、动态调试
继续分析上面的isValid函数,前面我们不清楚获取的是哪个字符串的值,因此在这里下个断点,运行调试。
输入一些内容进去,然后点击注册。
看一下具体的eax值,调试窗口中输入po $eax
这里的eax值跟我们输入的序列号是一致的,也就是说序列号的第5位和第10位需要是“-”,即格式为xxxx-xxxx-xxxx。
五、校验算法
pass掉上面后,我们来到最终的校验逻辑的地方。
首先是判断arg_8的长度为0xe(14位),arg_10的长度大于3。改变一下序列号的输入内容,加上“-”符号。
接下来还是用调试的方法,先下断点,然后查看到arg_8是序列号的值,因此也就确定了序列号为14位。(上面输入时不小心蒙对位数了)
点击这个按钮可以直接运行至当前选中的行
还是老方法,查看arg_10为邮箱的值,也就是邮箱的长度需要大于3。
接下来看第一个循环,逻辑上并不复杂,我们尝试通过调试获取到该值-v24。
第一串值为:1264
同理看第二个循环,能得到第二串的值:6416
最后我们可以看到,分别判断了var_24, var_38, var_34的值。这里的substringWithRange仍然是有点问题,需要到IDA里查看。但我们直接通过调试的方法获得。
调试后,获取到的第三串值为:6434
所以最终得到的序列号为1264-6416-6434,带入原程序试验一下。
关注微信订阅号获取更多
网友评论