软件破解
本来向合并在逆向的笔记里面,但是考虑后面笔记会可预见的增长,所以还是单独列一个分类出来做笔记。
虽然能自己破解软件自己用挺方便的,不过因为工作原因一直没什么机会折腾,直到某天跟着别人的教程改了一波撤回功能,开始入坑。
吃别人给的鱼当然不如自己学会渔,再加之虽然对于破解产业没兴趣,但个人对于破解一些工具还是有需求的,所以又踏上了自学自坑自乐的过程。
课程内容
52pojie.cn的yyhd的新手友好向破解教程 《玩玩破解,写给新人看》系列教程,目前出到24集
其它坛友录制了1-18课的视频,不过建议先看完原版教程再看这个。
课程笔记
一、破解到底是什么?
破解的对象是软件的使用验证。
什么是软件的使用验证?
举例:比如你花了一个月写了一个软件,你想让其他人花钱才可以用,你怎么办?
当然要给你写好的软件再增加一个使用验证,就像你租房,你当然要先上锁,谁花钱租房,你就给他钥匙。
锁就是房子使用的验证。
我们破解破的不是可用的软件,而是限制使用软件的那把锁。
学习破解的关键步骤
- 第一步是学习如何找到关键位置;
- 第二步是能够分析出验证机制。
二、怎么破解?
工欲善其事必先利其器,首先准备工具。
最基本的3个,当然现在也有更好的替换产品:
- PEID(查是否加壳,专门查壳)
- DIE64(Detect it Easy,查加的什么壳)
- OD(OllyDBG,找关键验证代码位置,但很老了,更推荐windbg)
todo https://www.52pojie.cn/thread-1358649-1-1.html
三、如何找到验证的关键位置
验证流程可分为三步:验证前、验证中、验证后。这三步,关键位置当然是验证中,这个位置是真假码的比较。 如果能直接到达第二步当然是最好,可惜很难直接找到,因为一个程序里面有很多不同的判断。 我们要找关键位置是不是必须依靠线索。最直接的线索就是验证后的不同结果。
搞破解,最常用的办法就是通过验证后的结果来反查到关键位置。一种结果是有提示的字符串,比如“成功”“失败”等,我们的破解思路就在程序代码中先定位到这些字符串,然后往前找关键比较代码。如何定位这些字符串呢?OD里面有一个“中文搜索引擎”工具,可以用于查找定位。一种结果是弹出正确或者错误的对话框。你可以搜索对话框里面的字符串,你还可以在程序中定位弹出对话框的代码,然后再反查到关键位置。
如何定位弹出对话框呢?编程中弹出对话框要用到一个命令,叫做MessageBox,你在这个函数上下断点,让程序暂停,然后再反查即可。通过结果来反查是我们最主要的做法,对于不同的结果,要用不同的办法。比如有提示字符串,有错误对话框,有窗口,让程序退出等等。最怕的是没有错误结果,那我们就需要从验证前的线索入手了。
总结一下: 1、破解软件的第一步就是要找出突破口,验证后的结果是最常用的。拿到一个软件后要先试着登陆一下,看看登陆验证后出现什么结果,是出现了字符串,还是信息框,还是其他,这些就是突破口。 2、通过突破口找到验证后结果的代码位置后,找位置上面的跳转,然后修改跳转,目标就是“无论如何跳向成功,无论如何跳过失败”。 3、关键跳转上面不远处就是验证中的关键代码位置,如果你要分析验证机制或者要找正确的账号密码就在那里。
常用汇编指令记忆
1.CALL指令, CALL是子程序的入口
(在OD里当指令执行到这个CALL的这一行语句时,用键盘上的F7就进去了。如果现在指令没有执行到CALL语句,你只是想看看CALL里面有什么?你可以把鼠标点到这一行,然后按回车键就可以进去浏览了。)
2.JNZ、JMP指令,叫做跳转指令
(程序不是按顺序一行一行往下执行的,会根据条件跳到不同的代码位置,跳转指令就是让代码能够跳来跳去的指令。跳转指令分为两种,一种是JMP,是无条件跳转,意思就是当代码执行到JMP语句,是无条件执行跳转的,跳到哪?就是跳到JMP后面的代码地址。另外一种是JZ、JNZ等,是有条件跳转,意思就是当代码执行到JZ、JNZ时,跳还是不跳要根据上面代码得到的结果来判断)
(最常见的就是这样的,JE是一个条件跳转,它跳到了一个JMP下面一行,这是典型的条件判断编程语法。)
3.EAX,叫做EAX寄存器
(如果我们编程人员把某个CALL做为验证的子程序,这个CALL的作用就是进行真假码的比较,如果比较的结果是真,那么就返回数值1,如果结果是假,就返回数值0,那么返回值1或者0就放在EAX里面,然后下面的条件跳转命令JZ、JNZ就根据是1还是0这个结果来决定跳还是不跳,明白了吗?EAX的意义就在于此,它里面存放的数值会决定程序以后的执行流程。)
(知道了EAX的意义又有什么用呢?你可以修改EAX的值,比如把0改成1就行了,在哪改呢?在CALL里面的代码的开头改成MOV EAX,1 ,下一句改成RETN。这样改的好处是什么呢?因为很多程序在验证的时候会在程序执行过程中多次进行验证,每次验证后都会有条件跳转指令,与其你改多个条件跳转指令,不如改一个验证CALL的返回值更省事。)
主要分为三类:
第一类是传送数据的指令,比如MOV、LEA、PUSH、POP等,它们的作用就是把数据从一个地址转移到另外一个地址,为什么要转移呢,目的是在程序执行中便于使用。那么对于我们破解来说,了解它们有什么用呢?用处就是你能够知道你感兴趣的数据存放在什么地方,你可以跟踪它的使用流程。你可能要问了,我怎么才能看到程序里面的数据呢?
OD里面有一个窗口就叫做数据窗口,里面放的就是程序的数据。
第二类汇编指令是比较判断指令,就是对两个数值进行比较,它往往放在验证CALL的下面,用于判断,比如CMP、TEST 指令。
工具使用
OllyDBG
OllyDBG 入门系列(一)-认识OllyDBG
https://bbs.pediy.com/thread-21284.htm
OllyDBG 入门系列(二)-字串参考
https://bbs.pediy.com/thread-21308.htm
OllyDBG 入门系列(三)-函数参考
https://bbs.pediy.com/thread-21330.htm
OllyDBG 入门系列(四)-内存断点
https://bbs.pediy.com/thread-21378.htm
OllyDBG 入门系列(五)-消息断点及 RUN 跟踪
https://bbs.pediy.com/thread-21532.htm
OllyDBG 入门系列(七)-汇编功能
https://bbs.pediy.com/thread-23873.htm
动态,OllyDebug,WinDebug,gdb
静态,IDA pro
官网:http://www.ollydbg.de/
OllyDBG常用快捷键
OllyDBG 入门系列(一)-认识OllyDBG笔记
F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。(相当于 SoftICE 中的 F9)
F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。(相当于 SoftICE 中的 F10)
F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。(相当于 SoftICE 中的 F8)
F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。(相当于 SoftICE 中的 F7)
F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。(相当于 SoftICE 中的 F5)
CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。(相当于 SoftICE 中的 F12)
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。(相当于 SoftICE 中的 F11)
上面提到的几个快捷键对于一般的调试基本上已够用了。要开始调试只需设置好断点,找到你感兴趣的代码段再按 F8 或 F7 键来一条条分析指令功能就可以了。