用160Crackme之51体验算法的完美逆向 - 学习破解1周年纪念贴
本帖最后由 wanao2008 于 2021-3-16 21:06 编辑今天使用的软件是160Crackme之51:DueList.6.zip
既然是纪念贴,就不设置权限了。如果感觉不错,请给个赞!
前期一直在学习软件的爆破,最近开始研究算法,本着先易后难的原则,我选择用160Crackme来练手。
当练习到第51个程序时,发现它的算法非常独特,感觉除了汇编,没有任何一款编程语言能将它的算法做的这么的简洁、高效。
软件主界面,这里我们输入假码:12345678。
这时点击“Check”按钮,会弹出错误提示对话框,内容为“The activation code you entered is incorrect!”
有字符串的程序,一般我都选择搜索字符串,方法如下:
在OD的汇编窗口点鼠标右键/中文搜索引擎/智能搜索,就能找到错误提示字符串了,双击,来到代码处:
找到关键跳,NOP填充,成功爆破!
今天不讲爆破,只讲算法,继续,
很明显,算法CALL就是:
0040122A|.E8 1CFEFFFF call DueList_.0040104B
双击,进入CALL里,下断,跟踪,
首先来到判断输入的注册码必须为8个字符长度:
004011FE|.83F8 08 cmp eax,0x8
00401201|.74 24 je short DueList_.00401227
然后将输入注册码分为两部分,即前4位和后4位。
取它们的ASCII码如下:
前4位为:34333231
后4位为:38373635
这里补充说明一下吧:
其实被转成的“34333231”和“38373635”被当做循环次数使用了。而我们最终要求的就是正确的循环次数。
不理解就先往下看。
这时就来到了算法处,
这是前4位的算法:
下面是后4位的算法:
基本一样,只是使用的常量不同。
既然算法找到了,也知道怎么计算了,那就写逆向算法吧!
我试着用VB写了一下,感觉非常的繁琐,
因为汇编里的al,ax,eax非常的容易,到了VB编程语言里就得使用大量的函数才能做到,比如hex(),mid(),asc()等等,就不说了。
即然我们在学破解,那么为什么不做一次真正的逆向呢?
1、用汇编写算法
2、将程序倒过来执行,即原来最后执行的语句让它先执行,先执行的语句到最后
3、原来用常量1“0x36455544”通过算法得到常量2“0x4071885”,那么我们就用逆向算法由常量2得到常量1
4、关键字取反,记得刚吾爱汇编时的“74变75,84变85”吗?这次我们是“rol”变“ror”,“add”变“sub”,“dec”变“inc”
请看:
你品,你细品,你细细品。
是否品出些不同?
继续,先补全程序,做几个跳转,因为前期测试过,知道会有错误,就把跳转都补全了。
1、先将循环次数设为0,因为最终的答案就是循环次数
2、做一个找到正确值的跳转,并下断点
3、做一个找不到答案的跳转,并下断点
4、做一个结果不正确重新回到循环里继续运行的跳转。
前4位的算法做好了,那就开始计算吧,
虽然正常被断下,但意外还是发生了,
看最下,得到的字符根本没法输入,看来有问题啊!
幸好我们做了继续回到循环的跳转。
再次被断下,这次的应该正确了,得到字符串“isd4”,
下面开始更换常量,做后4位的算法:
断下后,看到了字符串“ever”,看来是正确的,
将两个字符串连在一起“isd4ever”,验证一下:
完全正确!!!!!
总结一下:
1、想要写这样的程序的方法,随便拖一个小程序到OD里,在OEP处写就行了。
2、要想反复执行一些代码,就做JMP跳转,跳到你想执行的地方。
3、做过逆向分析后你会发现,其实写汇编其实也不难。
本人嘴笨,不善言词,如果有没看懂的,欢迎回贴交流!
我要向你学习,我就喜欢看分析算法的帖子。 算法比爆破难多了,看着头大,向你学习。 虽然我们再学破解,为什么不做一次正真的逆向呢 好东西,感谢分享 好东西,感谢分享
多谢楼主的分享 [快捷回复]-学破解防逆向,知进攻懂防守! 学习大佬经验