打开emu8086提示注册
尝试输入注册名:gudujian
注册码:121212
提示 wrong registration key.
查壳:无壳VB所写
载入 查找Unicode
如下字符串 wrong registration key.
双击来到反汇编窗口:
005D447E > \C745 FC 29000000 mov dword ptr ss:[ebp-4],29
005D4485 . BA CC044500 mov edx,emu8086.004504CC ; wrong registration key.
提示:Jump from 005D3F25
来到005D3F25:
005D3F10 . E8 1B130000 call emu8086.005D5230
005D3F15 . C745 FC 1C000000 mov dword ptr ss:[ebp-4],1C
005D3F1C . 0FBF15 7CB46100 movsx edx,word ptr ds:[61B47C]
005D3F23 . 85D2 test edx,edx
005D3F25 . 0F84 53050000 je emu8086.005D447E
005D3F2B . C745 FC 1D000000 mov dword ptr ss:[ebp-4],1D
005D3F32 . 68 0000FF00 push 0FF0000
005D3F37 . 8B45 08 mov eax,dword ptr ss:[ebp+8]
005D3F3A . 8B08 mov ecx,dword ptr ds:[eax]
005D3F3C . 8B55 08 mov edx,dword ptr ss:[ebp+8]
005D3F3F . 52 push edx
005D3F40 . FF51 64 call dword ptr ds:[ecx+64]
005D3F43 . DBE2 fclex
005D3F45 . 8985 10FFFFFF mov dword ptr ss:[ebp-F0],eax
005D3F4B . 83BD 10FFFFFF 00 cmp dword ptr ss:[ebp-F0],0
005D3F52 . 7D 20 jge short emu8086.005D3F74
005D3F54 . 6A 64 push 64
005D3F56 . 68 58B14400 push emu8086.0044B158
005D3F5B . 8B45 08 mov eax,dword ptr ss:[ebp+8]
005D3F5E . 50 push eax
005D3F5F . 8B8D 10FFFFFF mov ecx,dword ptr ss:[ebp-F0]
005D3F65 . 51 push ecx
005D3F66 . FF15 B0104000 call dword ptr ds:[<&MSVBVM60.__vbaHresultCheckOb>; MSVBVM60.__vbaHresultCheckObj
005D3F6C . 8985 74FEFFFF mov dword ptr ss:[ebp-18C],eax
005D3F72 . EB 0A jmp short emu8086.005D3F7E
005D3F74 > C785 74FEFFFF 0000>mov dword ptr ss:[ebp-18C],0
005D3F7E > C745 FC 1E000000 mov dword ptr ss:[ebp-4],1E
005D3F85 . 68 24044500 push emu8086.00450424 ; the software is successfully registered
005D3F8A . 8B55 08 mov edx,dword ptr ss:[ebp+8]
005D3F8D . 8B02 mov eax,dword ptr ds:[edx]
005D3F8F . 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
005D3F92 . 51 push ecx
005D3F93 . FF50 54 call dword ptr ds:[eax+54]
发现下面不远处有一个:
005D3F85 . 68 24044500 push emu8086.00450424 ; the software is successfully registered
所以005D3F25处的 je emu8086.005D447E 就是关键跳转了。
而这个je受edx控制,edx是从61B47C 地址处传递过来的
下硬件断点 地址:61B47C 大小 word 类型 写入
重新注册一次 中断在:
005D53DB . 83C4 0C add esp,0C
005D53DE . 68 88B46100 push emu8086.0061B488
005D53E3 . 68 84B46100 push emu8086.0061B484
005D53E8 . 68 80B46100 push emu8086.0061B480
005D53ED . E8 5E020000 call emu8086.005D5650
005D53F2 . 66:85C0 test ax,ax
005D53F5 . 0F84 AB000000 je emu8086.005D54A6
005D53FB . 66:C705 7CB46100 FFFF mov word ptr ds:[61B47C],0FFFF
005D5404 . 8B45 08 mov eax,dword ptr ss:[ebp+8]
005D5407 . 66:8338 00 cmp word ptr ds:[eax],0
有这里 call emu8086.005D5650 这个函数应当返回1
进去这个函数往下拉
005D5996 . FF15 44134000 call dword ptr ds:[<&MSVBVM60.__vbaFreeStrList>] ; MSVBVM60.__vbaFreeStrList
005D599C . 83C4 0C add esp,0C
005D599F . 8D4D A4 lea ecx,dword ptr ss:[ebp-5C]
005D59A2 . 51 push ecx
005D59A3 . 8D55 B4 lea edx,dword ptr ss:[ebp-4C]
005D59A6 . 52 push edx
005D59A7 . 8D45 C4 lea eax,dword ptr ss:[ebp-3C]
005D59AA . 50 push eax
005D59AB . 6A 03 push 3
005D59AD . FF15 50104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarList>] ; MSVBVM60.__vbaFreeVarList
005D59B3 . 83C4 10 add esp,10
005D59B6 . C3 retn
005D59B7 > C3 retn ; RET 用来作为跳转到 005D59B8
005D59B8 > 66:8B45 DC mov ax,word ptr ss:[ebp-24]
005D59BC . 8B4D E0 mov ecx,dword ptr ss:[ebp-20]
005D59BF . 64:890D 00000000 mov dword ptr fs:[0],ecx
005D59C6 . 5F pop edi
005D59C7 . 5E pop esi
005D59C8 . 5B pop ebx
005D59C9 . 8BE5 mov esp,ebp
005D59CB . 5D pop ebp
005D59CC . C2 0C00 retn 0C
发现在函数末尾005D59B8 处的 mov ax,word ptr ss:[ebp-24] 影响这个函数返回值。。
再在这个函数中向上找发现:
005D579C . FF15 34104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVar>] ; MSVBVM60.__vbaFreeVar
005D57A2 . 0FBF55 80 movsx edx,word ptr ss:[ebp-80]
005D57A6 . 85D2 test edx,edx
005D57A8 . 74 12 je short emu8086.005D57BC ; 这里跳转则失败!!
005D57AA . C745 FC 08000000 mov dword ptr ss:[ebp-4],8
005D57B1 . 66:C745 DC FFFF mov word ptr ss:[ebp-24],0FFFF
005D57B7 . E9 C9010000 jmp emu8086.005D5985
005D57A8 处的 je short emu8086.005D57BC 很关键 这里跳转则失败!!
而je是受edx控制的dex从ebp-80处得到值。
继续回溯来到:
005D56F1 . E8 2A98EDFF call emu8086.004AEF20
005D56F6 . 66:8945 80 mov word ptr ss:[ebp-80],ax ; 这里返回0则失败
所以这里的call emu8086.004AEF20 就很关键了,如果这里返回0 则导致失败。!
按回车进去分析这个函数
发现在函数尾部有一个字符串比较指令:
004AEFAD . FF15 50104000 call dword ptr ds:[<&MSVBVM60.__vbaFreeVarList>] ; MSVBVM60.__vbaFreeVarList
004AEFB3 . 8B55 E8 mov edx,dword ptr ss:[ebp-18]
004AEFB6 . 8B06 mov eax,dword ptr ds:[esi]
004AEFB8 . 83C4 0C add esp,0C
004AEFBB . 52 push edx
004AEFBC . 50 push eax
004AEFBD . 6A 01 push 1 ; 文本方式比较!!
004AEFBF . FF15 90134000 call dword ptr ds:[<&MSVBVM60.__vbaStrComp>] ; MSVBVM60.__vbaStrComp
004AEFC5 . 66:F7D8 neg ax (经过分析这里返回1则失败!!)
004AEFC8 . 1BC0 sbb eax,eax
004AEFCA . 68 F5EF4A00 push emu8086.004AEFF5
004AEFCF . F7D8 neg eax
004AEFD1 . 48 dec eax
004AEFD2 . 8945 EC mov dword ptr ss:[ebp-14],eax
004AEFD5 . EB 14 jmp short emu8086.004AEFEB
经过分析发现这个函数的返回值就由这个的调用决定了。
因此在004AEFBF 处下断
重新注册一次来到这里断下来 发现:
寄存器窗口:
EAX 0015574C UNICODE "112"
ECX 00120000
EDX 001556F4 UNICODE "121"
EBX 01021EA4
ESP 0012F780
EBP 0012F7F4
ESI 0012F878
EDI 011911F0 MICROASM.MicroAsm_T
EIP 004AEFBF emu8086.004AEFBF
堆栈窗口:
而edx和eax恰好是 __vbaStrComp 的两个参数其中eax是固定的。
__vbastrcomp(x,y) 在两个参数指向的字符串不相等 时返回零
无论你输入的注册码是什么eax都是指向112 ,而edx恰好是我们输入的注册码的前三位
这样得到一个结论只要 注册码的前三位是“112”就行了无论后面跟多少位也无论注册名是什么都可以通过??!!
打开一个未注册版按照分析结果一试果然成功!!(注册机制竟然这么垃圾)
文中提到的emu8086下载地址:
http://www.skycn.com/soft/20439.html
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)