记录一下 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买虚拟机就好了哈哈哈
感谢楼主 好啊好啊~这不错~感想分享~ 谢谢分享 回复,顶帖,赚币,谢谢楼主 谢谢分享 膜拜大神! 谢谢分享 大佬无敌 感谢楼主