180626(内嵌补丁)

一、内嵌补丁(Inline Patch)

它是“内嵌代码补丁“(Inline Code Patch)的简称。常用于对象程序经过运行时压缩(加密处理)而难以修改的情况。
运行时压缩代码的Ep代码先将加密的OEP代码解密,然后再跳转到OEP代码处。
内嵌补丁在文件设置被称为“洞穴代码”的“补丁代码”,在EP代码解密后修改JMP指令跳转到洞穴代码的运行。
把特定地址区域的值加和后存储到寄存器中,将寄存器中的值与既定的值进行比较,这个值叫校验和(计算所得),若相同则跳转到OEP处,不同则输出错误信息。

二、Patchme练习

在书上的操作基础上额外几个基本的小操作。
1、 在循环的地方看od循环结束的第一条指令下断点(F2)然后F4运行到目标指令(当红色的地址变成了白底红字则为跑到了该断点。
2、 在运行过加密的指令后od不会进行重新分析,所以当我们抵达了一个看起来就像data段的地方时要右键点击点击分析。这样od将会重新分析,显示出已经解密过的代码段。
注意:函数传参的参数遵循小端序,传参顺序和我们看见的参数push进入的顺序是相反的。
3、 内嵌补丁代码设置位置
(1) (补丁代码较少)设置到文件的空白区域
(2) 拓展最后节区后设置
(3) 添加新节区后设置
注意:为了在程序中进行解密处理,一定要在节区头添加可写属性,获得相应内存的可写权限(当对无写权限的内存进行“写”操作时,会引发非法访问异常)
方法使用的空白区域可能被程序加密了,需要根据程序加密方式对我们的cave code也加密过后写入,否则经过解密的代码就不是我们想要写入的代码了。