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

Ollydbg破解教学之万能断点篇

程序员文章站 2022-04-07 10:01:55
终于有一点时间总结一下OD破解的经验,有许多大侠们都认为OD不能下万能断点,可是有些软件的破解需要用到万能断点,以前一直没有这方面的资料,有的只是OD不能下万能断点的断言,一时心恢之极,可是我...

终于有一点时间总结一下OD破解的经验,有许多大侠们都认为OD不能下万能断点,可是有些软件的破解需要用到万能断点,以前一直没有这方面的资料,有的只是OD不能下万能断点的断言,一时心恢之极,可是我原来用TRW和SICE用的挺好,谁知系统又跟我闹矛盾,一用TRW和SICE就死机,没办法我现在只能用OD,我写的一些破解文章都是用OD破的,反复试验,我终于发现OD也能下万能断点,在我以前写的一些文章中好象有一篇简单提到过,但没有说的很详细,这次静下心,想写一点东西,送给我心爱的组织DFCG吧,我的破解是从DFCG组织起步的,很感谢DFCG的高手们的帮助,在此说声谢谢!为了更明确,这次破解所使用的调试器OD是从看雪论坛临时下载的OD1.09的汉化版,没有使用我自己手头经过改造的OD,在此也感谢看雪论坛,这里真的有很多高手,在这个论坛我也学到了很多.这次破解的对象是超级XX王,为保护国产软件我隐去了软件相关信息,我不想给自己带来麻烦,现在工作很忙,能少一点麻烦就尽量少一点吧.
    破解作者
             yzez[DFCG]
    破解工具
             ollydbg1.09汉化版,看雪论坛下载.
    破解目的
             本不为破解而破解,只因为技术而破解
    破解环境
             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 &nb