今天终于有空把破文写下,其他的一部分也会补上
该样本没有用反调试手段,所以直接就可以冲着算法去
首先,找到GetDlgItemText下断点得到输入的数据,下面就是验证函数1120,如下图
接着看下MessageBox看到,其是在另一个验证函数13B0中的调的,我们再看回1120中发现并没有分支到达这里,这就值得我们注意,然后打开ida看下引用发现其是放在异常处理中的,那思路就清楚了
作者的验证算法分2段,前面部分验证完后制造异常进入异常处理接着验证,最终如果验证成功则弹框显示
接下来的工作就是找到异常处理了,我们看到1111地址这里是个除法,这就值得注意是不是会产生除零异常呢,我们用OD产生一下试下,果不其然调用了异常函数,如下图
这个跳转手动改为je
ecx手动改为0
到达异常处理
而前面9个字节就是运算后产生除零异常用,所以我们可以把前9个字节做个筛选算法找到解的集合
样本算法首先为和9个字节常量做异或然后减去一个0x41运算,然后再看结果是否为下标从0到8是递增关系,最后再将这些值统一算个乘法等于0xD4C2086就会除法除0异常
附件中附上了我的筛选算法,算出有3个解的集合,分别为pediy2016,qejjy2016,qgeiy2016
选个比较顺眼的"pediy2016"进入异常处理内部
发现这里做了不少混淆,我们可以借助内存断点来辅助我们输入数据测试,发现地址3ABD是验证长度的必须是20个字节,如下图
ecx是输入字符长度,edx是验证长度
然后又发现下标9-13位必须是cool1(在3D1F处验证),那整个注册码就缺七位了,我们可以hook整个代码来穷举后面6位了,穷举算法我放在dll里面
我是在开头加载dll,如下图
然后1349地址的call换成jmp,跳到我的处理穷举函数这里,如下图
最后弹框验证成功, 531223
PS:附件中为筛选算法cpp,编译下跑下前9位的集合就出来了,有3个满足条件的解
pediy2016cool1531223验证成功
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课