共计 568 个字符,预计需要花费 2 分钟才能阅读完成。
Crackme014 的逆向分析
1. 程序观察
因为只是一个一星的程序,所以是一个很简单的,只有一个序列号的程序。
2. 简单查壳
无壳,使用 VB 编写。
3. 程序分析
使用 OD 载入程序,搜索字符串
可以看到先前报错时,所提示的语句。
双击跟进程序。
在错误的字符串上方,有一个循环。
循环的最开始,会进行一个比较。若是比较结果符合某个条件,会跳转到正确的提示代码处。
在循环的上方,还有一处关键的代码。
程序先得到所输入序列号的长度,如果不为 9,则跳转到错误提示。
所以序列号的程度应该是 9 位。
然后程序建立循环,就是上面那一张图上的大循环。
循环次数是 9,也就是序列号的位数。
然后程序将循环的次数,与 0x2 做异或运算
循环的最后,程序将计算出来的值和我们输入的序列号作比较
因为程序是单个单个进行比较的,所以循环要进行 9 次,一次不符合就会跳转到错误提示处。
这样我们就可以通过计算得到正确的序列号
第一位:1 xor 2 = 3
第二位:2 xor 2 = 0
第三位:3 xor 2 = 1
第四位:4 xor 2 = 6
第五位:5 xor 2 = 7
第六位:6 xor 2 = 4
第七位:7 xor 2 = 5
第八位:8 xor 2 = 10
第九位:9 xor 2 = 11
这时候或许就有疑问了,最后两个计算出来的是两位数,怎么办呢?
可以看到,程序计算出来值之后,是取所得值右边的一位,所以最后的序列号是:301674501
相关文件在我的 Github
正文完