一种基于patch免杀技术的自动化实现VT0
字数 2060 2025-08-24 16:48:16

基于Patch免杀技术的自动化实现详解

1. 技术背景与原理

1.1 免杀技术概述

Patch免杀技术是一种通过修改合法PE文件中的特定函数代码,将其替换为恶意shellcode的技术。这种技术的优势在于:

  • 保留了原始文件的合法签名和大部分静态特征
  • 利用了合法程序的执行流程,降低了行为分析的检测率
  • 在VT(VirusTotal)等扫描引擎中能保持较低的检测率

1.2 技术核心原理

该技术的核心在于:

  1. 选择一个合法PE文件(如7za.exe)
  2. 分析其执行流程,找到适合patch的函数
  3. 将目标函数替换为恶意shellcode
  4. 保持文件其他部分不变,特别是数字签名(虽然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函数调用流程:

  1. 使用IDA分析程序,定位到main函数
  2. 分析main函数调用的子函数:
    • sub_14004E4A0(体积小,不适合)
    • sub_1400550B0(体积大,适合)

选择目标函数的标准:

  • 函数体积较大(便于替换)
  • 位于主函数执行流程中
  • 最好位于.text节区首部
  • 替换的shellcode体积尽量小

3.2 地址转换

  1. 使用PE工具(如PE bear)获取函数的RVA
  2. 使用CFF Explorer将RVA转换为VA和文件偏移(FO)
    • 示例:VA=0000000140001000,FO=00000400

3.3 实际Patch操作

  1. 使用010 Editor等二进制编辑器打开目标文件
  2. 定位到目标函数的文件偏移位置
  3. 用shellcode替换原函数代码
  4. 测试patch后的文件功能(如弹计算器)

4. 自动化实现方案

4.1 自动化Patch的挑战

手动patch流程可以自动化,但面临以下问题:

  1. 如何自动识别符合条件的函数?
  2. 如何处理不同编译器、架构的差异?
  3. 如何确保patch的函数确实会在执行流程中被调用?

4.2 关键解决思路

4.2.1 函数识别

通过以下特征识别函数开头:

  • push ebp/rbp
  • sub esp/rsp

4.2.2 绕过CRT初始化

  1. CRT通常调用__security_init_cookie
  2. 在x64程序中,CRT函数通常作为第二个call调用
  3. 不同编译器的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 核心功能函数

  1. 地址转换函数

    • va_to_rva(pe, va): VA转RVA
    • rva_to_offset(pe, rva): RVA转文件偏移
  2. 节区操作函数

    • replace_text_section(): 替换.text节区
    • extract_text_section(): 提取.text节区
  3. 自动化Patch函数

    • find_crt_function(): 查找CRT函数入口
    • 查找mov r8指令附近的call定位main函数
    • 分析main函数调用链,选择合适函数patch

4.3.3 GUI界面

使用tkinter实现图形界面,包含:

  • 文件选择框
  • 地址输入框
  • 执行按钮
  • 操作状态提示

5. 实战注意事项

  1. 目标文件限制

    • 目前仅支持x64架构的C程序
    • 要求CRT为程序入口的第二个jmp
  2. 编译器差异

    • 不同编译器(MSVC/GCC等)生成的CRT不同
    • 不同编译选项可能导致函数结构变化
  3. Shellcode要求

    • 体积尽量小,不超过被替换函数大小
    • 考虑使用位置无关代码
  4. 函数选择

    • 必须位于程序执行流程中
    • 优先选择体积较大的函数
    • 注意patch后数字签名会失效

6. 参考资源

  1. PE文件结构分析
  2. 免杀样本分析
  3. CRT安全Cookie文档
  4. Shellcode示例

7. 总结

基于patch的免杀技术通过精妙的二进制修改,实现了在保持文件大部分合法特征的同时插入恶意代码。自动化工具BinarySpy通过分析PE结构、识别关键函数和智能patch,大大简化了这一过程。然而,这种技术也受到编译器差异、平台限制等因素影响,需要根据实际情况调整策略。

基于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转RVA rva_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. 参考资源 PE文件结构分析 免杀样本分析 CRT安全Cookie文档 Shellcode示例 7. 总结 基于patch的免杀技术通过精妙的二进制修改,实现了在保持文件大部分合法特征的同时插入恶意代码。自动化工具BinarySpy通过分析PE结构、识别关键函数和智能patch,大大简化了这一过程。然而,这种技术也受到编译器差异、平台限制等因素影响,需要根据实际情况调整策略。