内嵌补丁
内嵌补丁即内嵌代码补丁(Inline Code Patch),当难以直接修改指定代码时,插入并运行被称为“洞穴代码”(Code Cave)的补丁代码后,对程序实现打补丁。该技术经常用于对象程序经过运行时压缩(或加密处理)而难以直接修改的情况。
如图,左边是经典的运行时压缩代码(或加密代码),EP代码先将加密的OEP代码解码,再跳转到OEP代码处执行。若要打补丁的代码存在于经过加密的OEP区域时,是难以实现打补丁的,因而右边是解决该问题的内嵌代码补丁,即在文件中另外设置被称为洞穴代码的补丁代码,在EP代码解码后修改其JMP指令使其跳转到洞穴代码处而不是OEP,执行完洞穴代码后再跳转至OEP执行,因此这种方法可以达到每次运行时都会对进程内存的代码打补丁的效果。
代码补丁和内嵌补丁的区别如下表:
补丁代码设置的位置:
1、文件的空白区域;
2、最后一个节区的扩展区域;
3、添加新节区。
内嵌补丁练习PatchMe
该小程序从ap0x的Reversing Labs页面下载。
运行程序查看:
显示“你必须给这个Nag打上补丁”,即让你修改弹框显示的字符串内容,点击确定:
对话框中显示有一个字符串要求解压其本身。
整个程序即要求修改两处字符串,然而这两处字符串都处于加密状态。
分析解密循环代码以及需要修改的字符串所在位置
使用Ollydbg打开该文件: