EAX寄存器(关键跳,关键CALL)

OD动态调试过程中,寄存器窗口是需要时常关注的!

EAX寄存器:累加器,在乘法和除法指令中被自动调用;在win32中,一般用在函数的返回值中。

CALL:过程调用指令  格式: CALL OPRD  功能: 过程调用指令(说明: 1. 其中OPRD为过程的目的地址. 2. 过程调用可分为段内调用和段间调用两种.寻址方式也可以分为直接寻址和间接寻址两种. 3. 本指令不影响标志位.)

32位 16位 高8位 低8位
EAX AX AH AL

今天用到得示例程序还是《Shark恒零基础百集VIP破解教程》中的示例程序:

先查壳,发现无壳,下面打开软件,发现要注册,输入假码,发现提示关键字“注册”:

EAX寄存器(关键跳,关键CALL)_第1张图片

下面载入OD,搜索字符串,转到相应地址 :

EAX寄存器(关键跳,关键CALL)_第2张图片

向上溯源,发现关键跳(刚好跳过这一段代码得跳转),与je跳转相近的call就可能是关键call,先下断:

EAX寄存器(关键跳,关键CALL)_第3张图片

关键跳:程序中某一个或某几个跳转刚好就跳过了我们期望他运行的代码段;关键call:关键跳是否实现取决于关键call返回的值,一个关键call可能对应很多关键跳,但一个关键跳只对应一个关键call。

下面运行程序,至call处单步调试,观察寄存器窗口:

发现call语句之后EAX寄存器al是00,test(测试指令 TEST  格式: TEST OPRD1,OPRD2  功能: 其中OPRD1、OPRD2的含义同AND指令一样,也是对两个操作数进行按位的'与'运算,唯一不同之处是不将'与'的结.说明: TEST与AND指令的关系,有点类似于CMP与SUB指令之间的关系.)指令后没变,然后执行至je指令后跳转实现,说明call调用的过程里面判断返回的值为假。那下面进入F7进入call调用的过程,让其返回为真。

进入call调用的过程后做如下修改:

EAX寄存器(关键跳,关键CALL)_第4张图片

"mov eax,1"指令的作用是将eax的al赋值为01,retn则是跳出call,程序接着执行call后面的test指令(相当于c++中的return)。

修改后保存修改,程序破解完成!

EAX寄存器(关键跳,关键CALL)_第5张图片

下面在OD中继续运行程序,发现程序成功破解,关闭OD后打开保存的程序,也到达了破解的目的:

EAX寄存器(关键跳,关键CALL)_第6张图片

EAX寄存器(关键跳,关键CALL)_第7张图片

软件的注测一项已经不能点击,说明已经破解。

就这个程序而言,也可以通过修改je来是实现破解:

nop填充后保存,成功破解:

EAX寄存器(关键跳,关键CALL)_第8张图片

EAX寄存器(关键跳,关键CALL)_第9张图片

EAX寄存器(关键跳,关键CALL)_第10张图片

在此示例软件上用nop填充可以达到破解的目的,但如果遇到程序有多个关键跳,那么用nop填充的方法就有点费时费力了。通过对寄存器的修改(修改call的返回值)能够起到事半功倍的效果!


 
 
 

你可能感兴趣的:(学破解教程笔记)