OllyDebug-软件破解常用方法

第一、二课:修改跳转语句–查找关键字符串
运行程序,查找登录失败的关键字,在反汇编窗口右键->中文搜索引擎->智能搜索中Ctrl+F查找关键字,然后双击跳转到反汇编窗口,一般在关键字前后会有一个验证密码之后的跳转,找到关键的跳转语句,如果密码输入错误,程序跳转的话,我们可以选中该跳转语句,右键->二进制->使用Nop指令填充跳转语句,不让程序跳转,反之,如果输入密码错误,程序不跳转,我们可以选中跳转语句,按下空格,将条件跳转语句改为jmp,无条件跳转,修改的跳转语句后面数字为虚拟地址,注意是十六进制格式,可以删除前面的X或者加上0X前缀。调试过程中,可以找到条件跳转语句下断点,观察程序的执行流程。

第三课:壳中寻找注册码
软件在注册的时候,一般需要用户输入用户名和注册码,注意,用户名和注册码是对应的,唯一的用户名对应唯一的注册码。输入用户名和注册码进行注册(记住输入的错误测试注册码),软件提示重启软件进行验证,这种方式的软件一般都是将刚才的用户输入的用户名和注册码写入注册表,然后软件在重启的时候,读取注册表中的数据,进行注册码比对。使用OD载入程序,如果程序加壳了,可以在反汇编窗口,右键->分析->从模块中删除分析:

如果程序当前是在内核空间,需要让程序运行到代码空间,Ctrl+G到0X00401000,然后搜索关键字符串“未购买”,跳转到反汇编窗口,会发现代码上面会有查找注册表的代码,可以在读取注册表处下断点。由于软件加壳,这里设置的断点查找不到了,解决办法是,使用OD自带的插件API断点设置工具,选中取初始化断点:

在程序初始化之前,断掉程序,这个断点之前程序已经解码,但是还未运行起来。然后单步运行程序,注意观察堆栈窗口中的内容,可以看到程序在读取注册表中之前输入的用户名和注册码,并且会生成正确的注册码进行比对,记下这个注册码。继续执行代码,后面会有判断的语句,其实可以直接修改让他跳过错误提示,但是这个是加壳的程序,修改无法保存。所以选择记录正确注册码的方式来破解。加壳的程序可以使用打补丁的方式破解。

第四课:文件自校验
很多程序为了防止被人破解,一般会加壳,但是总有办法可以脱壳,软件进一步的防御是使用文件大小自校验,如果文件的大小被改变了,那么自动终止程序,这个自校验一般在程序开始处判断,找到这个判断,NOP掉。如果遇到程序脱壳之后不能运行的情况,可能就是程序加入了文件自校验。

第五课:关键跳和关键CALL,修改关键CALL进行破解
影响关键跳的,一般是上面关键CALL执行,CALL调用函数执行的返回值影响关键跳,如果直接修改关键跳可能只绕过一个跳转,需要根本的破解,建议还是从关键CALL处理。软件可能有很多处调用关键CALL,来判断软件是否注册,我们只需要修改一个关键CALL就可以了。修改关键CALL,可以使用F7跟进去,直接修改函数,将关键的返回值翻转就可以了,然后加入retn。

第六课:VMP壳爆破
跟第三课类似,跳转到用户空间,查找关键字符串,找到关键CALL和关键跳。

第七课:VMP壳程序查找注册码
有些程序启动的时候就要求用户注册,用户输入用户名和注册码之后,提示重启软件,软件重启会读取一个配置文件,这个配置文件里存储的就是我们刚才输入的用户名和注册码,程序读取之后与正确的注册码对比。跳转到0X00401000处用户空间,查找关键字符串。在关键跳转处下断点,运行程序,主要观察堆栈窗口的关键字符串,可能就是正确的注册码。注意带壳的程序修改之后无法保存,可以通过打补丁的方式修改。

第八课:API断点-MessageBoxA断点
一般是通过查找字符串的方法,找到弹窗,有的程序对字符串进行了加密,所以查找字符串的方法就行不通了,使用OD的插件BP,在所有MessageBoxA处下断点:


点击MessageBoxA就可以在所有的弹窗之前下断点。
调试小技巧:
如下图所示,注意观察箭头所指向的地方为跳转标志,一个是跳转起点,一个是跳转终点,选中跳转终点,在信息窗口会显示跳转来自哪里,点击信息窗口中的代码行,右键,可以直接转到跳转起点处:

EIP:指令指针寄存器,在寄存器窗口,双击该寄存器,程序能够快速定位到当前代码执行的地方:

第九课:API断点-INI文件读取断点
跟第七课类似,软件提示输入注册码,重启验证,重启是会读取ini配置文件,可以使用OD自带的插件:

程序运行之后,会停在断点处,这个断点一般都在内核空间,可以点击菜单栏中的调试->执行到代码空间,也就是用户空间进行下一步操作:

判断在用户空间还是内核空间,可以通过查看地址的方式,也可以通过查看程序标题上的提示:

上图所示是在用户空间,如果是内核空间,一般是kernal…等。内核空间的代码是无法修改的。

第十课:万能断点?

