使用工具: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破解如何给软件脱壳基础教程
查看所有0条评论>>