本帖最后由 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再转换为十进制
[Asm] 纯文本查看 复制代码 004081E3 FF15 18B14000 call dword ptr ds:[<&MSVBVM50.__vbaHresultCh>; MSVBVM50.__vbaHresultCheckObj
004081E9 8B95 50FFFFFF mov edx,dword ptr ss:[ebp-0xB0]
004081EF 8B45 E4 mov eax,dword ptr ss:[ebp-0x1C]
004081F2 50 push eax
004081F3 8B1A mov ebx,dword ptr ds:[edx]
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:[ebp-0x18] ; 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
[Asm] 纯文本查看 复制代码 004082E7 8B19 mov ebx,dword ptr ds:[ecx]
004082E9 FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把edx压入浮点寄存器,此时ST0为266713
004082EF D905 08104000 fld dword ptr ds:[0x401008] ; 把10压入浮点寄存器,此时ST0为10,ST1为266713
004082F5 833D 00904000 0>cmp dword ptr ds:[0x409000],0x0
004082FC 75 08 jnz short AfKayAs_.00408306
004082FE D835 0C104000 fdiv dword ptr ds:[0x40100C] ; 把ST0除以5,此时ST0 = 2
00408304 EB 0B jmp short AfKayAs_.00408311
00408306 FF35 0C104000 push dword ptr ds:[0x40100C]
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
[Asm] 纯文本查看 复制代码 004083F5 FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把edx压入ST0
004083FB DC0D 10104000 fmul qword ptr ds:[0x401010] ; 把ST0乘以3
00408401 83EC 08 sub esp,0x8
00408404 DC25 18104000 fsub qword ptr ds:[0x401018] ; 减去2
0040840A DFE0 fstsw ax
第四部分
这一部分更简单了,就是加上15
[Asm] 纯文本查看 复制代码 004084DF FF15 74B14000 call dword ptr ds:[<&MSVBVM50.__vbaR8Str>] ; 把第三部分的值压入ST0
004084E5 DC25 20104000 fsub qword ptr ds:[0x401020] ; 减去-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:[esp];推出ST0
所以我们可以得到公式:
注册码 = (name长度 * 88888 + name第一个字符的ASCII + 2)* 3 - 2 +15
可以写注册机了:
[Python] 纯文本查看 复制代码 #KeyGen2
name = input()
key = (len(name) * 88888 + ord(name[0]) + 2) * 3 -2 +15
print(key)
演示图:
0x03 最后
做这个帖子花费了我不少时间和精力,所以,
评分不要钱!评分不要钱!评分不要钱! |