第十一课:VB程序破解
注意VB编写的程序API断点、关键CALL返回值、MessageBoxA等都不适用。
VB程序特性:

特征参数:MSVBVM60…
VB程序中注册错误弹窗的断点,可以在这里设置:

类似于MessageBoxA的断点,然后在找关键跳和关键CALL破解,注意内核空间的代码是不能修改的。返回到用户空间找关键跳和关键CALL。

第十二课:取出NAG窗口
找到NAG窗口的办法有两种,第一种:使用查找关键字的方法;第二种:使用暂停法。使用OD载入程序,F9运行程序,弹窗触发之后,暂时先不要点击是或者否关闭窗口,先切换到OD,暂停程序运行,然后点击k,切换到堆栈窗口,堆栈窗口中,显示程序调用的函数或者方法,找到MessageBoxA,双击该行,返回到反汇编窗口,设置断点,重新载入程序在程序的上文找关键跳,如果找不到关键跳,尝试直接F8单步运行,走出当前的函数,可能是在外面的函数调用了弹窗函数。本方法中,暂停程序之后,可以回到软件,点击是或者否关闭弹窗,OD中指针也会跳转到弹窗函数调用完成的下一条指令。

第十三课:VB程序查找注册码-搜索字符串方法
使用Detect it easy 0.64可以查找软件的开发语言。无视壳。
VB语言开发的程序使用的是unicode编码,所以在查找字符串的时候,需要使用查找unicode,使用ASCII是查找不到的。智能搜索可以查找。
关键跳的上面一个CALL就是关键CALL。

第十四课:BC++程序脱壳?
BC++程序,脱壳之后,可能无法运行,需要手动查找,手动修复IAT地址,也有可能是程序有自校验,但是可能性很小。

第十五课:
DEDE程序载入BC++编写的程序,进行静态分析,找到按钮事件的代码的段首地址,然后OD载入程序,找到段首设置断点进行调试。
DED适用于BC++和Delphi编写的程序。

第十六课:
LOOPD:汇编循环指令,遇到循环指令的情况,我们可以在循环的下面的代码处设置断点,让程序走到断点处,快速执行完循环。也可以让程序运行到光标处,快捷键是F4,运行到选定位置。

第十七课:
重启验证的程序,破解需要找到关键CALL和关键跳,但是主要的是需要找到关键CALL,修改CALL的返回值,因为如果只是修改了关键跳,本次运行程序,提示注册成功,但是程序需要重启验证,那还是没有完成注册和破解。

第十八课:补丁生成方法

第十九课:网络验证程序破解–易语言程序
60%的外挂程序使用易语言编写。
使用OD载入程序,没有任何弹窗,表明程序没有加壳,Ctrl+G,跳转到0X00401000用户空间,在反汇编窗口右键->查找->二进制字符串,在HEX栏输入“FF 25”,注意查找易语言按钮事件的时候,是查找“FF 55”,查找窗体是搜索“FF 25”,只有易语言编写的程序才有:

注意前面的一个push,上面一行的push就是窗体事件,通过改变后面的值,就能加载不同的窗体,使用此方法可以绕过软件开始的验证窗体。接着查找其他窗体:在反汇编窗口中,右键->查找->命令,“push 10001”,在查找到的内容下面,会有其他的push语句,下面一条push xxxxxx(内存地址),就是一个窗体,使用这个地址替换掉上图中查找到的第一个加载的窗体,来达到绕过登录验证的效果。一个程序会有很多窗体,查找替换,找到想要的那一个。
此方法的弊端:可能出现蓝屏、格盘、关机等等,最好在虚拟机中进行。

第二十课:易语言程序-暗桩
push窗体请谨慎使用,可能软件开发者会设置很多暗桩。危害很大,蓝屏、格盘,关机等等。
暗桩:可以理解为一些隐藏的功能,可以是攻击破解者电脑的功能,使用上节课的方法弄出来的很多窗口,可能发现有的打不开,那是因为某些窗体需要父窗体。使用上节课中的方法找到主窗体,如果窗体不能打开,或者打开直接退出了,那就是遇到了暗桩,使用OD载入程序调试,如果启动程序之后,程序马上自己结束了,这就是一个没有危害的暗桩,调试方法是设置API断点,菜单栏->插件->API断点设置工具->常用断点设置:


让程序运行知道停止在断点处,这个时候在堆栈窗口中,可以看到“返回到…”,选中该行,右键->反汇编窗口中跟随,在汇编窗口中,能够找到介绍程序的调用和关键跳等。

第二十一课:网络验证
判断方法:如果是本地验证,那么注册失败的弹窗应该是很快弹出的,如果是网络验证,会有一小段时间的延迟,可以察觉到。
网络验证也可以本地爆破。

第二十二课:
VB程序对按钮事件进行下断点,可以使用脚本,方法:反汇编窗口右键->运行脚本->打开->VB程序按钮事件。
VB程序注意查找0xFFFF,一般有关键跳。

第二十三课:
取消关机:shutdown -a

第二十四课:
工具修改软件字符串。

第二十五课:
修改OD,使用Ueditor编辑器,搜索字符串,OD标题,修改就好了。