160个CrackMe-007

继前天做完006之后,又研究了一下007的Crackme,发现虽然有很多地方和006有相似之处,但是相对于006来说,007的算法过程更加复杂,而且相对来说更加隐蔽,下面就先来整理一下整个007算法的逻辑过程:
007的破解是:在输入正确的数据之后,让注册按钮消失,这个时候出现Again按钮,之后再输入正确的数据来让Again按钮消失。
具体的算法的逻辑过程;
1、判断输入的数据是不是纯字母,如果是生成一个key
2、重新输入数据,执行上一步判断,执行算法(再后面详细分析),隐藏按键
虽然在破解的过程中要求隐藏两个按钮,但是这两个按钮采用的逻辑和算法都是相同的,因此从这个方面来说,相对还是比较简单的。下面开始正式分析:
拿到程序,先运行一下:
在这里插入图片描述
可以看到,有帮助按钮,我们看一下关键的信息:
在这里插入图片描述
提示信息显示的是我们只有成功的隐藏了两个按钮之后才算破解成功,而这一切有个前提就是不能爆破。
接下来,我们查看一下程序本身的关键信息:
在这里插入图片描述
可以看到是Delphi的程序,直接上Delphi的反编译工具DarkDe:查看涉及到的控件的ID:
在这里插入图片描述
之后根据拿到的控件ID,到OD里边附加程序之后下断点(具体方法在006里边已经有过介绍,这里就不再赘述),当然我们这里是要用Register按钮的控件ID,之后下断点.
下好断点之后让程序,直接跑起来,输入数据之后(这里需要注意,在第一次输入数据的时候在Code一栏李斌输入的数据必须都为字母,原因后边会介绍),点击Register按钮即可来到我们下断点的位置:
在这里插入图片描述
既然到了我们下的断点处,接下来就要就行具体分析,但是在此之前我们必须清楚,这块代码段的大概功能是什么,这段代码段的功能就是隐藏Register按钮的.有这么一个大前提之后我们在深入研究一个大致的逻辑:
在这段代码段里边其实存在两部分算法,
在这里插入图片描述
下面我们进行详细分析,同时解答刚才的问题(为什么第一次输入的时候,要输入纯字母的数据):
在这里插入图片描述
执行到这一步的时候,会对输入的数据进行判断,是否是纯文本,可以进去看一下主要逻辑:
在这里插入图片描述
可以看到在输入的数据减去0x30之后和0x9进行比较,这个时候我们就要想到,数字的0-9正好对应的ASCII是0x30-0x39,在减去0x30之后再与0x9相比较,很明显是在判断该数据是不是纯字母。如果是纯字母的话,会输出,你必须输入正确的数据的弹窗,不必理会,直接Ok就好,下一步就是关键代码的地方:
在这里插入图片描述
如果第一次输入的数据都是数字的话则,程序不会运行至这一步,这样的话就会导致关键的key值无法生成,在执行关键的算法的时候就会出错,那么造成的直观结果就是,即使你输入了正确的数据,也不会隐藏按钮。接下来的工作就是,在生成这个key之后,把这个key值记录下来,方便在后面使用。之后再让程序运行起来(F9),之后再一次输入数据,这个时候要输入数字:
同样的流程,输入数据之后,点击Register按钮,程序会在同安用的位置断下来,就下来还会对数据进行判断,判断之后执行关键的算法部分:
在这里插入图片描述
关键的算法部分,是一个嵌套的循环,进行了两轮的操作,内循环的主要作用是求输入的字符串每一个字符串之间的乘积再乘之前得到的key值求和:用表达式来表示就是:
x+=s[1]*(s[1]+s[2]+s[3]+s[4]+s[5]+s[6]…)*key
外层循环的作用是,控制用来循环的乘数因子(也就是说第一次内循环的时候用s[1]做乘数因子,第二次内循环的时候用s[2]做乘数因子,以此类推)
最后其实总结来看算法最后实现的功能是:(输入的数据的每个数据的ASCII的和)的平方之后再乘以key。
在执行完内外层循环之后,用得到的数取余0xA2C2A,将得到的数据保存起来。
接下来的操作是,将输入的数据作为一个整数,用这个数的ASCII值除以0x59保存得到的商,再用这个数的ASCII除以0x50保存得到的余数,之后将第一次得到的商和第二次得到的余数相加再加1得到的结果与上边取余0xA2C2A得到的结果进行比较,如果相同,隐藏Register按钮,隐藏了Register按钮之后,Again按钮就会出现,接下来的工作就是隐藏Again按钮,同样的方法下断点之后,进行调试,方法与Register按钮的方法以及逻辑都一样,不再赘述。
至此,整个过程就完结了。同时还有一个注意的小点,就是大家的调试的时候,可以尝试一下,如果第一次输入全数字的 话会发生什么(这个时候,不会生成关键的key值,在进行关键的算法的时候,就会一直和0相乘),这样的话印象也更加深刻。相应的注册机的代码之后也会更新。
如果有什么写的不到位的或者有错的地方希望大家能够指出来,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值