×

Crackme-03

96
D4rk3r
2017.12.04 20:55* 字数 628

拿到exe,首先用peid查壳吧

检测发现没壳,而且是用vb写的,那么来运行一下先,运行过程中发现程序会先在下面这个画面等待一会才会到达Crackme界面

然后界面跟第二个Crackme是差不多的,唯一的区别就是叫我们要先kill the Nag 再去找key,那么Nag应该就是运行程序时等待的那个界面

那么首先来kill the Nag吧,由于之前没弄过这种,在网上学习了师傅们的wp,发现一款反编译vb的工具:VBExplorer (可以到看雪工具下载:https://tools.pediy.com/windows/decompilers.htm),用VBExplorer打开exe,选到CMSplash,然后看到有个Timer函数,在属性那里选择Timer1 timer观察到有个变量Interval的Timeer1值是 7000,我们知道Interval是间隔的意思,所以我们可以大胆猜测这个就是表示开头Nag运行的时间间隔

那么我们只需要修改这个7000为0就可以让Nag不显示了

修改后再运行可以发现Nag已经被我们Kill掉了

接下来上od分析注册机算法,跟上一篇一样查找字符串,观察汇编语言

可以看到这里的逻辑跟Crackme-02有点类似,都是用test si,si 和je语句来判断Serial是否正确

再往上看点,可以发现这里出现了我们输入的Serial和正确的Serial,推测前面应该会有生成正确的Serial算法,虽然已经可以知道注册码了,但是为了深入研究注册码生成的算法,继续调试

在函数开头下个断点,一步一步慢慢调试

调试到这里,发现对Name进行了一系列操作,用len(name) * 0x15b38 + Name第一个字符的ascii码得到一个十六进制数,再调用算法1

而算法1的核心函数在这里,算法1的主要作用就是将16进制数变成十进制,比如0xa变成10

总结上面函数的作用就是len(name) * 0x15b38 + Name 生成一个十进制数

然后对刚刚的十进制数+2

再*3然后-2

最后再+15

最后运算出来的结果就是我们最终的Serial

根据算法写注册机脚本

name = "123"
a = len(name) * 0x15b38
a += ord(name[0:1])
a += 2
a = a*3-2 + 15
Serial = a
print "Serial: ",Serial

成功了

Web note ad 1