记一次Patch exe 文件实现的静态免杀
本文版权归原作者所有,转载请注明出处。
前言
常驻在微信订阅号的我,翻到一篇文章:mp.weixin.qq.com/s/b0mphQG-nny0X087JsjsKQ,这篇文章简单介绍了通过手动 Patch PE 文件来实现 VT 全绿,看完后我又想起了曾经看到的另外一篇文章,实现的思路是类似的:mp.weixin.qq.com/s/nP0IqpGvGeWagmVsWtzC9Q,于是想着动手试一试,学习一下大佬们的思路,并记录下来,仅适用于 64 位的 exe以及无重定位表的 32 位 exe,如果有可尝试去除。
实现思路
通过替换 exe 文件二进制函数代码,让程序启动时执行修改后的函数代码。
注意:程序初期运行的函数体一般不会很大,可能容不下 shellcode,像 CS、MSF
生成的 shellcode 具有不稳定性,甚至是无法上线,需要手动编写提取,尽量减少大小和特征,本文采用对 exe 文件进行两次 patch,例如:第一次 patch 程序函数 体较小的A 函数,填充自定义 shellcode,且功能仅是跳转至另一个函数体较大的 B函数,第二次 patch 是将 B 函数替换为真正的上线 shellcode,即远程加载,这种方式提高了 patch 的成功率,当然也可以实现多层跳转,甚至是函数间传递参数,让 exe 为自己所用。
名词解释
PE 文件
Windows 的可执行文件的统称,常见的 PE 文件文件拓展名有 exe、dll、sys 等,当然以它们结尾的文件不一定是 PE 文件,还需要满足一定的文件格式,这里就不细说了,上网查阅资料即可。
VA
虚拟内存地址,即 PE 文件中的数据被操作系统加载进内存后的地址。
RVA
相对虚拟地址,即加载到内存中 PE 文件的数据相对于PE 基址(PE 文件的起始虚拟地址)的距离,例如假设一个 exe 文件加载后的虚拟地址为 0x10000,exe 在内存中的某块数据地址为0x13000,则可以说这块数据的 RVA 为 0x3000。
FOA
文件偏移地址,某块数据相对于文件头中位置。