heilongwang 发表于 2020-10-22 00:08

适合新手的160个crakeme--001(算法)

160个crakeme系列--001


前言:上个帖子没有算法部分,在这补充,上个帖子地址:https://www.52pojie.cn/thread-1283093-1-1.html (出处: 吾爱破解论坛)]适合新手的160个crakeme--001 https://www.52pojie.cn/thread-1283093-1-1.html (出处: 吾爱破解论坛)


之前说到有两个跳转会导致弹出错误框,我们看第一个跳转,观察附近call功能

mov eax,
call 406930
看上去这个函数参数传入一个全局变量
我们跟随看看函数代码



看到 repne scas 这条命令可以知道这是一个计算字符串长度的函数
mov edx,edi                           
mov edi,eax                     
mov ecx,-1h                              
xor al,al                     
repne scas byte es:       ;遍历edi指向的字符串,每次ecx-1,直到遇到al中的字符,这里为0,即字符串结尾符号
mov eax,-2h
sub eax,ecx                        ;因为之前计算的长度会算上结尾符号,所有这里用-2相减,即-1- (-1-(len+1)) -1 = -2 -(-2-len) = len
mov edi,edx
retn


我们f8运行这个函数

看到eax长度为1,可是我们输入的是‘123’,我们看看指向的字符串是什么



可以看到指向的字符串为ascii码10 对应的字符,长度为1
看上去不是计算我们输入的字符串的长度,我们输入 12345,678910,试试

看到eax为我们输入的用户名,可以确定此处限制了用户名的长度必须大于等于4
但为什么之前输入 123时计算的却是 另外一个字符串呢,我们往上看看是否有调用这个全局变量的函数

看到这里将eax即用户名放入全局变量,此处 local.4 为ebp-10 ,local.4为od添加的标识,我们看运行下面的函数观察 全局变量和ebp-10的变化


可以看出此处将用户名使用局部变量存储,全局变量改变了,我们研究的是序列号算法此处就不看了。
现在我们看下一个跳转
输入12345,6789跳过第一个call

不难看出此处正确的序列号已经生成为,“CW-4018-CRACKED”
该函数为比较序列号的函数我们输入 12345,“CW-4018-CRACKED”,看序列号是否正确

可以确定序列号就是“CW-4018-CRACKED”,说明序列号在之前就生成了,我们往上观察


看到熟悉的字符串,而且很多函数调用了局部变量,根据函数最后运行结果,这些局部变量存储了关键的字符串,
我们从0042fa79开始看,此处为第一个call跳转处且调用了局部变量


第一个call调用ebp-10,和一个整数值

eax返回5,ebp-10没有变化
可能也是一个计算长度的函数,继续往下看
0042FA87|.8B45 F0       mov eax,                                       ;将用户名存入eax
0042FA8A|.0FB600      movzx eax,byte ptr ds:                        ;取第一个字符
0042FA8D|.F72D 50174300 imul dword ptr ds:            ;为29h,将第一个字符乘以29h结果存入edx:eax
0042FA93|.A3 50174300   mov dword ptr ds:,eax          ;
0042FA98|.A1 50174300   mov eax,dword ptr ds:          ;因为edx为0,取结果放入
0042FA9D|.0105 50174300 add dword ptr ds:,eax         ;结果*2 结果为fb2即4018
接着向下看



可以看到403708传入ebp-4和字符串CW两个参数
运行后,ebp-4变为CW
403708应该是一个字符串赋值操作

接下来是将 CRACKED 赋值给ebp-8
接着是将 ebp-4(CW)和’-‘压栈

下面一个函数传入 ebp-18,以及 ,之前压栈的 ebp-4(CW)和’-‘未出栈,所以不是此函数的参数
运行后ebp-18变为“4018”此处应该是将整数转换成对应字符串

接着是三个压栈指令
并传入 ebp-c,5运行后出栈5个参数说明之前压栈的 ebp-4(CW)和’-‘未此函数的参数
运行后ebp-c存储着正确的序列号
紧接着是 41aa58函数 这个函数有点弄不懂,不过不影响
到此就到了第二个call指令处了 。
所以序列号算法为 ‘CW-’ + 用户名第一个 数*29*2+’-CRACKED‘

注册机 。。。。。省略

如果有错误或者建议,希望各位大佬指点。

    闲话:荒废了好久,以后尽量每天花点时间来练习并发帖,希望今年能将这160系列弄完,emmm发现汇编好难学啊,看完16位又要看32,还要看64。emmm


tt0202 发表于 2020-10-22 19:13

适合新手的160个crakeme--001(算法)太全面了谢谢楼主的分享   很实用

norakura 发表于 2020-10-22 00:36

牛逼 学习方便多了!

tt0202 发表于 2020-10-22 01:39

讲解的很细致谢谢分享

xicheying 发表于 2020-10-22 06:46

谢谢楼主,学习了

whngomj 发表于 2020-10-22 08:22

谢谢楼主,学习了

deityso 发表于 2020-10-22 08:24

涨知识了。高手

taotianc 发表于 2020-10-22 08:50

膜拜。。最近学习破解感觉要奔溃

jokony 发表于 2020-10-22 09:02

好专业啊,,看不懂 哈哈

tatu2010 发表于 2020-10-22 09:05

好像很厉害的样子 赞一个

ghy197674 发表于 2020-10-22 09:11

谢谢楼主
页: [1] 2 3 4
查看完整版本: 适合新手的160个crakeme--001(算法)