OllyDbg 使用教程 (十二)


 

参考

书:《加密与解密》

视频:小甲鱼 解密系列 视频

 

示例程序下载地址:http://pan.baidu.com/s/1eQiV6aI

 

安装好程序后,打开程序可以在About中看到注册界面。可以先从输入的API入手试试。

 

右键-->查找-->所有模块间的调用,搜索GetWindowTextA (直接输入这些字母即可搜索),选中找到的的调用,右键-->“在每个调用到GetWindowTextA设置断点”。  我们可以查看OD设置了3个断点。(我们也可以按Ctrl+N查看输入输出表搜索GetWindowTextA设置断点)。

 


按F9运行程序,在程序还没有运行到现实接面时,前面两个断点就触发了,而且触发了好多次。可以知道前面的2个都与About界面的输入无关,取消这两个断点。重新运行程序,在About中的Registration中输入name和key,点击OK,可以发现程序断在了第3个断点上。

 

按F8单步运行程序,运行到下面代码处:

 

 

00417457   .  8BCE          mov     ecx, esi
00417459   .  C64424 30 01  mov     byte ptr [esp+30], 1
0041745E   .  E8 2D020000   call    00417690
00417463   .  84C0          test    al, al
00417465   .  75 7C         jnz     short 004174E3
00417467   .  51            push    ecx
00417468   .  8D5424 14     lea     edx, dword ptr [esp+14]
0041746C   .  8BCC          mov     ecx, esp
0041746E   .  896424 20     mov     dword ptr [esp+20], esp
00417472   .  52            push    edx
00417473   .  E8 9D6A0400   call    0045DF15
00417478   .  51            push    ecx
00417479   .  8D4424 1C     lea     eax, dword ptr [esp+1C]
0041747D   .  8BCC          mov     ecx, esp
0041747F   .  896424 20     mov     dword ptr [esp+20], esp
00417483   .  50            push    eax
00417484   .  C64424 34 03  mov     byte ptr [esp+34], 3
00417489   .  E8 876A0400   call    0045DF15
0041748E   .  8BCE          mov     ecx, esi
00417490   .  C64424 30 01  mov     byte ptr [esp+30], 1
00417495   .  E8 F6010000   call    00417690
0041749A   .  84C0          test    al, al
0041749C   .  75 45         jnz     short 004174E3
0041749E   .  6A 00         push    0
004174A0   .  68 04544800   push    00485404                           ;  ASCII "XoftSpy"
004174A5   .  68 C4684800   push    004868C4                           ;  ASCII "Invalid code."
004174AA   .  8BCE          mov     ecx, esi
004174AC   .  E8 664F0400   call    0045C417
004174B1   .  68 48FA4800   push    0048FA48
004174B6   .  8BCD          mov     ecx, ebp
004174B8   .  E8 206E0400   call    0045E2DD
004174BD   .  68 48FA4800   push    0048FA48
004174C2   .  8BCF          mov     ecx, edi
004174C4   .  E8 146E0400   call    0045E2DD
004174C9   .  68 48FA4800   push    0048FA48
004174CE   .  8BCB          mov     ecx, ebx
004174D0   .  E8 086E0400   call    0045E2DD
004174D5   .  6A 00         push    0
004174D7   .  8BCE          mov     ecx, esi
004174D9   .  E8 03590400   call    0045CDE1
004174DE   .  E9 9D000000   jmp     00417580
004174E3   >  57            push    edi
004174E4   .  55            push    ebp
004174E5   .  E8 769D0100   call    00431260
004174EA   .  83C4 08       add     esp, 8
004174ED   .  8BCE          mov     ecx, esi
004174EF   .  6A 00         push    0
004174F1   .  68 04544800   push    00485404                           ;  ASCII "XoftSpy"
004174F6   .  68 98684800   push    00486898                           ;  ASCII "Congratulations! successfully registered"
004174FB   .  E8 174F0400   call    0045C417

 

 

我们可以发现 jnz     short 004174E3  很关键它的跳转决定了后面输出窗口是"Invalid code." 还是 "Congratulations! successfully registered" ,但是如果我们只是把它改成jmp    short 004174E3 虽然会弹出注册成功的窗口,但实际上还是没有注册。我们可以看看它前面的call    00417690。

重新运行程序,进入00417690。我们可以查看00417690 函数,可以发现这个函数有两处返回,第一处返回前,函数使得al变为1, 第二处返回前,函数使得al变为0。按F8,单步运行程序,改变标志寄存器或者指令使得00417690 函数在第一处retn 返回。但是这样实现了以后依然是会弹出注册成功的窗口,但实际上还是没有注册。

 

我们可以尝试别的方法进行破解。冲关键的字符串入手。

我们可以重About界面中的“This XoftSpy license has not been registered” 入手,搜索次字符串,查看代码所在的位置

 

0040147D   .  50            push    eax
0040147E   .  51            push    ecx
0040147F   .  C64424 3C 03  mov     byte ptr [esp+3C], 3
00401484   .  E8 17FF0200   call    004313A0
00401489   .  8B8E C0000000 mov     ecx, dword ptr [esi+C0]
0040148F   .  83C4 08       add     esp, 8
00401492   .  E8 093C0300   call    004350A0
00401497   .  84C0          test    al, al
00401499   .  74 12         je      short 004014AD
0040149B   .  68 C4514800   push    004851C4                           ;  ASCII "This license of XoftSpy has been registered"
004014A0   .  8D4C24 08     lea     ecx, dword ptr [esp+8]
004014A4   .  E8 34CE0500   call    0045E2DD
004014A9   .  6A 00         push    0
004014AB   .  EB 10         jmp     short 004014BD
004014AD   >  68 94514800   push    00485194                           ;  ASCII "This XoftSpy license has not been registered"
004014B2   .  8D4C24 08     lea     ecx, dword ptr [esp+8]

 

 

在0040147D处下断点,重新运行程序,可以发现当按下主界面的About按钮时,就会中断在0040147D处。尝试直接把  je      short 004014AD  改成 nop,可以发现程序就被注册了。