欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

ollydbg破解教学之万能断点篇

程序员文章站 2022-03-24 10:48:56
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下万能断点,算法过程太烦琐,就不想多跟了!希望能对大家有点启发,如果觉得这篇
破文还行帮我顶一下吧!也是希望有更多的人能看到,对更多的人有益,我也是一只菜鸟,请大家多多指点!