参考链接
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
大致思路
- 通过替换 exe 文件二进制函数代码,让程序启动时执行修改后的函数代码,从而加载恶意shellcode
- 通过修改text段,并修改OEP(程序入口点)从而免杀
- 以上两个思路,优化可以对dll进行patch,或者是shellcode使用分离加载
- 缺点也比较明显,虽然程序保留着原本的数字签名,但如果校验签名有效性是无法通过的
- 优点也明显,程序有原本的数字签名、以及原本的函数
名词解释
Windows 的可执行文件的统称,常见的 PE 文件文件拓展名有 exe、dll、sys 等,当然以它们结尾的文件不一定是 PE 文件,还需要满足一定的文件格式,这里就不细说了,上网查阅资料即可。
VA
虚拟内存地址,即 PE 文件被操作系统加载进内存后的地址,也就是 PE 基址。
相对虚拟地址,即加载到内存中 PE 文件的数据相对于PE 基址的距离,例如假设一个 exe 文件加载后的虚拟地址为 0x10000,exe 在内存中的某块数据地址为0x13000,则可以说这块数据的 RVA 为 0x3000。
文件偏移地址,某块数据相对于文件头中位置。
工具
- ida pro
- CFF Explorer
- winhex/010editor
- 打开不要求动态链接库的exe,即打开不会出现诸如此类的弹窗:"由于找不到 xxx.dll,无法继续执行代码"
- 最好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弹出计算器