一种基于patch免杀技术的自动化实现VT0
字数 2060 2025-08-24 16:48:16
基于Patch免杀技术的自动化实现详解
1. 技术背景与原理
1.1 免杀技术概述
Patch免杀技术是一种通过修改合法PE文件中的特定函数代码,将其替换为恶意shellcode的技术。这种技术的优势在于:
- 保留了原始文件的合法签名和大部分静态特征
- 利用了合法程序的执行流程,降低了行为分析的检测率
- 在VT(VirusTotal)等扫描引擎中能保持较低的检测率
1.2 技术核心原理
该技术的核心在于:
- 选择一个合法PE文件(如7za.exe)
- 分析其执行流程,找到适合patch的函数
- 将目标函数替换为恶意shellcode
- 保持文件其他部分不变,特别是数字签名(虽然patch后签名会失效)
2. 前置知识要求
要理解和实现这种技术,需要掌握以下知识:
2.1 PE文件结构
- PE头结构
- 节区(Section)概念
- 虚拟地址(VA)、相对虚拟地址(RVA)和文件偏移(FO)的转换
2.2 Shellcode编写
- 编写位置无关的机器码
- 考虑shellcode体积限制
- 规避常见杀软检测模式
2.3 逆向分析基础
- IDA Pro基本使用
- 函数调用流程分析
- 汇编指令识别
3. 手动Patch流程详解
3.1 选择目标函数
以7za.exe为例,分析其main函数调用流程:
- 使用IDA分析程序,定位到main函数
- 分析main函数调用的子函数:
- sub_14004E4A0(体积小,不适合)
- sub_1400550B0(体积大,适合)
选择目标函数的标准:
- 函数体积较大(便于替换)
- 位于主函数执行流程中
- 最好位于.text节区首部
- 替换的shellcode体积尽量小
3.2 地址转换
- 使用PE工具(如PE bear)获取函数的RVA
- 使用CFF Explorer将RVA转换为VA和文件偏移(FO)
- 示例:VA=0000000140001000,FO=00000400
3.3 实际Patch操作
- 使用010 Editor等二进制编辑器打开目标文件
- 定位到目标函数的文件偏移位置
- 用shellcode替换原函数代码
- 测试patch后的文件功能(如弹计算器)
4. 自动化实现方案
4.1 自动化Patch的挑战
手动patch流程可以自动化,但面临以下问题:
- 如何自动识别符合条件的函数?
- 如何处理不同编译器、架构的差异?
- 如何确保patch的函数确实会在执行流程中被调用?
4.2 关键解决思路
4.2.1 函数识别
通过以下特征识别函数开头:
- push ebp/rbp
- sub esp/rsp
4.2.2 绕过CRT初始化
- CRT通常调用
__security_init_cookie - 在x64程序中,CRT函数通常作为第二个call调用
- 不同编译器的CRT实现不同,需要更通用的识别方法
4.2.3 主函数识别
通过特征指令识别主函数:
- 查找
mov r8, xxx操作码 - 向下查找最近的call指令,通常就是main函数
4.2.4 函数大小评估
通过函数结构评估其大小:
- 从push rbx到ret指令的地址差代表函数相对大小
- 选择大小合适的函数进行patch
4.3 BinarySpy工具实现
4.3.1 工具依赖
- Python 3.x
- tkinter(GUI界面)
- pefile(PE文件操作)
- capstone(反汇编)
4.3.2 核心功能函数
-
地址转换函数
va_to_rva(pe, va): VA转RVArva_to_offset(pe, rva): RVA转文件偏移
-
节区操作函数
replace_text_section(): 替换.text节区extract_text_section(): 提取.text节区
-
自动化Patch函数
find_crt_function(): 查找CRT函数入口- 查找
mov r8指令附近的call定位main函数 - 分析main函数调用链,选择合适函数patch
4.3.3 GUI界面
使用tkinter实现图形界面,包含:
- 文件选择框
- 地址输入框
- 执行按钮
- 操作状态提示
5. 实战注意事项
-
目标文件限制
- 目前仅支持x64架构的C程序
- 要求CRT为程序入口的第二个jmp
-
编译器差异
- 不同编译器(MSVC/GCC等)生成的CRT不同
- 不同编译选项可能导致函数结构变化
-
Shellcode要求
- 体积尽量小,不超过被替换函数大小
- 考虑使用位置无关代码
-
函数选择
- 必须位于程序执行流程中
- 优先选择体积较大的函数
- 注意patch后数字签名会失效
6. 参考资源
7. 总结
基于patch的免杀技术通过精妙的二进制修改,实现了在保持文件大部分合法特征的同时插入恶意代码。自动化工具BinarySpy通过分析PE结构、识别关键函数和智能patch,大大简化了这一过程。然而,这种技术也受到编译器差异、平台限制等因素影响,需要根据实际情况调整策略。