前些天写了个emu8086的破解记录求得了邀请码无奈自己发现时已经过期了。所以又去华军下载了一个破解了,再次申请。希望不要嫌小弟烦人
查壳无壳 VB所写。
随便输入注册信息:aaaaaaaaaaaaaaaaaaaa
点击注册提示:注册码错误注册失败!
OD载入查找字符串:
注册码错误 提示未找到
下断rtcMsgBox
再次注册 可以断下 从系统函数出来 来到用户领空:
0082DF62 . 50 push eax
0082DF63 . 8D4D B0 lea ecx,dword ptr ss:[ebp-50]
0082DF66 . 6A 30 push 30 ; /Arg2 = 00000030
0082DF68 . 51 push ecx ; |Arg1
0082DF69 . C745 B0 08400000 mov dword ptr ss:[ebp-50],4008 ; |错误调用!!
0082DF70 . FF15 D4104000 call dword ptr ds:[<&MSVBVM60.#595>] ; \rtcMsgBox
0082DF76 . 8D55 C0 lea edx,dword ptr ss:[ebp-40]
向上寻找找不到关键跳转。。 从这个函数出来来到:
004DFD46 . 83F8 04 cmp eax,4
004DFD49 . /75 3F jnz short pkgs.004DFD8A ; 这里不跳是C类注册成功!!eax == 4
004DFD4B . |C745 FC 11000000 mov dword ptr ss:[ebp-4],11 ; Case 4 of switch 004DFC86
004DFD52 . |68 70CC4300 push pkgs.0043CC70
004DFD57 . |8B45 D8 mov eax,dword ptr ss:[ebp-28]
004DFD5A . |50 push eax
004DFD5B . |FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
004DFD61 . |8BD0 mov edx,eax
004DFD63 . |8D4D C0 lea ecx,dword ptr ss:[ebp-40]
004DFD66 . |FFD7 call edi
004DFD68 . |8D4D C0 lea ecx,dword ptr ss:[ebp-40]
004DFD6B . |51 push ecx
004DFD6C . |E8 AFE03400 call pkgs.0082DE20
004DFD71 . |8D4D C0 lea ecx,dword ptr ss:[ebp-40]
004DFD74 . |FF15 34134000 call dword ptr ds:[<&MSVBVM60.__vbaFreeStr>] ; MSVBVM60.__vbaFreeStr
004DFD7A . |E9 82000000 jmp pkgs.004DFE01
004DFD7F > |BB 08400000 mov ebx,4008
004DFD84 . |8B35 20124000 mov esi,dword ptr ds:[<&MSVBVM60.__vbaVarCat>] ; MSVBVM60.__vbaVarCat
004DFD8A > \C745 FC 12000000 mov dword ptr ss:[ebp-4],12 ; Default case of switch 004DFC86
004DFD91 . BA 58B34300 mov edx,pkgs.0043B358
004DFD96 . B9 38549600 mov ecx,pkgs.00965438
004DFD9B . FF15 5C124000 call dword ptr ds:[<&MSVBVM60.__vbaStrCopy>] ; MSVBVM60.__vbaStrCopy
004DFDA1 . C745 FC 13000000 mov dword ptr ss:[ebp-4],13
004DFDA8 . C705 4C549600 00000000 mov dword ptr ds:[96544C],0
004DFDB2 . C745 FC 14000000 mov dword ptr ss:[ebp-4],14
004DFDB9 . 68 98CD4300 push pkgs.0043CD98
004DFDBE . 8B15 1C539600 mov edx,dword ptr ds:[96531C]
004DFDC4 . 52 push edx
004DFDC5 . FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
004DFDCB . 8BD0 mov edx,eax
004DFDCD . 8D4D C0 lea ecx,dword ptr ss:[ebp-40]
004DFDD0 . FFD7 call edi
004DFDD2 . 50 push eax
004DFDD3 . 68 E4CE4300 push pkgs.0043CEE4
004DFDD8 . FF15 74104000 call dword ptr ds:[<&MSVBVM60.__vbaStrCat>] ; MSVBVM60.__vbaStrCat
004DFDDE . 8BD0 mov edx,eax
004DFDE0 . 8D4D BC lea ecx,dword ptr ss:[ebp-44]
004DFDE3 . FFD7 call edi
004DFDE5 . 8D45 BC lea eax,dword ptr ss:[ebp-44]
004DFDE8 . 50 push eax
004DFDE9 . E8 02E13400 call pkgs.0082DEF0 ; ???
004DFDEE . 8D4D BC lea ecx,dword ptr ss:[ebp-44]
其中带???是call向错误调用的。004DFD7A 处的jmp可以跳过这里的错误。这样只能让004DFD49 处的jnz不实现
在004DFD46 处下断重新注册断下来
这时将eax改为4 接着运行提示c类注册成功。
接着向上分析发现这片代码貌似像一个消息处理的分支有很多cmp eax,xxx的语句。其中eax若与xxx相等则执行后面的指令。
不如直接在004DFC81 处下断再次注册并中断下来将eax的值置为1 此时提示A0类注册成功
再多试验几次将eax设为不同的值发现当eax = 1 时A0类注册成功
eax = 2是A类注册成功
eax = 3是B类注册成功
eax = 4是C类注册成功
而eax的值是在004DFC81处 由96544C内存地址处传递过来的。。
硬件断点 96544C 大小4 类型访问再次注册。
中断在:
007470D1 . 66:3BF0 cmp si,ax ; 这里如果si == 0则完蛋!!不为零则B级成功
007470D4 . 74 0C je short pkgs.007470E2
007470D6 . C705 4C549600 0300000>mov dword ptr ds:[96544C],3 ; !!!
007470E0 . EB 0A jmp short pkgs.007470EC
007470E2 > A3 4C549600 mov dword ptr ds:[96544C],eax ; !!!
007470E7 . A3 E4529600 mov dword ptr ds:[9652E4],eax
007470EC > 9B wait
007470ED . 68 7D717400 push pkgs.0074717D
007470F2 . EB 60 jmp short pkgs.00747154
007470F4 . 8D55 B0 lea edx,dword ptr ss:[ebp-50]
007470F7 . 8D45 B4 lea eax,dword ptr ss:[ebp-4C]
007470FA . 52 push edx
007470FB . 50 push eax
007470FC . 6A 02 push 2
007470FE . FF15 70124000 call dword ptr ds:[<&MSVBVM60.__vbaFr>; MSVBVM60.__vbaFreeStrList
这里对96544C 地址赋值。。
往上寻找发现007470D4 处的 je short pkgs.007470E2 很关键这里如果比较的两个寄存器值不相等则放进去3 意味着B类注册成功。
往下点击到007470EC 处的 wait发现有几处跳转来到这里。
往上寻找跳转来源:(通过分析发现)
00746BCD . FF15 58114000 call dword ptr ds:[<&MSVBVM60.__vbaStrCmp>; MSVBVM60.__vbaStrCmp
00746BD3 . 85C0 test eax,eax
00746BD5 . 74 17 je short pkgs.00746BEE
00746BD7 . B8 01000000 mov eax,1
00746BDC . 03C3 add eax,ebx
00746BDE . 0F80 BD050000 jo pkgs.007471A1
00746BE4 . 8945 E4 mov dword ptr ss:[ebp-1C],eax
00746BE7 . 33DB xor ebx,ebx
00746BE9 .^ E9 D3F9FFFF jmp pkgs.007465C1
00746BEE > 83C3 01 add ebx,1
00746BF1 . 0F80 AA050000 jo pkgs.007471A1
00746BF7 . 891D 4C549600 mov dword ptr ds:[96544C],ebx
00746BFD . E9 EA040000 jmp pkgs.007470EC
在00746BD3下普通断点
接着往下分析:
00746ECB . FF15 60114000 call dword ptr ds:[<&MSVBVM60.__vbaVarTst>; MSVBVM60.__vbaVarTstEq
00746ED1 . 8D8D 10FFFFFF lea ecx,dword ptr ss:[ebp-F0]
00746ED7 . 8985 54FEFFFF mov dword ptr ss:[ebp-1AC],eax ; 这里eax如果不等于0则A级成功
00746F23 . /74 0F je short pkgs.00746F34 ; 这里不跳A级必成功 跳则可能完蛋!!
00746F25 . |C705 4C549600 0>mov dword ptr ds:[96544C],2
接着往下分析:
00747089 . 8D8D 10FFFFFF lea ecx,dword ptr ss:[ebp-F0]
0074708F . 8BF0 mov esi,eax ; 这里eax不应当是0
007470D1 . 66:3BF0 cmp si,ax ; 这里如果si == 0则完蛋!!不为零则B级成功
007470D4 . 74 0C je short pkgs.007470E2
再次注册中断在00746BD3 此时发现寄存器:
EAX 0017516C UNICODE "aaaaaa-aaaaaa-aaaaaa"
EDX 00172184 UNICODE "bh9x93-3xh2dd-86d9gp"
EIP 00746BCD pkgs.00746BCD
这个edx处的字符串可能就是注册码了,,,先拷贝下来。
执行到00746BD5 je short pkgs.00746BEE 时修改标志位让其跳转
接着到00746BF7 mov dword ptr ds:[96544C],ebx 此时ebx值是1,将其修改为4
F9运行提示C类注册成功
这样发现一个规律96544C 地指处的值决定着注册是否成功和注册的级别。。
保留96544C处的硬件断点重新载入
中断在:
00740883 . C705 4C549600 030000>mov dword ptr ds:[96544C],3
0074088D .^ E9 A8FEFFFF jmp pkgs.0074073A
继续F9
来到主界面提示已注册
但点击注册按钮中断在:
007470E2 A3 4C549600 mov dword ptr ds:[96544C],eax ; !!!
007470E7 A3 E4529600 mov dword ptr ds:[9652E4],eax
此时eax = 0, 继续F9则来到注册框提示未注册!!
可以将007470D4 指令nop掉
将007470D6处改为mov dword ptr ds:[96544C], 4
并将00740883 处的mov dword ptr ds:[96544C],3 改为:mov dword ptr ds:[96544C], 4 保存运行
则提示注册,点击注册按钮来到注册对话框提示已进行C类注册
运行一个没破解的将上面找到的貌似注册码的东西输入进去提示A0类注册成功。。
文中提到的软件可以到这里下载:
http://www.vdisk.cn/user/admin/gudujianjsk?1286330503781
[课程]Android-CTF解题方法汇总!