内嵌补丁练习

内嵌补丁,针对难以直接修改指定代码时,插入并运行成为“洞穴代码”的补丁后,对程序打补丁。常用于对象程序因为加壳而难以直接修改的情况。

可以看到,普通程序运行顺序是EP——>OEP,而内嵌补丁的程序时EP——>洞穴代码——>OEP

这里我们使用的patchme的程序(在52破解上就有解析和题目资源https://www.52pojie.cn/forum.php?mod=viewthread&tid=459681&highlight=patchme)

拿到程序后我们首先查看程序:

首先是弹窗,确定后跳出锁定窗口。

随后我们用od对文件进行跟随,查看一下这个程序的大致情况:

进入后看到只有一个call命令:

进入后又看到一个call命令:


再次进入call命令:

这时我们就可以看到一个解密循环,通过xor(异或)运算对ebx储存的字符进行解密。

所以,这个ebx中就存着需要解密的密文地址,我们通过循环可以看到ebx初始为40105F,每次加一,一共循环154次

所以密文的地址就是(40105F-401248)。

接下来我们运行到地址4010B0,这里有一个call命令指向4010BD,我们进入这个函数看到了两个解密循环:

我们看到第二个循环(解密循环-3),这个循环也是将密文地址放入ebx中异或解密的,而且密文地址也是(40105F-401248),所以这一段密文,是通过双重加密的。

现在这个函数查看完了,我们来到地址为4010B6的第二个call命令,这个call指向了00401039这个函数:


在这个函数中,仍然有一个循环,也是将ebx中存的地址中的数据累加进edx,而ebx中的地址就是刚刚的(40105F-401248),而下面就把edx的值与0x31EB8DB0进行比较,若相同转跳401083,不同则输出error。

由此我们可以看出这是一个校验函数。

而通过校验后,我们就可以到达OEP了:

在这里,我们看到全是乱码,这时候我们需要:右键>分析>分析代码(右键>Analysis>Analyse code)就可以看到OEP的代码了:

在OEP中,我们可以看到DialogBoxParamA()的函数,该函数有五个参数,其中的DlgProc用来指出Dialog Box Procedure的地址(004010F5)

我们进入这个地址就可以看到我们需要修改的字符串了:


接下来我们开始制作补丁:

首先,我们应该在哪里打呢:

①设置到文件的空白区域。

②扩展最后节区后设置。

③添加新节区后设置。

③和②的方法适合添加代码较多的适合运用。

这里我们使用①的方法:

首先我们使用PEView查看第一个节区头(.text):

可以看到,这里的Size of RAW Data有400,而Virtual Size却只有280,意思就是第一个节区的总大小有400却只有280大小被加载进了内存,其余区域(680-800)都是未使用的状态。

我们现在就要在这些未使用的地方添加代码。

我们进入od,在OEP中使用Assemble(Space)命令与Edit(Ctrl+E)命令进行编辑:


最后复制到可执行文件>全部(Copy to exectable - ALL modification)

最后一个步骤,该区域(401083)是原来的加密(xor 7)区域,从文件偏移看,加密区域知道485,后面的00并不是加密区域

所以我们需要将EE 91 06改写为E9 F8 01执行完XOR 7的值,即加密后的值EE FF 06.

最后,查看文件:

修改成功。