0x00 前言
对于上篇所讲的那个练习,PE文件属于运行时解压缩文件,而且文件包含校验和检验,如果直接修改代码可能得花点功夫了。对于这种情况我们可以使用内嵌补丁轻松解决。
由上图我们知道要进行运行内嵌补丁,先得找到外壳程序跳往OEP的关键跳转。上篇我们已经知道4018083处为跳往OEP的关键跳。
0x01 内嵌补丁编写
- 首先我们要确定补丁位置。一般而言有三种方式。文件空白区,扩展到最后字节,添加新节区。我们先用PEviewer查看.text节区情况。有下图:
上图我们知道text节区在文件中的大小为400h,而映射到内存的实际大小才为280h,280h-400h的地方都是空白。我们就将补丁嵌入此区域。
2.使用lordPE查看imagebase和text区块的起始地址。如下图:
由上图可知text映射到内存地址401280处为空白区域。跳转至该处得到下图:
3.下面编写内嵌补丁。
上图红框标注的地方就是我们今天要替换掉的内容,我们先找到字符串位置。这是个messageBox我们直接运行至OEP处查看传递的参数。如下图:
DialogBoxParamA函数的原型如下:
INT_PTR DialogBoxParamA(
HINSTANCE hInstance,
LPCSTR lpTemplateName,
HWND hWndParent,
DLGPROC lpDialogFunc,
LPARAM dwInitParam
);其中lpDialogFunc用来指出DialogBoxParamA的显示地址,这个就是显示的内容的关键参数。由于汇编的入参是和从右到左,我们可以从上图知道传递的参数是4010F5。我们跳转至该区域得到稍微往下翻就能的到下图:
由上图我们得到这几个字符串的地址分别为。40110A,401141,401123。我们等下就是要用自己的字符串替换掉这几个。
4.再次跳往401280处编写补丁得到下图:
字符串修改完毕折后需要跳转至OEP处。但是还需修改一处:401083,这个地址本来是跳转至OEP的,但是我们现在要让他跳往我们的补丁位置。如下图:
5.以为大功告成了吗?直接这样保存的话肯定无法运行。我们先保存下来运行以下试试。
保存之后果然无法运行!那么问题出在哪里呢?接下来才是本次补丁最为关键的地方。我们都是知道地址为401007后面的大小为7F代码和004010F5下面的大小为154的区域都是加密的,其中我们的关键跳转401083就在这块被加密过一次的大小为7F的区域内!!假如我们直接把代码修改成jmp 401080,其机器码为E9 81 01,保存后这句代码运行时再被xor 7解密就变成了ee ff 06,解密后在运行这句代码肯定无法运行!所以我们应该现在hexworkshop中把代码修改为ee ff 06,这样运行时经过解密操作代码恢复原状了,这样才能正常运行。我们用hexworshop打开保存后的文件,找到该处的机器码,修改为ee ff 06,如下图:
点击保存,再点击原程序,正常运行!