您的位置:首页精文荟萃破解文章 → olldbg小解音频转换工具ezConverter!

olldbg小解音频转换工具ezConverter!

时间:2004/10/15 1:03:00来源:本站整理作者:蓝点我要评论(0)

 


使用工具:olldbg 1.09c  
方法:先暴破,再找注册码,生成注册文件  
程度:初级  
用peid查壳,没有加壳。使用的是VC6.0。比较好下手  

首先试运行程序,发现未注册时启动时有提示窗口,这就是突破口。在程序的注册窗口中随便输入用户名(chenji)和注册码(abcdefg1234567),程序提示重新运行软件再进行注册检验。下面正式开始:  

打开OLLDBG选择debug->select import libraries将MFC42.lib文件载入 ,破解此软件必须使用!  

再载入ezConverter.exe文件,在CPU窗口点右键快捷菜单,选择search for-->Name(label) in current module或直接按ctrl+N。找到MFC42.#1199_AfxMessageBox和MFC.#1200_AfxMessageBox,在这两项上点右键选择set breakpoint on every reference,将每个引用这两个函数的语句都设断点,这两个函数就是显示提示窗口的。 按F9运行程序:很快就在00405791处中断:  
00405791  .  E8 7>call          ;  提示未注册信息  
00405796  .  8D4C>lea    ecx, dword ptr ss:[esp+8]  
0040579A  .  C784>mov    dword ptr ss:[esp+AC4], -1  
004057A5  .  E8 E>call      
004057AA  >  8BCE mov    ecx, esi
004057AC  .  E8 5>call    EZCONVER.00405A10  
004057B1  .  57  push    edi  
004057B2  .  8D4C>lea    ecx, dword ptr ss:[esp+7C]  
    .  
中断后,向上翻看发现有几个跳转语句,有两个内部调用可疑。有门!!!  

