|
 |
推荐文章 |
|
|
|
|
|
|
|
|
|
|
olldbg小解音频转换工具ezConverter! |
|
使用工具: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 <jmp.&MFC42.#1200_AfxMessageBox> ; 提示未注册信息
00405796 . 8D4C>lea ecx, dword ptr ss:[esp+8]
0040579A . C784>mov dword ptr ss:[esp+AC4], -1
004057A5 . E8 E>call <jmp.&MFC42.#800_CString::~CString>
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 <jmp.&MFC42.#1134_AfxEnableControlCon>
004056B7 . 83C4>add esp, 4
004056BA . E8 6>call <jmp.&MFC42.#1205_AfxOleInit> ;初始化运行环境
004056BF . 8BCE mov ecx, esi
004056C1 . E8 5>call <jmp.&MFC42.#2621_CWinApp::Enable3dCo>;初始化运行环境
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 <jmp.&MFC42.#1200_AfxMessageBox> ; 提示未注册信息
00405796 . 8D4C>lea ecx, dword ptr ss:[esp+8]
0040579A . C784>mov dword ptr ss:[esp+AC4], -1
004057A5 . E8 E>call <jmp.&MFC42.#800_CString::~CString>
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 <jmp.&MFC42.#2818_CString::Format>
再继续用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 <jmp.&MFC42.#800_CString::~CStri>
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 <jmp.&MFC42.#800_CString::~CStri> ;进来就完蛋了
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次注册码的校验
注册码的运算过程没有进行分析,只想很快得到效果!目标是最重要的! |
|
|
|
|
|
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。 |
|
|
|
|
|
责任编辑: 原点 |
投稿作者: 本站收集 |
|
|
信息来源: 网络 |
录入时间: 2005-5-26 |
|
|
|
| |
|