growuphappily 发表于 2020-2-17 18:44

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 最后
做这个帖子花费了我不少时间和精力,所以,
评分不要钱!评分不要钱!评分不要钱!

growuphappily 发表于 2020-2-18 17:47

YenKoc 发表于 2020-2-18 17:11
老哥,我想问,感觉写注册机出来,是不是需要对汇编非常非常熟悉,我经常是call跳进去了,一大堆汇编命令, ...

简单的不太需要,而且一般都是在关键的语句上写注释,这样才有助于写注册机
有时候可以看函数的返回值来确定这个函数是什么意思
比如说:在call一个call之前,push了一个字符串,然后返回了一个数字,这个数值又是字符串的长度,
这样就可以看出这个cal就是计算字符串的长度
如果push了注册码和账号,返回值是1或0,那么这个call很可能是验证注册码的call
还有很多,我就不一一说了

YenKoc 发表于 2020-2-18 17:11

老哥,我想问,感觉写注册机出来,是不是需要对汇编非常非常熟悉,我经常是call跳进去了,一大堆汇编命令,能知道啥意思,但是组合起来,得不出这函数是啥意思,能解答一下吗

七个涨停一倍 发表于 2020-2-17 19:07

好文,学习了

amovokiss 发表于 2020-2-17 19:28

好好学习下

qwert0312 发表于 2020-2-17 20:32

那个开机画面可以去掉吗?我搞不定

growuphappily 发表于 2020-2-17 20:45

qwert0312 发表于 2020-2-17 20:32
那个开机画面可以去掉吗?我搞不定

可以,参考这篇:http://www.52pojie.cn/thread-612982-1-1.html

moxiaowei 发表于 2020-2-17 22:18

这个可以爆破吗?

定南吴彦祖 发表于 2020-2-17 23:53

非常有用,感谢分享

growuphappily 发表于 2020-2-18 07:48

moxiaowei 发表于 2020-2-17 22:18
这个可以爆破吗?

可以,我主要是写的注册机

ioajp 发表于 2020-2-18 08:03

学习学习。好技术。

eden88888 发表于 2020-2-18 08:41

墨水喝的少看不懂哈:lol支持一下
页: [1] 2
查看完整版本: CrackMe第三题追码+注册机