打开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