004056AF  .  8BF1 mov    esi, ecx                 ;先设个断点  
004056B1  .  57  push    edi  
004056B2  .  E8 7>call      
004056B7  .  83C4>add    esp, 4  
004056BA  .  E8 6>call            ;初始化运行环境  
004056BF  .  8BCE mov    ecx, esi
004056C1  .  E8 5>call    ;初始化运行环境  
004056C6  .  8D86>lea    eax, dword ptr ds:[esi+C4]  
004056CC  .  50  push    eax
004056CD  .  68 F>push    0FF
004056D2  .  FF15>call    near dword ptr ds:[<&KERNEL32.GetCurr>
004056D8  .  8BCE mov    ecx, esi
004056DA  .  E8 4>call    EZCONVER.00405E20             ; 处理注册码的调用,F7跟进去  
004056DF  .  84C0 test    al, al  
004056E1  .  0F85>jnz    EZCONVER.004057AA                    ;关键的跳转,一定要跳走  
004056E7  .  57  push    edi
004056E8  .  8BCE mov    ecx, esi
004056EA  .  E8 6>call    EZCONVER.00406450
004056EF  .  B9 1>mov    ecx, 1E  
004056F4  .  2BC8 sub    ecx, eax  
004056F6  .  83F9>cmp    ecx, -64  
004056F9  .  898E>mov    dword ptr ds:[esi+1C4], ecx  
004056FF  .  0F8C>jl      EZCONVER.004058BE  
00405705  .  83F9>cmp    ecx, 1  
................
.............

0040578E  .  57  push    edi  
0040578F  .  57  push    edi  
00405790  .  50  push    eax  
00405791  .  E8 7>call          ;  提示未注册信息  
00405796  .  8D4C>lea    ecx, dword ptr ss:[esp+8]  
0040579A  .  C784>mov    dword ptr ss:[esp+AC4], -1  
004057A5  .  E8 E>call      
004057AA  >  8BCE mov    ecx, esi                              ;  EZCONVER.004136E0  
004057AC  .  E8 5>call    EZCONVER.00405A10  
004057B1  .  57  push    edi  
004057B2  .  8D4C>lea    ecx, dword ptr ss:[esp+7C]  

转到004056AF处先设个断点,然后按ctrl+f2重新载入程序,再次运行在004056AF处停下来。用F8运行到004056DA后,再用F7跟进去(建议在004056DA处设个断点)。 跟进去后再用F8单步走,在00405EA8处得知软件的注册信息保存在erf.dat文件中。  

00405E9C  |.  C7>mov    dword ptr ss:[esp+130], 0  
00405EA7  |.  51 push    ecx                                  ;  EZCONVER.004136E0  
00405EA8  |.  68>push    EZCONVER.004133CC                    ;  ASCII "%s\\erf.dat"  
00405EAD  |.  52 push    edx                                  ;  KERNEL32.BFFC9490  
00405EAE  |.  E8>call      

再继续用F8往下走,在00405F93处发现了上次输入的用户名(chenji),看来跟的路是对的!!  

00405F93  |.  8D>lea    edi, dword ptr ss:[esp+40]            ;发现了用户名  
00405F97  |.  8B>mov    ecx, ebp  
00405F99  |.  33>xor    eax, eax  
00405F9B  |.  F2>repne  scas byte ptr es:[edi]  
00405F9D  |.  F7>not    ecx  
00405F9F  |.  49 dec    ecx                      ;得到用户名的长度  
00405FA0  |.  83>cmp    ecx, 1                      ; 如果是空的  
00405FA3  |.  0F>jb      EZCONVER.00406165                    ; 跳走就完完了  

再继续用F8往下走,在00405FA9处发现了上次输入的注册码(abcdefg1234567),进行很基本的检查,同上  

00405FA9  |.  8D>lea    edi, dword ptr ss:[esp+64]        ;注册码  
00405FAD  |.  8B>mov    ecx, ebp  
00405FAF  |.  F2>repne  scas byte ptr es:[edi]  
00405FB1  |.  F7>not    ecx  
00405FB3  |.  49 dec    ecx  
00405FB4  |.  83>cmp    ecx, 1  
00405FB7  |.  0F>jb      EZCONVER.00406165                    ;  跳走就完了  

再继续用F8往下走,有一个判断语句,不用管一直走下去  
00405FBD  |.  8D>lea    edi, dword ptr ss:[esp+40]  
00405FC1  |.  8B>mov    ecx, ebp                        ;  KERNEL32.BFF70000  
00405FC3  |.  F2>repne  scas byte ptr es:[edi]  
00405FC5  |.  8B>mov    ebx, dword ptr ds:[<&USER32.Char>;  将用户名转为大写  
00405FCB  |.  8B>mov    esi, ebp                        ;  KERNEL32.BFF70000  
00405FCD  |.  F7>not    ecx  
00405FCF  |.  49 dec    ecx  
00405FD0  |.  8B>mov    edi, ecx  
00405FD2  |.  8D>lea    ecx, dword ptr ss:[esp+40]  
00405FD6  |.  51 push    ecx                              ; /StringOrChar = "."  
00405FD7  |.  FF>call    near ebx                        ; \CharUpperA  
00405FD9  |.  33>xor    ecx, ecx  
00405FDB  |.  85>test    edi, edi  
00405FDD  |.  7E>jle    short EZCONVER.0040604A          ;  可能要进行运算  
00405FDF  |>  8B>/mov    eax, ecx  
00405FE1  |.  BD>|mov    ebp, 3  
00405FE6  |.  99 |cdq  
00405FE7  |.  F7>|idiv    ebp                            ;  KERNEL32.BFF70000  
00405FE9  |.  46 |inc    esi  
00405FEA  |.  85>|test    edx, edx                        ;  Switch (cases 0..2)  
..................
...............

0040603B  |>  88>|mov    byte ptr ss:[esp+esi+88], al  
00406042  |>  41 |inc    ecx
00406043  |.  3B>|cmp    ecx, edi  
00406045  |.^ 7C>\jl      short EZCONVER.00405FDF  

一直F8向下走,有一大堆的浮点运算,看不过来,可能是想转移我们的注意力,再向下  
00406047  |.  83>or      ebp, FFFFFFFF  
0040604A  |>  DD>fld    qword ptr ds:[40FE00]            ;浮点运算  
00406050  |.  33>xor    eax, eax  
00406052  |.  85>test    esi, esi  
00406054  |.  7E>jle    short EZCONVER.0040606D  
00406056  |>  0F>/movsx  ecx, byte ptr ss:[esp+eax+88]  
0040605E  |.  89>|mov    dword ptr ss:[esp+14], ecx  
00406062  |.  40 |inc    eax  
00406063  |.  DB>|fild    dword ptr ss:[esp+14]            ;浮点运算  
00406067  |.  3B>|cmp    eax, esi  
00406069  |.  DE>|faddp  st(1), st                ;浮点运算  
0040606B  |.^ 7C>\jl      short EZCONVER.00406056  
0040606D  |>  D9>fld    st                    ;浮点运算,完全是无聊的举动  
0040606F  |.  D9>fsin                        ;浮点运算,完全是无聊的举动  
00406071  |.  D9>fcos                        ;浮点运算,完全是无聊的举动  
00406073  |.  D9>fsin                        ;浮点运算,完全是无聊的举动  
00406075  |.  D9>fcos                        ;浮点运算,完全是无聊的举动  
00406077  |.  D9>fsin                        ;浮点运算,完全是无聊的举动  
00406079  |.  DD>fst    qword ptr ss:[esp+14]            ;浮点运算,完全是无聊的举动  
0040607D  |.  DC>fcomp  qword ptr ds:[40FE00]            ;浮点运算,完全是无聊的举动  
00406083  |.  DF>fstsw  ax  
00406085  |.  F6>test    ah, 1  
00406088  |.  74>je      short EZCONVER.004060AD  
.......................
...............

004060E6  |>  8A>/mov    al, byte ptr ss:[esp+edx+DA]  
004060ED  |.  8D>|lea    edi, dword ptr ss:[esp+D8]  
004060F4  |.  04>|add    al, 41  
004060F6  |.  8B>|mov    ecx, ebp  
004060F8  |.  88>|mov    byte ptr ss:[esp+edx+88], al  
004060FF  |.  33>|xor    eax, eax  
00406101  |.  42 |inc    edx  
00406102  |.  F2>|repne  scas byte ptr es:[edi]  
00406104  |.  F7>|not    ecx  
00406106  |.  83>|add    ecx, -3  
00406109  |.  3B>|cmp    edx, ecx  
0040610B  |.^ 72>\jb      short EZCONVER.004060E6  

运行到0040610D时,请注意dword ptr ss:[esp+88]中的值。在CPU窗口下的小窗口中显示:  
stack address=006AF1FC  在这一行上点右键,选择follow address in dump。在内存窗口中将显示:  
wszysyvzusurvx          ;很怀疑这个字符串是正确的注册码。  

0040610D  |> \8D>lea    ecx, dword ptr ss:[esp+88]      ;  可能是正确的注册码  
00406114  |.  C6>mov    byte ptr ss:[esp+esi+88], 0  
0040611C  |.  51 push    ecx  
0040611D  |.  FF>call    near ebx              ;转换成大写字母  
0040611F  |.  8D>lea    edi, dword ptr ss:[esp+64]        ;这里是自己输入的注册码  
00406123  |.  8B>mov    ecx, ebp  
00406125  |.  33>xor    eax, eax  
00406127  |.  8D>lea    esi, dword ptr ss:[esp+88]  
0040612E  |.  F2>repne  scas byte ptr es:[edi]  
00406130  |.  F7>not    ecx  
00406132  |.  49 dec    ecx  
00406133  |.  8D>lea    edi, dword ptr ss:[esp+64]  
00406137  |.  33>xor    edx, edx  
00406139  |.  89>mov    dword ptr ss:[esp+130], ebp  
经过上面的变换"wszysyvzusurvx"就成了"WSZYS vzusurvx"了。中间不是空格,而是二进制0x00。  

再用F8走到 00406140 这里是很关键的一个串比较语句!!!而到了00406146这个跳转语句更是关键,一定不能跳。如果想暴破就将这条语句改为nop就可以了。具体方法就不说了  

00406140  |.  F3>repe    cmps byte ptr es:[edi], byte ptr>  ;关键的比较  
00406142  |.  8D>lea    ecx, dword ptr ss:[esp+10]  
00406146      75>jnz    short EZCONVER.00406170            ;  关键关键!万万跳不得  
00406148  |.  E8>call         
0040614D  |.  B0>mov    al, 1  
0040614F  |.  8B>mov    ecx, dword ptr ss:[esp+128]  
00406156  |.  64>mov    dword ptr fs:[0], ecx  
0040615D  |.  5F pop    edi  
0040615E  |.  5E pop    esi  
0040615F  |.  5D pop    ebp  
00406160  |.  5B pop    ebx  
00406161  |.  8B>mov    esp, ebp  
00406163  |.  5D pop    ebp  
00406164  |.  C3 retn  
00406165  |>  89>mov    dword ptr ss:[esp+130], ebp  
0040616C  |>  8D>lea    ecx, dword ptr ss:[esp+10]  
00406170  |>  E8>call        ;进来就完蛋了  
00406175  |>  8B>mov    ecx, dword ptr ss:[esp+128]  
0040617C  |.  5F pop    edi  
0040617D  |.  32>xor    al, al  
0040617F  |.  64>mov    dword ptr fs:[0], ecx  
00406186  |.  5E pop    esi  
00406187  |.  5D pop    ebp  
00406188  |.  5B pop    ebx  
00406189  |.  8B>mov    esp, ebp  
0040618B  |.  5D pop    ebp  
0040618C  \.  C3 retn  

"WSZYS vzusurvx"就是正确的注册码!  
建议:在00406140这个关键比较前,将内存窗口中自己先前输入的注册码(在正确的注册码的上面一点)改成正确的注册码,然后实验一下不改语句而注册成功的效果。这样会在erf.dat文件中写入了正确的注册信息,以后就不要再进行注册和修改了,只需要保存erf.dat这个注册授权文件中可以了。  
(注意:程序在后面会进行5次注册码的校验
注册码的运算过程没有进行分析,只想很快得到效果!目标是最重要的!
先收工了!用时30分钟。今天我在值班很无聊!

    
    
     
    
    
     

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 去除winrar注册框方法

最新文章 比特币病毒怎么破解 比去除winrar注册框方法 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据

人气排行 华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程