Skip to content

参考链接

https://github.com/sunwu57/patch-study

https://github.com/yinsel/BypassAV

https://xz.aliyun.com/news/14518

https://github.com/Neo-Maoku/expandTextSection/tree/v1.0.0

https://forum.butian.net/share/4085

大致思路

  1. 通过替换 exe 文件二进制函数代码,让程序启动时执行修改后的函数代码,从而加载恶意shellcode
  2. 通过修改text段,并修改OEP(程序入口点)从而免杀
  3. 以上两个思路,优化可以对dll进行patch,或者是shellcode使用分离加载
  4. 缺点也比较明显,虽然程序保留着原本的数字签名,但如果校验签名有效性是无法通过的
  5. 优点也明显,程序有原本的数字签名、以及原本的函数

名词解释

Windows 的可执行文件的统称,常见的 PE 文件文件拓展名有 exe、dll、sys 等,当然以它们结尾的文件不一定是 PE 文件,还需要满足一定的文件格式,这里就不细说了,上网查阅资料即可。

VA

虚拟内存地址,即 PE 文件被操作系统加载进内存后的地址,也就是 PE 基址。

相对虚拟地址,即加载到内存中 PE 文件的数据相对于PE 基址的距离,例如假设一个 exe 文件加载后的虚拟地址为 0x10000,exe 在内存中的某块数据地址为0x13000,则可以说这块数据的 RVA 为 0x3000。

文件偏移地址,某块数据相对于文件头中位置。

工具

  1. ida pro
  2. CFF Explorer
  3. winhex/010editor

  1. 打开不要求动态链接库的exe,即打开不会出现诸如此类的弹窗:"由于找不到 xxx.dll,无法继续执行代码"
  2. 最好64位

寻找可以patch 的函数

将程序拖入 IDA,找到 WinMain 函数,并使用 F5 查看伪代码

发现有 sub_1400B3B20();``sub_1400E4200();``sub_14016CBC0();`` sub_14000A600();`` sub_1400BD530();等以sub开头的函数

确定程序运行时,会调用以上任意一个函数

使用 IDA 的动态调试功能,确认sub_1400B3B20();是程序加载时必要的函数,其他几个都可以试试,这里以sub_1400B3B20();作为案例

,用原本的sub_1400B3B20();

获取函数对应的FOA(文件偏移)

sub_1400B3B20();只要1400B3B20填入cff,获得文件偏移为B2F20

shellcode

生成shellcode

.\pe2shc.exe .\calc.exe calc3.bin

将calc转化为shellcode

.\sgn.exe -i .\calc3.bin

使用sgn对calc二进制文件进行混淆、进一步减少特征

修改段属性

修改.text属性为可写入

取消DLL可移动(ASLR)

记得保存文件!!!!

将shellcode插入程序中

使用winhex打开保存后的程序calc3.bin.sgn

calc3.bin.sgn二进制数据写入对应位置(文件偏移B2F20)

执行

双击everything2.exe弹出计算器

思路二实现步骤

https://forum.butian.net/share/4085