@[TOC]

定义

通俗点来讲,内嵌补丁就是把我们写好的补丁代码镶嵌在原有的代码里。
举个例子,假设这里有一个代码,随机的控制骰子的点数,现在要求我们不管什么时候,最后运行完骰子后点数都为6,我们该怎么办呢,由于不清楚代码里到底写了什么,是否有加密,所以我们不能随意的修改代码,而这里,我们采用内嵌补丁技术,只要在代码的末尾跳到我们的我们的补丁上,再写一句代码,让骰子的点数为6,再跳回去即可。

练习(Patchme)

文件

例子:https://pan.baidu.com/s/1j_LJ72KWmUtnGpp70r0weA
5ze1(百度网盘)

要求

要求更改显示的字符串
在这里插入图片描述
在这里插入图片描述

提示

1修改字符串,最简单的就是用od查找字符串,直接修改(不过和我们用的内嵌补丁无关)
这里如果修改字符串后,触碰到一些算法,那么就可能让代码流程发生变化,这也体现出内嵌补丁的优点
2如果代码有加密操作,类似upx这种,那么我们可能无法搜索到相关的字符串

分析1

按照上述方法我们可以先试着搜索字符串,果然没有
在这里插入图片描述

分析2

搞懂代码流程(遇见函数f7进去分析)

1进入401001加密代码
2第一个解密循环4010a3:对b区域异或44 (加密的字符串存在于b区)
3第二个解密循环4010c8: 对a区域异或7
4第三个解密循环4010db:对b区域异或11(在此处搜索字符串即可找到)
5校验循环401039,如果edx值判断成功则跳回程序正真的oep

补丁设置在何处

1文件的空白位置
每个节区之间都有填充,可以设置在那里,适用于添加少量代码

2添加新节区
需要添加节区头,添加新节区,修改节区数量,映像大小,节区属性等等操作,比较麻烦,适用于添加大量代码

分析3

我们在.txt节区后面添加代码,不过我们首先需要找到其位置
用小辣椒查看节区头
在这里插入图片描述
文件偏移400,大小400,用编辑器打开找到文件的空白区域(680-800)
在这里插入图片描述
od加载位置是401000,换算va即401280,我们就在这里写入我们的补丁
在这里插入图片描述

1
2
3
4
5
6
7
8
9
mov ecx,0c
mov esi, 004012a8
mov edi,00401123
rep movs ptr es:[edi], byte ptr ds:[esi]
mov ecx,9
mov esi,004012b4
mov edi,0040110a
rep movs ptr es:[edi], byte ptr ds:[esi]
jmp 0040121e

并且在后面放上我们的字符串
在这里插入图片描述

分析4

补丁设置好了,那么什么时候jmp到补丁?
观察代码流程,选择401083即可
在这里插入图片描述只需要修改汇编指令,jmp 401280即可
在这里插入图片描述
但是这里存在一个问题,这条代码是通过解密后所得的,他原属于a区域,异或了7才得到的,如果我们直接修改汇编指令,那么他下一次运行的时候还要再一次异或,那么代码就不知道会跑向哪里去了。
观察修改后的机器码 e9 f8 01 逆推一下让他异或7,变成ee ff 06 我们则只需要用编辑器修改三个字节即可。

结果

在这里插入图片描述
在这里插入图片描述

总结

内嵌补丁的学习是对pe文件学习的一个检测,如何找到每个节区的位置,如何换算rva到raw,如何添加节区或者利用节区的填充部位,都是学习pe文件的基本功,此外还有分析汇编代码的能力也是需要慢慢积累的。