CrackMe第三题追码+注册机
本帖最后由 growuphappily 于 2020-2-23 19:26 编辑0x00 前言
最近真的没有什么帖子好写了,在无意中发现了这个:
https://www.52pojie.cn/thread-709699-1-1.html
于是我就打算每天做一道CrackMe的题目
第一题:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1107523
第二题:https://www.52pojie.cn/forum.php?mod=viewthread&tid=1107888
第三题:https://www.52pojie.cn/thread-1108487-1-1.html
第四题:https://www.52pojie.cn/thread-1109140-1-1.html
第五题:太变态了,算了
第六题:https://www.52pojie.cn/thread-1111030-1-1.html
第七题:https://www.52pojie.cn/thread-1112318-1-1.html
第八题:https://www.52pojie.cn/thread-1113163-1-1.html
第九题算法:https://www.52pojie.cn/thread-1114003-1-1.html
第九题爆破:https://www.52pojie.cn/thread-1113295-1-1.html
0x01 正文开始
打开程序就看到了一个Nag:
去Nag参考这篇文章:http://www.52pojie.cn/thread-612982-1-1.html
下rtcMsgBox断点
输入假码,注册
(注意这里要输入数字,不然报错)
断下了
在段首下断,再次注册
断下了
贴出第一部分代码:
这一部分主要是把name长度乘以15B38再加上第一个字符的ASCII再转换为十进制
004081E3 FF15 18B14000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCh>; MSVBVM50.__vbaHresultCheckObj
004081E9 8B95 50FFFFFF mov edx,dword ptr ss:
004081EF 8B45 E4 mov eax,dword ptr ss:
004081F2 50 push eax
004081F3 8B1A mov ebx,dword ptr ds:
004081F5 FF15 F8B04000 call dword ptr ds:[<&MSVBVM50.__vbaLenBstr>] ; MSVBVM50.__vbaLenBstr
004081FB 8BF8 mov edi,eax ; 把edi的值设置为name的长度
004081FD 8B4D E8 mov ecx,dword ptr ss: ; ecx设置为name
00408200 69FF 385B0100 imul edi,edi,0x15B38 ; 将edi乘以0x15B38
00408206 51 push ecx
00408207 0F80 B7050000 jo AfKayAs_.004087C4
0040820D FF15 0CB14000 call dword ptr ds:[<&MSVBVM50.#rtcAnsiValueB>; MSVBVM50.rtcAnsiValueBstr
00408213 0FBFD0 movsx edx,ax ; edx为第一个字符的ASCII码
00408216 03FA add edi,edx ; 把edi加上edx
00408218 0F80 A6050000 jo AfKayAs_.004087C4
0040821E 57 push edi ; MSVBVM50.__vbaObjSet
0040821F FF15 F4B04000 call dword ptr ds:[<&MSVBVM50.__vbaStrI4>] ; MSVBVM50.__vbaStrI4
00408225 8BD0 mov edx,eax ; edx为edi转换为十进制之后
这部分和上次差不多
第二部分:
就是把第一部分算出来的值+2
004082E7 8B19 mov ebx,dword ptr ds:
004082E9 FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把edx压入浮点寄存器,此时ST0为266713
004082EF D905 08104000 fld dword ptr ds: ; 把10压入浮点寄存器,此时ST0为10,ST1为266713
004082F5 833D 00904000 0>cmp dword ptr ds:,0x0
004082FC 75 08 jnz short AfKayAs_.00408306
004082FE D835 0C104000 fdiv dword ptr ds: ; 把ST0除以5,此时ST0 = 2
00408304 EB 0B jmp short AfKayAs_.00408311
00408306 FF35 0C104000 push dword ptr ds:
0040830C E8 578DFFFF call <jmp.&MSVBVM50._adj_fdiv_m32>
00408311 83EC 08 sub esp,0x8 ; 把esp减去0x8
00408314 DFE0 fstsw ax
00408316 A8 0D test al,0xD
00408318 0F85 A1040000 jnz AfKayAs_.004087BF
0040831E DEC1 faddp st(1),st ; 把ST0与ST1相加,推出ST0
00408320 DFE0 fstsw ax
第三部分
这一部分比较简单,把第二部分算出来的值再乘以3减去2
004083F5 FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把edx压入ST0
004083FB DC0D 10104000 fmul qword ptr ds: ; 把ST0乘以3
00408401 83EC 08 sub esp,0x8
00408404 DC25 18104000 fsub qword ptr ds: ; 减去2
0040840A DFE0 fstsw ax
第四部分
这一部分更简单了,就是加上15
004084DF FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把第三部分的值压入ST0
004084E5 DC25 20104000 fsub qword ptr ds: ; 减去-15
004084EB 83EC 08 sub esp,0x8
004084EE DFE0 fstsw ax
004084F0 A8 0D test al,0xD
004084F2 0F85 C7020000 jnz AfKayAs_.004087BF
004084F8 DD1C24 fstp qword ptr ss:;推出ST0
所以我们可以得到公式:
注册码 = (name长度 * 88888 + name第一个字符的ASCII + 2)* 3 - 2 +15
可以写注册机了:
#KeyGen2
name = input()
key = (len(name) * 88888 + ord(name) + 2) * 3 -2 +15
print(key)
演示图:
0x03 最后
做这个帖子花费了我不少时间和精力,所以,
评分不要钱!评分不要钱!评分不要钱! YenKoc 发表于 2020-2-18 17:11
老哥,我想问,感觉写注册机出来,是不是需要对汇编非常非常熟悉,我经常是call跳进去了,一大堆汇编命令, ...
简单的不太需要,而且一般都是在关键的语句上写注释,这样才有助于写注册机
有时候可以看函数的返回值来确定这个函数是什么意思
比如说:在call一个call之前,push了一个字符串,然后返回了一个数字,这个数值又是字符串的长度,
这样就可以看出这个cal就是计算字符串的长度
如果push了注册码和账号,返回值是1或0,那么这个call很可能是验证注册码的call
还有很多,我就不一一说了 老哥,我想问,感觉写注册机出来,是不是需要对汇编非常非常熟悉,我经常是call跳进去了,一大堆汇编命令,能知道啥意思,但是组合起来,得不出这函数是啥意思,能解答一下吗 好文,学习了 好好学习下 那个开机画面可以去掉吗?我搞不定 qwert0312 发表于 2020-2-17 20:32
那个开机画面可以去掉吗?我搞不定
可以,参考这篇:http://www.52pojie.cn/thread-612982-1-1.html 这个可以爆破吗? 非常有用,感谢分享 moxiaowei 发表于 2020-2-17 22:18
这个可以爆破吗?
可以,我主要是写的注册机 学习学习。好技术。 墨水喝的少看不懂哈:lol支持一下
页:
[1]
2