破解第三课 关键跳和关键CALL

课前自泼凉水:

前两课的介绍的方法,不管是NOP填充还是JUM的无条件跳转,其实都有极大的局限性。

甚至单纯就效果而言,几乎无用。

且不说利用OD搜索关键字本身就很难搜得到。

就现在的软件保护而言,也几乎不存在只有一处验证的情况。有几处,十几处,甚至更多处验证的情况并不特殊。

所以,这些课程包括之后的,多半也是熟悉一下原理罢了。摆正心态,抱着一个学习的态度就好。

基于上面的原因,这节课引入了两个概念:关键跳和关键CALL。

顾名思义,关键跳就是关乎验证密码或者注册码的最直接的一个je.如果找到这个je,且软件只有这一处验证的话,就很容易跳过验证。

而关键CALL的意义在于,JE是否实现跳转是取决于关键CALL的运算结果以及其返回值。

也就是说JE跳与不跳,CALL说了算。

而且,如果软件采取多处验证的方式,修改JE令其跳过一次验证是达不到破解目的的。

而软件中,有可能多个关乎验证的JE都是取决于同一个CALL,那么找到这个关键CALL,从它直接下手,效率和成功率都会高一些。

那么,如何去确定这个关键跳的位置呢

一步一步来。

第一步还是老规矩,看一下报错信息,然后导入OD查找关键字

破解第三课 关键跳和关键CALL

搜索“注册”,双击找到的结果,返回反汇编窗口

破解第三课 关键跳和关键CALL

看上图,最右侧的红圈标记就是搜索关键词“注册”得到结果

从这一行向上找,发现红圈标记的JE,点击一下发现,这个JE完整的跳过了注册成功提示的这部分代码(观察红线)。

确定这个JE就是一个关键跳。

再向上两行发现一个CALL,这个CALL下面有一个test al,al

这里注意下,JE上面会有一个关键CALL来决定这个JE是否跳转,这个关键CALL通常会是JE的上面的三个CALL中的一个

第二步  如何去确定哪一个是关键CALL呢?可以通过验证来确定!

在这一行下断点,然后F9运行软件,在弹出的软件注册界面填上用户名和注册码“111111111111111111111111111111”

程序到达断点暂停,按F8向下运行。此时程序到了CALL下面一行:test al,al

这一行什么意思呢?看下图右侧的寄存器窗口的第一行EXA 00000000

破解第三课 关键跳和关键CALL

EAX的值一共是8个0,其中E的值是前4个0,AX表示后4个0.AX又分为AH和AL,AL就是最后两个0(如上图右上红圈所示)

test命令是逻辑与操作,test al,al 就是EAX的最后两位进行比较,0和0逻辑与操作的结果还是0

其结果会反映到Z标志位。如果AL为0,则Z标志位为1.AL若为非0,则Z标志位为0

破解第三课 关键跳和关键CALL

如上图可以看到,AL的值是00,Z标志位为1.所以它下面的JE实现了跳转的。

就是因为CALL先把运行的结果给了AL,这个结果反映在Z标志位上,令它下面的JE实现了跳转的,跳过了验证成功的部分!

由此可以确定:设置断点位置的这个CALL就是决定JE跳转与否的关键CALL

(其实以后看见test语言就可以预判,然后下断点验证了)

第三步 修改关键CALL的结果

选中关键CALL那一行,按F7进入CALL内部,在第一行按下空格键,输入“MOV EAX,1”,然后“retn”跳出CALL

破解第三课 关键跳和关键CALL

MOV EAX,1 意思是将1 赋值给EAX,RETN 是跳出CALL

这样,实际上这个CALL只运行了两行代码:赋值和跳出。后面的代码就不会执行了。实际上破解就完成了。

最后一步 保存修改并验证。

破解第三课 关键跳和关键CALL

从破解好的软件进入,发现已经没有弹出注册界面了。点击注册发现,注册按钮已经变灰。

上一篇:移动端Web开发笔记


下一篇:js笔记---拖动元素