探索黑客技术攻防,实战研究与安全创新

导航菜单

入门级crackme算法分析

刚开始学习破解不久,就找了一些简单的crackme进行分析,在此就和大家分享一下我的学习心得!

首先使用peid载入crackme查壳,提示程序是使用Microsoft Visual C++ 6.0编写的,这倒省去脱壳的麻烦了。双击运行软件来收集相关信息,任意输入一个用户名,发现用户名少于四位时会出现提示,我们就输人大于四位的用户名(hackerxfiles),注册码就输入0123456789,结果又出现了错误提示信息。

u=2617850780,4263768406&fm=15&gp=0.jpg

好了,信息就收集到这儿,使用OD载入程序,在OD的反汇编区单击右键,在弹出的菜单中选择“查找”一“所有参考文本字符串”,可惜却没有找到刚才的错误提示信息。那我们就使用“bpxr”来看一下程序都调用了哪些函数,结果发现了GetDlgltemTextA函数,双击它就到达了调用处,发现有两个地方调用了GetDlgltemTextA函数,应该是获取用户名和密码的,而且在两次调用GetDlgltemTextA函数后就有个“call 00401340”,估计这就是计算密码的地方,我将断点移到004011E3处。



然后跟进下面的call,在走出这个call的过程中我发现了明码对比,0123456789就是我输入的假码,另一个字符串是11187,这个应该就是软件的注册码吧,试验了一下结果注册成功了。这样我们就追出了真正的注册码,下面就该进入今天的正题,算法分析以及编写注册机了。



在上面的代码中我已经做了详细的注释,现在我们就使用hackerxfiles这个用户名来分析一下算法的过程。首先将用户名的长度保存在edi(这里就是c)寄存器,然后比较,不足四位就跳转,这就是最开始时出现提示框的原因了。下面的“com eax,7”进入一个循环,输入的字符串从第四个起与一个含有八个元素的数组计算,当字符串从第四个起,超过八个时,又会与数组的第一个元素计算,一直重复下去,直至字符串全部都计算完。数组的八个元素依次是12、10、19、9、12、11、10、8,每个字符与数组元素相乘最后累加,例如我们输入的是hackerxfiles,则计算过程就是k*12+e*lO+r*19+x*9+f*12+i*11+1*10+e*8+s*12(各元素的asiic码)=11187。

注册机需要满足以下几个条件:

1、数组k为[12,lO,19,9,l2,11,10,8]

2、用户名至少4位

3、密码初始为0

4、从i=3开始到i=strlen(name),name[i]的ascl1值×k[(i-3)%8]加到密码中。