当前位置: 移动技术网 > 科技>软件教程>新手入门 > ollydbg破解教学之万能断点篇

ollydbg破解教学之万能断点篇

2020年09月02日  | 移动技术网科技  | 我要评论
ollydbg破解教学之万能断点篇终于有一点时间总结一下OD破解的经验,有许多大侠们都认为OD不能下万能断点,可是有些软件的破解需要用到万能断点,以前一直没有这方面的资料... 12-07-31
有的只是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下万能断点,算法过程太烦琐,就不想多跟了!希望能对大家有点启发,如果觉得这篇
破文还行帮我顶一下吧!也是希望有更多的人能看到,对更多的人有益,我也是一只菜鸟,请大家多多指点!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网