moshengdada 发表于 2022-4-26 20:46

记录一下 160个适合新手的crackme--6(追码)

本帖最后由 moshengdada 于 2022-4-27 07:43 编辑

运行环境:
如 WIN10
涉及工具:
OD,DarkDe4
教程类型:
算法分析
是否讲解思路和原理:


以下为图文内容:
‘适合逆向新手的160个crackme练手’ 下载链接:https://wwi.lanzoup.com/i2mwH03tvomf

这个CM的目的是使按钮隐藏 因为之前做过爆破所以就简单的记录下先将软件拖入DEDE 然后看到了一个CancellaClick事件

载入OD直接去它的段首下断(因为我知道将Cancella隐藏后也会激活OK按钮,所以就不用CodiceChange事件和NomeChange事件来使OK按钮可用了)
Ctrl+G 转到段首

下断然后直接点按钮Cancella 程序断下

开始单步看到有一个je跳过了jmp我们直接吧je nop掉就可以了 因为这个事件里就这一个跳

nop掉后继续单步经过这个call后看到按钮上的字已经消失了

继续单步 经过00442F07这个call时ok按钮被激活了

那我们直接运行按钮成功隐藏 OK按钮也可以用了
接下来就可以去OK按钮的事件段首下断,然后也是同样的爆破法就可以把OK按钮也隐藏掉了
这里先略过 因为我们的目的是追码

或者进入算法call直接给al赋值1 然后直接retn也可以完成爆破


开始追码
继续再Cancella按钮事件的段首下断
这次我们打上用户名和注册码再点击Cancella按钮
断下后我们到刚刚标记上的算法call去看看(F7),因为从这个算法call里出来后会给al一个返回值,如果al是0 je就跳转 如果是1je就不跳转

F7进入后单步分析
在00442B1B这个call获取了用户名长度 下面接着跟了一个cmp eax,0x5 判断我们的用户名是否小于5 如果小于5就直接跳向失败

过来第一个长度判断就开始正式开始了
开始获取用户名,取用户名的第5个字符
第五个字符是‘u’ ascii码值是0x75

开始eax ÷ ecx0x75 ÷ 0x7

运行之后它将商赋值给了eax 将余数赋值给了edx

可以算一下


又将计算后的余数(5)赋值给了eax 看来是要取余数

然后余数+2

然后将余数+2的结果进行阶乘(7的阶乘)

13B0就是5040的16进制

然后它将我们阶乘之后的结果又赋值给了esi
又进行了个判断用户名长度是否等于0(我不知道为什么还要再判断一次呢?第一个不都判断我们的用户名大于5了吗)

进入了一个循环 开始取我们的用户名来进行计算了
M的ascii码值是6D

然后6D乘以刚刚余数的阶乘结果 然后就是将这个结果进行累加
eax自减1 eax(用户名长度)的值就是我们的循环次数
因为它要将我们的用户名全部单个取出来然后进行相同的计算
然后进行累加

出了循环再看ebx的值,这就是我们最后累加的结果

最后再将这个结果减去一个 0x7A69就是注册码了

至此我们就分析完了注册码了总结一下
1、先判断我们输入的用户名是否大于5
2、取第五个数的ascii码值然后除以7 取出余数
3、将余数进行阶乘
4、挨个取出我们的用户名的ascii码然后乘以阶乘的结果 最后将所有的结果进行相加
5、将第4步的记过减去0x7A69 得出最后的注册码
这时候我们就可以写出注册码的注册机了

a=input('Nome:')                  #输入用户名
x=1                                 #阶乘用
y=0                                 #累加用
if len(a) > 5:                      #判断是否大于5
    b=int(ord(a))%7+2            #取余数
    for i in range(1,b+1):          #阶乘
      x*=i                        #阶乘
    for n in range(0,len(a)):       #挨个循环字符串
      y=y+x*int(ord(a))      #将所有的结果进行累加
b=y-31337                           #减去0x7A6910进制就是31337
print(b)                            #打印最终的注册码

我们将生成的注册码实验一下
成功了 Cancella按钮消失了 Ok也被激活了

接下来我们来看OK按钮的事件
先去ok事件的段首下断

输入用户名和正确的注册码(如果是不正确的注册码OK就不会被激活 就无法断下)

开始单步 经过上次的经验我们很快就找到了算法call
F7进去

单步跟 发现它取了我们的注册码 然后又是判断大于5

因为有些和上面的几乎一样我就跳过解释了 看注释把

倒着取了最后一个数3

然后将这个数的ascii码进行平方运算

将平方后的结果乘以了注册码的长度

将上一步计算好的结果除以0x19 然后将商给eax 将余数给edx


将求出的余数加上0x41

然后将上一步的结果找到ascii码值对应的ascii

然后将我们的注册码长度减一(*注意 这里的减一影响了我们的注册码乘以平方的值 的结果)

循环结束后eax的值为正确注册码推算出来的正确用户名

至此我们的OK也分析完成了
总结一下
1、判断我们的注册码长度是否大于5


2、从后开始取注册码
3、将取出的ascii码进行平方运算
4、将平方运算后的结果乘以注册码长度(第一次是注册码长度 第二次是注册码长度-1 以此类推)
5、将第四步的结果除以0x19 进行求余数
6、将求出的余数 + 0x41 然后将最终的ascii值转成字符
7、从后向前累加出真正的用户名
这时候我们又可以写注册机了

a=input('Nome:')                  #输入用户名
x=1                                 #阶乘用
y=0                                 #累加用
if len(a) > 5:                      #判断是否大于5
    b=int(ord(a))%7+2            #取余数
    for i in range(1,b+1):          #阶乘
      x*=i                        #阶乘
    for n in range(0,len(a)):       #挨个循环字符串
      y=y+x*int(ord(a))      #将所有的结果进行累加
b=y-31337                           #减去0x7A6910进制就是31337
print(a,b)                        #打印用户名 注册码
b=str(b)                            #将注册码变成str型
c=b[::-1]                           #从后向前索引
z=0                                 #每次循环都减1
f=''                              #最后累加用
for q in c:                         #挨个循环
    d=(ord(q)**2*(len(b)-z))%25+65#挨个求出经过运算的ascii码值
    z+=1                            #循环一次就减一
    f+=chr(d)                     #将ascii码相对于的字符累加进f
print(f[::-1])                      #从后向前读取最后的用户名


最终验证一下

我是真的挺菜的哈哈,也就是这个简单点,没有技术含量(我本来就也没有) 大佬们就当我是赚点HB买虚拟机就好了哈哈哈



YLa3 发表于 2022-4-26 20:46

感谢楼主

bQSkjiZKq 发表于 2022-4-26 20:48

好啊好啊~这不错~感想分享~

gLNw7 发表于 2022-4-26 20:48

谢谢分享

yRAEnGO34 发表于 2022-4-26 20:54

回复,顶帖,赚币,谢谢楼主

vDyxMg0629 发表于 2022-4-26 20:54

谢谢分享

IPGVh84539 发表于 2022-4-26 20:59

膜拜大神!

YME8 发表于 2022-4-26 21:00

谢谢分享

gesq32957 发表于 2022-4-26 21:00

大佬无敌

AjI9634 发表于 2022-4-26 21:01

感谢楼主
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 记录一下 160个适合新手的crackme--6(追码)