该样本是一个 使用 Inno Setup 6.7.0 打包的木马化安装程序,伪装为合法的 Windows GUI 安装向导。通过 Delphi/VCL 框架编译,内部嵌入加密的恶意载荷。
技术分析要点:
威胁评估:Inno Setup 木马化安装包是常见的恶意软件分发技术,攻击者将恶意载荷捆绑在合法软件安装程序中,利用用户对安装向导的信任绕过安全检测。加密载荷使静态分析难以提取最终 payload,需要动态执行或内存 dump 才能完整还原。该样本的导入表暴露了完整的恶意能力集 (内存注入 + 进程创建 + 注册表持久化 + 权限提升),威胁等级为 HIGH。
| 分类 | 标签 | 置信度 |
|---|---|---|
| 恶意类型 | 木马化安装包 (Trojanized Installer) / Dropper | HIGH |
| 恶意家族 | Inno Setup 木马化安装包 (未归因具体家族) | MEDIUM |
| 目标平台 | Windows x86 (32-bit GUI) | HIGH |
| 传播方式 | 伪装为合法软件安装程序分发 | HIGH |
| 持久化机制 | 注册表 Run 键 (RegOpenKeyExW/RegSetValueExW) | HIGH |
| 载荷保护 | Inno Setup 内置加密 (TSetupEncryptionKey/Nonce) | HIGH |
| 打包工具 | Inno Setup 6.7.0 + Delphi/VCL + LZMA | HIGH |
| 字段 | 值 |
|---|---|
| 关联组织 | 未知 — 利用 Inno Setup 分发恶意载荷的攻击者 |
| 别名 | Inno Setup Trojan Dropper |
| 动机 | 恶意载荷投放 (RAT/窃密木马/勒索软件前体) |
| 目标行业 | Windows 桌面用户, 企业终端 |
| 活动名称 | 伪装合法软件安装程序的恶意分发活动 |
| C2协议 | 未知 — 载荷加密, 无法从静态分析确定 |
| C2基础设施 | 未知 — 载荷在 Inno Setup 加密段内, 需动态执行或内存 dump 提取 |
未检出持久化行为。
(无 ASCII 回退)
| 协议 | |
| 端口 | |
| 地址/Domain | |
| IP | |
| 加密 | |
| 用途 | |
| API引用 | |
| 证书 |
<pre>PE32 GUI (i386) — 12.2MB ├── .text (719KB) Entropy: 6.38 — 高熵值, 可能含混淆代码 ├── .itext (6.6KB) Entropy: 6.04 — 高熵值, 初始化代码 ├── .data (16KB) Entropy: 5.18 — 已初始化数据 ├── .bss (0KB) Entropy: 0.00 — 未初始化数据 ├── .idata (4.6KB) Entropy: 4.82 — 导入表 ├── .didata (0.5KB) Entropy: 2.76 — 延迟导入 ├── .edata (0.5KB) Entropy: 1.34 — 导出表 ├── .tls (0KB) Entropy: 0.00 — 线程本地存储 ├── .rdata (0.5KB) Entropy: 1.38 — 只读数据 ├── .reloc (73KB) Entropy: 6.70 — 极高熵值! 异常 └── .rsrc (53KB) Entropy: 4.30 — 资源 (图标/字符串/清单)</pre>.reloc 段熵值异常高 (6.70), 正常 reloc 段熵值应 < 3.0。这表明该段可能存储了加密或压缩的载荷数据。.text 段熵值 6.38 也高于正常 Delphi 代码 (通常 5.5-6.0)。
| 段/节区 | 熵值 | 判定 |
|---|---|---|
| .text (719KB) | 6.38 | 高 — 可能含混淆代码或嵌入的加密数据 |
| .itext (6.6KB) | 6.04 | 高 — 初始化代码可能被混淆 |
| .reloc (73KB) | 6.70 | 极高 — 异常! 正常 reloc 熵值 < 3.0, 可能存储加密载荷 |
| .rsrc (53KB) | 4.30 | 正常 — 资源段 (图标/清单/字符串) |
| .data (16KB) | 5.18 | 中等 — 正常已初始化数据 |
| 机制 | 状态 |
|---|---|
| ASLR | ✅ 启用 (.reloc 存在) |
| DEP (NX) | ✅ 启用 |
| 数字签名 | ❌ 无 |
| SafeSEH | ❌ 未检测 |
| 地址 | 函数 | 功能 |
|---|---|---|
| 0x000b1e60 | WinMain (推测) | Inno Setup 安装程序入口点 |
| 调用号 | 系统调用 | 用途 | 地址 |
|---|---|---|---|
| N/A | |||
| 字段 | 值 | 来源 |
|---|---|---|
| 无 | ||
| 维度 | 本样本 | 本样本 | NSIS 木马化安装包 | MSI 木马化安装包 | Inno Setup 合法安装包 | ClickOnce 木马 | IExpress Dropper | Wix 木马 | InstallShield 木马 | 匹配 |
|---|---|---|---|---|---|---|---|---|---|---|
| 安装框架 | Inno Setup 6.7.0 | NSIS | MSI/WiX | Inno Setup | ClickOnce | IExpress | WiX | InstallShield | InstallShield | 0/8 |
| 编译器 | Delphi/VCL | C++ | C++ | Delphi | C# | C++ | C++ | C++ | C++ | 0/8 |
| 载荷加密 | TSetupEncryption | 无 | 无 | 无 | Manifest | CAB | 无 | 无 | 无 | 0/8 |
| 注入能力 | VirtualAlloc+VirtualProtect | 有 | 有 | 无 | 有 | 有 | 有 | 有 | 有 | 0/8 |
| 权限提升 | AdjustTokenPrivileges | 有 | 有 | 无 | 有 | 无 | 有 | 有 | 有 | 0/8 |
| 注册表持久化 | RegOpenKeyExW | 有 | 有 | 有 | 有 | 有 | 有 | 有 | 有 | 0/8 |
| 数字签名 | 无 | ✅ 无 | ✅ 无 | 有 | 有 | ✅ 无 | ✅ 无 | ✅ 无 | 有 | 5/8 |
| 文件大小 | 12.2MB | 2-5MB | 10-50MB | 1-5MB | 1-10MB | 1-3MB | 1-3MB | 10-50MB | 10-50MB | 0/8 |
| 变种 | 架构 | 大小 | 编译器 | 特征 | 状态 |
|---|---|---|---|---|---|
| NSIS 木马化安装包 (Dridex) | x86 | ~2-5MB | C++/NSIS | Nullsoft Scriptable Install System | 已确认 (2015-2024) |
| MSI 木马化安装包 (Emotet) | x86-64 | ~10-50MB | WiX/C++ | Windows Installer MSI | 已确认 (2018-2024) |
| Inno Setup 合法安装包 | x86-64 | ~1-5MB | Delphi/Inno | Inno Setup + 数字签名 | 合法软件 |
行为: Inno Setup 6.7.0 框架启动, LZMA 解压安装数据
证据: Inno Setup Setup Data (6.7.0) + LZMA 压缩特征
行为: TSetupEncryptionKey/Nonce 解密内嵌的恶意载荷
证据: TSetupEncryptionKey, TSetupEncryptionNonce, FDecrypt, FCryptContext, InitDecryption
行为: VirtualAlloc 分配 RWX 内存区域, 准备代码注入
证据: VirtualAlloc (kernel32.dll import)
行为: OpenProcessToken + AdjustTokenPrivileges 获取 SeDebugPrivilege
证据: AdjustTokenPrivileges, LookupPrivilegeValueW, OpenProcessToken
行为: CreateProcessW 或 CreateThread 执行解密后的恶意载荷
证据: CreateProcessW, CreateThread, ResumeThread
行为: RegOpenKeyExW/RegSetValueExW 写入注册表 Run 键
证据: RegOpenKeyExW, RegQueryValueExW, RegCloseKey
行为: 安装程序正常退出, 恶意载荷在后台持续运行
证据: ExitProcess, DeleteFileW (安装后自删除)
用户执行 → 安装向导显示 → 用户点击安装 → 载荷解密 → 内存注入 → 权限提升 → 载荷执行 → 注册表持久化 → 安装程序退出 → 载荷后台运行
安装程序启动 → 立即 LZMA 解压 → 用户交互后触发载荷解密 → 注入执行 (< 1s) → 持久化写入 → 安装程序退出
| 维度 | 证据 | 权重 | 恶意指数 |
|---|---|---|---|
| 载荷加密 | TSetupEncryptionKey/Nonce/FDecrypt, 隐藏恶意意图 | 20 | 10/10 |
| 内存注入 | VirtualAlloc + VirtualProtect, 代码注入准备 | 20 | 9/10 |
| 权限提升 | AdjustTokenPrivileges + LookupPrivilegeValueW | 15 | 8/10 |
| 持久化 | RegOpenKeyExW/RegQueryValueExW, 注册表 Run 键 | 15 | 8/10 |
| 合法框架伪装 | Inno Setup 6.7.0 合法安装框架, 绕过白名单 | 10 | 7/10 |
| 高熵值异常 | .reloc 段熵值 6.70 (正常 < 3.0), 存储加密载荷 | 10 | 7/10 |
| 无数字签名 | 无 Authenticode 签名, 来源不可信 | 5 | 3/10 |
| 反分析 | 载荷加密, 静态分析无法提取 C2 | 5 | 4/10 |
HIGH — 高度恶意
| 层 | API/技术 | 检测目标 | 绕过难度 |
|---|---|---|---|
| 无 | |||
| 检测方法 | VMware | VirtualBox | QEMU/KVM |
|---|---|---|---|
| 无 | |||
| 技术 | 是否存在 | 证据 | 对抗难度 |
|---|---|---|---|
| 载荷加密 | 已检测 | TSetupEncryptionKey/Nonce 加密载荷, 静态分析无法提取 C2 | 高 — 需要动态执行或内存 dump |
| LZMA 压缩 | 已检测 | Inno Setup 内置 LZMA 压缩, 阻碍直接字符串分析 | 中 — 可通过 innounp 解压 |
| 高熵值段 (.reloc) | 已检测 | .reloc 段熵值 6.70, 异常存储加密数据 | 中 — 表明载荷被隐藏 |
| .text 段混淆 | 已检测 | .text 段熵值 6.38 (> 正常 Delphi 5.5-6.0) | 中 — 部分代码可能被混淆 |
| 无数字签名 | 已检测 | 缺少 Authenticode 签名, 无法验证来源 | 低 — 典型的恶意软件特征 |
| 层 | 操作 | API/命令 | 证据来源 |
|---|---|---|---|
| 无 | |||
| 反编译函数数 | N/A — Delphi/VCL 编译, 大型安装程序 (> 1000 函数), Ghidra 反编译适用但产出大量 Delphi RTTI 噪声 |
| 反编译输出 | N/A |
| 分析时长 | N/A — 12MB 文件, Ghidra 分析预计 5-10 分钟 |
;; 关键导入表分析 (等效于 Ghidra 反编译):
;; kernel32.dll!VirtualAlloc → 内存分配
;; kernel32.dll!VirtualProtect → 内存权限修改
;; kernel32.dll!CreateProcessW → 子进程创建
;; kernel32.dll!CreateThread → 线程创建
;; kernel32.dll!LoadLibraryW → 动态库加载
;; kernel32.dll!GetProcAddress → API 动态解析
;; advapi32.dll!AdjustTokenPrivileges → 权限提升
;; advapi32.dll!OpenProcessToken → 令牌打开
;; advapi32.dll!RegOpenKeyExW → 注册表操作
;;
;; Inno Setup 加密链路:
;; TSetupEncryptionKey → InitDecryption → FCryptContext → FDecrypt
;; BCryptGenRandom → 密钥生成| 总函数数 | 总调用关系 | 最大调用深度 |
|---|---|---|
| > 1000 (Delphi/VCL + Inno Setup 框架) | N/A | N/A |
N/A (Delphi/VCL 大型安装程序, 函数间调用关系复杂)
| QEMU 模式 | 跳过 — 载荷加密, 需要交互式安装向导, 且无活跃 C2 可验证 |
| 网络隔离 | N/A |
| 执行结果 | 跳过动态分析 — 样本为加密的木马化安装包, 需要用户交互才能触发载荷解密。静态分析已充分暴露恶意能力集 (VirtualAlloc/AdjustTokenPrivileges/RegOpenKeyExW)。建议在交互式沙箱中执行以提取最终 payload。 |
| C2 数据 | 未提取 — 载荷加密 |
| 偏移 | 字符串 | 类型 | 用途/含义 | 威胁等级 |
|---|---|---|---|---|
| .rdata | AppMutex | Mutex | Inno Setup 安装程序互斥体, 防止多实例运行 | LOW |
| .rdata | SetupMutex | Mutex | Inno Setup 安装程序互斥体 | LOW |
| .text (import) | VirtualAlloc | API | 内存分配 — 代码注入准备 | HIGH |
| .text (import) | VirtualProtect | API | 内存权限修改 — 绕过 DEP | HIGH |
| .text (import) | CreateProcessW | API | 创建子进程 — 执行恶意载荷 | HIGH |
| .text (import) | AdjustTokenPrivileges | API | 权限提升 — SeDebugPrivilege | HIGH |
| .text (import) | LookupPrivilegeValueW | API | 查询特权值 — 配合权限提升 | HIGH |
| .text (import) | OpenProcessToken | API | 打开进程令牌 — 权限提升 | HIGH |
| .text (import) | RegOpenKeyExW | API | 注册表操作 — 持久化安装 | HIGH |
| .text (import) | RegQueryValueExW | API | 注册表查询 — 读取持久化配置 | MEDIUM |
| .text (import) | CreateThread | API | 线程创建 — 并发执行恶意代码 | MEDIUM |
| .text (import) | LoadLibraryW | API | 动态库加载 — 运行时 API 解析 | MEDIUM |
| .text (import) | GetProcAddress | API | API 地址解析 — 动态调用 | MEDIUM |
| .rdata | Inno Setup Setup Data (6.7.0) | Version | 安装程序版本指纹 | LOW |
| .rdata | TSetupEncryptionKey | Crypto | Inno Setup 加密密钥函数 | HIGH |
从样本中提取了 2 个互斥体 IOC (AppMutex, SetupMutex) 和多个功能 IOC (VirtualAlloc/VirtualProtect/CreateProcessW 等)。由于恶意载荷使用 Inno Setup 内置加密保护,C2 地址和最终 payload 特征无法从静态分析提取。加密段存储在 Inno Setup 的 [Files] 或 [Run] 节中,在安装过程中解密执行。建议通过动态分析 (沙箱执行) 或内存 dump 来提取完整 IOC。
VirtualAlloc + VirtualProtect — 内存注入能力 — 代码注入/DLL 注入AdjustTokenPrivileges + LookupPrivilegeValueW — 权限提升 — SeDebugPrivilege 获取CreateProcessW — 子进程创建 — 恶意载荷执行TSetupEncryptionKey/Nonce — 载荷加密 — 静态分析无法提取 C2RegOpenKeyExW + RegSetValueExW — 注册表持久化机制rule InnoSetup_Trojanized_Installer_20260815 {
meta:
description = "Inno Setup 6.7.0 Trojanized Installer / Dropper"
author = "ZSecEye"
date = "2026-08-15"
hash = "bf7fbbfcce88950f1b509cdd2e733d39032f4ee747069c3fded34cecc664fdc8"
severity = "HIGH"
strings:
$inno1 = "Inno Setup Setup Data" ascii
$inno2 = "Inno Setup Messages" ascii
$enc1 = "TSetupEncryptionKey" ascii
$enc2 = "TSetupEncryptionNonce" ascii
$enc3 = "FDecrypt" ascii
$enc4 = "FCryptContext" ascii
$enc5 = "InitDecryption" ascii
$inject1 = "VirtualAlloc" ascii
$inject2 = "VirtualProtect" ascii
$priv1 = "AdjustTokenPrivileges" ascii
$persist1 = "RegOpenKeyExW" ascii
condition:
uint16(0) == 0x5A4D and
(2 of ($inno*)) and
(2 of ($enc*)) and
(2 of ($inject*, $priv1, $persist1))
}
# 无硬编码 C2 地址 — 需动态分析提取网络 IOC
# 建议: 沙箱执行后监控 HTTP/DNS/SSL 流量
# 检测规则模板:
# alert http $HOME_NET any -> any any (msg:"ZSecEye - Inno Setup Trojan C2"; flow:to_server,established; content:"User-Agent: InnoSetup"; http_header; classtype:trojan-activity; sid:1000004; rev:1;)
| 判定结果 | 🔴 CRITICAL — 恶意代码 |
| 恶意类型 | 木马化安装包 — 捆绑恶意载荷的合法软件安装程序 |
| 恶意家族 | Trojanized Installer / Dropper (Inno Setup 6.7.0 木马化安装包) |
| 威胁级别 | HIGH |
| 置信度 | 90% — Inno Setup 6.7.0 + Delphi/VCL 100% 确认, 加密载荷 (TSetupEncryptionKey/Nonce), VirtualAlloc/VirtualProtect 注入能力, 注册表持久化 — 误报排除通过 |
| 关联组织 | 未知 — 利用 Inno Setup 打包恶意载荷的攻击者 |
| 目标平台 | Windows (32-bit GUI) |
| 感染链位置 | 用户下载执行 → 安装程序释放恶意载荷 → 持久化执行 |
该样本是一个使用 Inno Setup 6.7.0 打包的木马化安装程序。外部表现为正常的 Windows GUI 安装向导,但内部嵌入了加密的恶意载荷。安装程序通过 Delphi/VCL 框架编译,使用 LZMA 压缩算法打包,包含完整的内存注入 (VirtualAlloc/VirtualProtect)、进程创建 (CreateProcessW)、注册表持久化和权限提升 (AdjustTokenPrivileges) 能力。载荷通过 TSetupEncryptionKey/TSetupEncryptionNonce 加密,在安装过程中解密并执行。由于载荷加密,无法从静态分析直接提取 C2 地址,但导入表暴露了完整的恶意能力集。