有的只是od不能下万能断点的断言,一时心恢之极,可是我原来用trw和sice用的挺好,谁知系统又跟我闹矛盾,一用trw和sice就死机,没办法我现在只能用od,我写的一些破解文章都是用od破的,反复试验,我终于发 
现od也能下万能断点,在我以前写的一些文章中好象有一篇简单提到过,但没有说的很详细,这次静下心,想写一点东西,送给我心爱的组织dfcg吧,我的破解是从dfcg组织起步的,很感谢dfcg的高手们的帮助,在此说声谢谢!为了更明确,这次破解所使用的调试器od是从看雪论坛临时下载的od1.09的汉化版,没有使用我自己手头经过改造的od,在此也感谢看雪论坛,这里真的有很多高手,在这个论坛我也学到了很多.这次破解的对象是超级xx王,为保护国产软件我隐去了软件相关信息,我不想给自己带来麻烦,现在工作很忙,能少一点麻烦就尽量少一点吧. 
破解作者 
yzez[dfcg] 
破解工具 
ollydbg汉化版,代码网下载 
破解目的 
本不为破解而破解,只因为技术而破解 
破解环境 
windows xp,这个我已经在98和xp下各做了两次,贴图和我这篇文章是在xp系统下完成的. 
破解过程 
1.检查了一下,该程序无壳,c++编译,用w32dsm反汇编一堆乱码,我倒!那就动态调试吧!用ollydbg1.09载入程序,这次我将教 
你们如何用od下万能断点,过程我尽可能详细一点,下面请看.载入程序选od菜单栏上的插件-----命令行(快捷键是alt+f1), 
在弹出的窗口中输入万能断点命令:bpx hmemcpy,按enter键,结果又出现一个对话框: 
intermodular calls 
00401164 call dword ptr ds:[<&user32.getwindowrect>] user32.getwindowrect 
0040118f call dword ptr ds:[<&user32.getclientrect>] user32.getclientrect 
00401279 call dword ptr ds:[<&user32.getclientrect>] user32.getclientrect 
004013e1 call dword ptr ds:[<&user32.getclientrect>] user32.getclientrect 
0040190a call dword ptr ds:[<&kernel32.getthreadlocale>] kernel32.getthreadlocale 
0040191c call dword ptr ds:[<&kernel32.getlocaleinfoa>] kernel32.getlocaleinfoa 
还有很多,我就省略了,在这个框里右键单击,出现一个对话框,选中在每个命令中设置断点(热键是s),单击,你看每一行 
都变成了红色吧,这表示全部设下断点了,后面的过程很烦燥,你要一边按f9,边按f2把一些无用的断点去掉,有一点耐心吧, 
当然也可以不这样做,但遇到断点跳不过的时候,你就得按f2把这个断点去掉. 
感觉在这一点上od比不上trw和sice,到出现注册信息框后,你要输入注册信息,然后按确定,程序被断下来,我的序列号是: 
gk342qz0c6re03l,我输入试验码:123456789098765.程序中断在下面: 
00471f71 call dword ptr ds:[<&user32.getwindowtex>****按确定后回到od程序中断在此,按f8走,在此还没有到关键处! 
*****************************************************注意这里会循环两次,分别处理序列号和试验码,按f8走 
00471f77 lea ecx,dword ptr ds:[eax+1] 
00471f7a push ecx 
00471f7b mov ecx,dword ptr ss:[ebp+10] 
00471f7e push eax 
00471f7f call superpim.0043e15d 
00471f84 push eax 
00471f85 push esi 
00471f86 call dword ptr ds:[<&user32.getwindowtex> 
00471f8c mov ecx,dword ptr ss:[ebp+10] 
00471f8f push -1 
00471f91 call superpim.00401d6a 
00471f96 jmp short superpim.00471fa3 
00471f98 mov eax,dword ptr ss:[ebp+10] 
00471f9b push dword ptr ds:[eax] 
00471f9d push esi 
00471f9e call superpim.00470b61 
00471fa4 pop esi 
00471fa5 pop ebp 
00471fa6 retn 0c*************************************程序第二次循环后最后会返回到0040fe99下面看代码: 
---------------------------------------------------------------------------------------------------------- 
0040fe99 lea eax,dword ptr ss:[ebp-14]****第二次循环后会返回到这里,注意这就是我们要找的关键地方,按f8往下! 
0040fe9c push eax 
0040fe9d call superpim.00433d92***********这就是关键call,按f7追进,一定要进,因为算法就在这里面! 
0040fea2 pop ecx 
0040fea3 and dword ptr ss:[ebp-4],0 
0040fea7 lea esi,dword ptr ds:[edi+74] 
0040feaa mov eax,dword ptr ds:[esi]******试验码入eax 
0040feac cmp dword ptr ds:[eax-c],0******比较试验码输入了吗? 
0040feb0 je short superpim.0040ff2f******没有输入就跳走,一跳就失败! 
0040feb2 push 28 
0040feb4 lea eax,dword ptr ss:[ebp-18] 
0040feb7 push esi 
0040feb8 push eax 
0040feb9 call superpim.0042cec8**********此call对输入的注册码进行处理,得到一个40位的长字符串,有兴趣自己跟, 
******************************************我已是头晕的很,不想跟进! 
0040febe lea ecx,dword ptr ss:[ebp-14] 
0040fec1 push ecx 
0040fec2 push eax 
0040fec3 call superpim.0040f9b7**********此call对序列号处理,也是得到一个40位的长字符串 
0040fec8 mov ecx,dword ptr ss:[ebp-18] 
0040fecb add esp,14 
0040fece add ecx,-10 
0040fed1 mov byte ptr ss:[ebp-d],al 
0040fed4 call superpim.00401b5d**********此call进行比较,注册码不对,值为0 
0040fed9 cmp byte ptr ss:[ebp-d],0*******比较是0吗? 
0040fedd je short superpim.0040ff2f******相等就跳,跳就失败,所以一定不能跳! 
0040fedf push 0**************************不跳往下你就成功了!下面代码省略! 
...............................................................省略若干代码!......................... 
============================================================================================================= 
************************************关键call的代码!******************************************************* 
00433d92 mov eax, superpim.0049844e****追进关键call后我们来到这里! 
00433d97 call superpim.00450900 
00433d9c push ecx 
00433d9d push ecx 
00433d9e and [local.5], 0 
00433da2 lea eax, [local.5] 
00433da5 push eax 
00433da6 call superpim.00433ca9********此call根据电脑硬件信息得到你的序列号,有兴趣跟吧!我是没有兴趣! 
00433dab and [local.1], 0 
00433daf push 14 
00433db1 lea eax, [local.5] 
00433db4 push eax 
00433db5 lea eax, [local.4] 
00433db8 push eax 
00433db9 call superpim.0042cec8*******算法call(1),按f7跟进! 
00433dbe push 28 
00433dc0 lea eax, [local.4] 
00433dc3 push eax 
00433dc4 push [arg.1] 
00433dc7 mov byte ptr ss:[ebp-4], 1 
00433dcb call superpim.0042cec8 
00433dd0 mov ecx, [local.4] 
00433dd3 add esp, 1c 
00433dd6 add ecx, -10 
*****************************省略n行代码!******************************************************** 
0043454b retn 
=========================================================================================================== 
***********************************算法call!********************************************************* 
0042cec8 mov eax, superpim.00497b52********追进算法call我们在这里! 
0042cecd call superpim.00450900 
0042ced2 sub esp, 14 
0042ced5 push ebx 
0042ced6 push esi 
0042ced7 xor ebx, ebx 
0042ced9 push edi 
0042ceda mov [local.8], ebx 
0042cedd call superpim.004639b5 
0042cee2 mov edx, dword ptr ds:[eax] 
0042cee4 mov ecx, eax 
0042cee6 call dword ptr ds:[edx+c] 
0042cee9 lea edi, dword ptr ds:[eax+10] 
0042ceec mov [local.4], edi 
0042ceef mov eax, [arg.2] 
0042cef2 mov eax, dword ptr ds:[eax]*******序列号:gk342qz0c6re03l移入eax 
0042cef4 mov esi, dword ptr ds:[eax-c]*****序列号的位数15(十六进制值是f)送入esi 
0042cef7 cmp esi, ebx**********************比较esi和ebx,esi的值是f即序列号位数,ebx的初始值是0 
0042cef9 mov [local.1], ebx 
0042cefc mov [local.8], esi 
0042ceff je superpim.0042cfb2*************相等就跳,这里当然不相等,所以就不会跳! 
0042cf05 mov eax, [arg.3]******************常数14(十进制值是20)送入eax 
0042cf08 cmp eax, esi**********************比较eax和esi,即14和f比较! 
0042cf0a mov [local.6], eax 
0042cf0d jg short superpim.0042cf12*******大于就跳! 
0042cf0f mov [local.6], esi 
0042cf12 cmp [local.6], ebx****************跳到这里!比较14和0 
0042cf15 jle superpim.0042cfb2*************小于就跳,这里当然不会小!所以不跳! 
0042cf1b mov eax, ebx**********************0移入eax 
0042cf1d cdq***********************************edx清0,准备计算! 
0042cf1e idiv esi***************************除,eax/esi ,eax的值是0,esi的值存放序列号的位数f 
0042cf20 mov eax, [arg.2]******************赋eax地址值 
0042cf23 mov eax, dword ptr ds:[eax]*******序列号:gk342qz0c6re03l移入eax 
0042cf25 push ebx***************************ebx入栈 
0042cf26 mov al, byte ptr ds:[edx+eax]*****序列号的第一位g(ascii码值47)入al 
0042cf29 mov byte ptr ss:[ebp-1c], al******保存值47 
0042cf2c push [local.7] 
0042cf2f call superpim.0042cd8e*************算法call(2),按f7跟进!代码直接在下面给出 
============================================================================================================== 
***************************算法call(2)***************************************************** 
0042cd8e push ebp 
0042cd8f mov ebp, esp 
0042cd91 push ecx*************************g的ascii码值47入ecx 
0042cd92 movzx eax, byte ptr ss:[ebp+8]****扩展成00000047 
0042cd96 mov ecx, [arg.2]****************赋ecx的初始值为0 
0042cd99 mov [local.1], eax 
0042cd9c mov eax, ecx********************ecx的值移入eax 
0042cd9e imul eax, ecx********************eax=eax*ecx=0*0 
0042cda1 lea eax, dword ptr ds:[eax+eax*2+7]**eax+eax*2+7的值7给eax 
0042cda5 imul eax, ecx********************eax=eax*ecx=7*0 
0042cda8 add eax, 0d*********************eax=eax+0d=d 
0042cdab imul eax, ecx********************eax=eax*ecx=d*0=0 
0042cdae push esi*************************序列号位数f入栈! 
0042cdaf lea esi, dword ptr ds:[ecx+5] 
0042cdb2 push esi 
0042cdb3 mov [arg.1], eax 
0042cdb6 lea eax, [arg.1] 
0042cdb9 push 4 
0042cdbb push eax 
0042cdbc call superpim.0042cd2e***********这个call也在计算,我实在不想跟进! 
0042cdc1 push esi 
0042cdc2 lea eax, [local.1] 
0042cdc5 push 4 
0042cdc7 push eax 
0042cdc8 call superpim.0042cd5e**********这个call也是计算call,烦!不跟了! 
0042cdcd mov eax, [arg.1] 
0042cdd0 add esp, 18 
0042cdd3 xor eax, [local.1]*************这里赋eax的值38000002 
0042cdd6 pop esi 
0042cdd7 leave 
0042cdd8 retn 
=========================================================================算法call(2)结束================== 
0042cf34 pop ecx 
0042cf35 pop ecx 
0042cf36 push 2b***************************常数2b入栈! 
0042cf38 xor edx, edx 
0042cf3a pop ecx**************************把常数2b赋给ecx 
0042cf3b div ecx**************************除,eax/ecx=38000002/2b=014d6535,余数1b入edx 
0042cf3d mov ecx, edx*********************结果1b入ecx 
0042cf3f add cl, 30***********************cl=cl+30=1b+30=4b(对应的字符串是k) 
0042cf42 cmp cl, 39***********************比较是不是数字9 
0042cf45 mov byte ptr ss:[ebp-14], cl*****保存字符串k 
0042cf48 jle short superpim.0042cf55******小于就跳走! 
0042cf4a cmp cl, 41***********************比较是不是a 
0042cf4d jge short superpim.0042cf55******大于就跳走 
0042cf4f add cl, 0f6 
0042cf52 mov byte ptr ss:[ebp-14], cl 
0042cf55 cmp ebx, [arg.3]*****************跳到这里!比较0和14 
0042cf58 jge short superpim.0042cf67******大于等于就跳走! 
0042cf5a push [local.5] 
0042cf5d lea ecx, [local.4] 
0042cf60 call superpim.00417eaf 
0042cf65 jmp short superpim.0042cfa5******无条件跳 
0042cf67 mov eax, ebx 
0042cf69 cdq 
0042cf6a idiv [arg.3] 
0042cf6d movsx ecx, cl 
0042cf70 push 2b 
0042cf72 mov esi, edx 
0042cf74 movsx eax, byte ptr ds:[esi+edi] 
0042cf78 lea eax, dword ptr ds:[eax+ecx-60] 
0042cf7c cdq 
0042cf7d pop ecx 
0042cf7e idiv ecx 
0042cf80 add dl, 30 
0042cf83 cmp dl, 39 
0042cf86 mov byte ptr ss:[ebp-14], dl 
0042cf89 jle short superpim.0042cf96 
0042cf8b cmp dl, 41 
0042cf8e jge short superpim.0042cf96 
0042cf90 add dl, 0f6 
0042cf93 mov byte ptr ss:[ebp-14], dl 
0042cf96 push [local.5] 
0042cf99 lea ecx, [local.4] 
0042cf9c push esi 
0042cf9d call superpim.0042ce4b 
0042cfa2 mov esi, [local.8] 
0042cfa5 mov edi, [local.4]***************上面跳到这里! 
0042cfa8 inc ebx*************************ebx加1 
0042cfa9 cmp ebx, [local.6]**************比较1和14 
0042cfac jl superpim.0042cf1b***********小于就跳,循环,序列号只有15位,这里循环20次,取完后又从第一位取出! 
************************************循环结束后得到的值是:k3l2lpbdw1f2h4b8s0uy这就是我们要的注册码! 
0042cfb2 mov ecx, [arg.1] 
0042cfb5 lea eax, [local.4] 
0042cfb8 push eax 
0042cfb9 call superpim.00401f36 
0042cfbe lea ecx, dword ptr ds:[edi-10] 
0042cfc1 call superpim.00401b5d 
0042cfc6 mov ecx, [local.3] 
0042cfc9 mov eax, [arg.1] 
0042cfcc pop edi 
0042cfcd pop esi 
0042cfce pop ebx 
0042cfcf mov dword ptr fs:[0], ecx 
0042cfd6 leave 
0042cfd7 retn 
写这篇文章的目的是想说明如何在od下万能断点,算法过程太烦琐,就不想多跟了!希望能对大家有点启发,如果觉得这篇 
破文还行帮我顶一下吧!也是希望有更多的人能看到,对更多的人有益,我也是一只菜鸟,请大家多多指点!
						
						
					
                    
                
                    
                 
             我要评论
我要评论 
                                             
                                            
发表评论