1、CRACKME
程序用 MFC 编写,查壳,没壳。直接运行,输入注册码,注册错误,弹框显示错误信息。可见程序执行逻辑很简单,并且猜测弹框显示是调用了 MessageBox 函数。
用 IDA 打开,直接 F5 查看函数,发现在sub_4016E0 和 sub_401720 这两个函数里面都调用了 MessageBox 函数。
通过 IDA 的交叉引用功能,发现在.text:00401617 处调用了 sub_4016E0,往前翻可以看到很多信息,比如说对sub_401630 和 UpdateDate 函数的调用,以及.text:004015FB 和 .text:00401613 处的两个跳转。
于是猜测程序在这里通过UpdateDate 获取了注册码编辑框的输入注册码,然后先判断注册码长度是否为 0x21,接着在sub_401630 里面对注册码进行进一步验证,注册码正确则通过 sub_4016E0 弹出正确信息,错误则通过 sub_401720 弹出错误信息。
照这种思路,那么 sub_401630 验证函数就比较关键了,我们用 F5 查看如下:
可以知道,在函数里面对内存中的两处字符串进行了逐字符循环比较,这两处字符串应该就是我们输入的注册码和内存中的真码。在这里每一轮循环的种子和产生的随机数都是固定不变的,确保了正确的注册码的唯一性。
这时候就可以上 OD 调试了,在004015E0 处下断,输入任意长度为 0x21 的注册码,然后程序被断下。长度验证正确后单步进入 sub_401630,这时候在 00401669 处下断就可以观察到注册码的每一个字符了。