摘要:本文对银狐家族一个伪装为 WPS 安装包的样本进行完整的技术分析。该样本采用 Inno Setup 打包真实安装界面作为诱饵,内部嵌套四层攻击结构,最终通过 PNG 图片 IDAT 块隐写加载加密载荷。
分析目标:理解攻击技术 → 提取检测特征 → 反哺 EDR 检测能力。本文是银狐样本分析系列的实践笔记,从真实样本中持续学习恶意软件的技术原理与对抗思路。
在终端安全对抗的无声战场上,恶意软件的伪装与加载机制正经历飞速迭代。作为近年来异常活跃的威胁组织,“银狐”(Silver Fox)凭借狡猾的社工诱饵与多变的免杀技巧,屡次击穿企业内网防线。
近期,我们在实战中捕获一例高度复杂的银狐变种。该样本不仅完美复刻 WPS Office 安装界面,更在底层架构嵌套四层加载逻辑,并创造性利用 PNG 图片 IDAT 块隐写恶意载荷。本文将从静态结构还原、隐写原理剖析到反分析机制识别,对该样本展开全链路深度剖析。
一、 披着羊皮的狼:诱饵伪装与攻击链全景
初始样本 win-64-wps.exe 体积高达 289.43 MB,庞大的身躯极具迷惑性。通过 Inno Setup 拆包工具(如 Innoextract)提取后,我们发现其内部包含一个 273 MB 的真实 WPS 安装包(用于掩人耳目)以及多个隐藏的恶意组件。受害者双击后,Inno Setup 脚本(CompiledCode.bin)会优先静默释放恶意组件至 %APPDATA% 目录下,随后拉起伪造的 WPS 安装界面。当逼真的进度条令受害者放松警惕时,真正的杀机已在后台静默铺开:一个仅 9KB 的初始化加载器 eZOh.exe 被隐蔽触发,正式拉开多级加载序幕。
二、 深渊凝视:多层嵌套加载架构拆解
为对抗静态特征扫描与沙箱动态分析,该变种摒弃传统单体结构,转而采用极度复杂的“套娃式”多层分离加载机制。
1. 探路先锋:eZOh.exe 初始化加载器
这个仅 9KB 的 PE64 文件是整个攻击链的“发令枪”。为阻碍逆向工程,其 .text 节被植入大量基于不可达分支(Opaque Predicates)和无意义算术运算的垃圾代码(Junk Code),导致 IDA Pro 的控制流图(CFG)极度膨胀。在默认分析下仅能识别 9 个函数,实则暗藏 18 个核心功能函数。其核心逻辑主要通过 LoadLibrary 和 GetProcAddress 动态获取 API 地址,随后创建互斥体确保单一实例运行,并为后续解密器的注入准备内存空间。
// 关键 API 调用监控
> ntdll.dll: NtOpenEvent("Global\SC_AutoStartComplete")
> ntdll.dll: NtOpenEvent("\SAM_SERVICE_STARTED")
> ADVAPI32.dll: RegOpenKeyExW("HKLM\SYSTEM\Setup")
2. 幕后推手:B1prkVq.bRV 解密执行器
环境准备就绪后,加载器随即调用 1.41 MB 的 B1prkVq.bRV。此 PE64 DLL 伪造了 2009 年编译时间戳,其核心特征为极度精简的导入表——仅保留 KERNEL32.dll 的内存分配与释放函数。
其调用系统 API 的秘诀在于:PEB 遍历与 API 哈希动态解析。执行器首先通过 GS:[0x60] 获取 PEB(进程环境块),遍历 InMemoryOrderModuleList 链表找到 ntdll.dll 和 kernel32.dll 的基址。随后,它解析导出表(Export Directory),计算每个导出函数名的自定义哈希值(如 ROR13 算法),与硬编码的哈希列表比对,从而隐蔽地解析出所需 API 的绝对地址。此外,该 DLL 的 .text 节(熵值高达 7.996)在磁盘上呈整体加密态,运行时通过内部硬编码的 RC4 密钥进行内存就地解密(In-Place Decryption)并跳转执行,极大地提升了静态分析门槛。
三、 暗度陈仓:PNG 图片中的 IDAT 隐写术
若前两层尚属常规免杀,第四层的隐写术堪称该样本的“点睛之笔”。攻击者释放名为 1Re6oHei.Go 的文件。虽以 .Go 为后缀,但其文件头魔数 89 50 4E 47 彻底暴露其真实身份——一张合法的 PNG 图像。
隐写的奥秘源于对 PNG 规范的极致利用。 标准 PNG 图像数据存储于 IDAT 块 并经 zlib 压缩。一旦图像解码器识别到 zlib 流结束标记,便会中止像素解析。银狐正是精准拿捏了这一特性:
- 合法图像区:
首个 IDAT 块(约 32KB)包含了真实的图像数据。标准解析器读取到完整的 zlib 结尾标志(00 00 00 00 IEND)前,会停止对后续像素数据的渲染。 - 静默隐写区:
在合法的 zlib 流结束后,攻击者利用自定义脚本追加了多个伪造的 IDAT 块。这些块内部并未遵循 zlib 压缩格式,而是直接塞入了高达 14.5 MB 经 AES-256-CBC 加密的 Shellcode 与最终载荷(如 Cobalt Strike Beacon)。 - 校验欺骗与提取:
攻击者重新计算了所有包含恶意数据的 IDAT 块的 CRC32 校验值,使其完美通过 PNG 格式规范校验。解密执行器在内存中读取该 PNG 文件,通过特征码匹配定位到附加的 IDAT 块,提取出加密数据,并使用硬编码的 AES 密钥完成解密与反射式注入(Reflective DLL Injection)。
四、 幽灵驻留:基于 SYSTEM\Setup 的高权限持久化
在持久化阶段,银狐摒弃了易被拦截的 Run 键值或计划任务,将黑手伸向 HKLM\SYSTEM\Setup。
通过篡改 CmdLine 和 Upgrade 键值,样本实现了极其隐蔽的高权限驻留。具体而言,恶意软件将 HKLM\SYSTEM\Setup\CmdLine 的值修改为执行其恶意 DLL 的 rundll32 命令,并将 SetupType 设为 2,SystemSetupInProgress 设为 1。系统下次启动时,会在用户登录界面前的 OOBE(开机体验)或系统配置阶段,直接以 NT AUTHORITY\SYSTEM 的最高权限拉起恶意载荷。这种方式不仅无声跨越了 UAC(用户账户控制)限制,还由于其执行时机极早,能够轻易绕过部分未实现启动早期保护(ELAM)的安全软件。
五、 防微杜渐:基于实战的检测要点与防御建议
1. 文件与静态特征层面的异常狩猎
- 警惕“虚胖”的安装包:
体积异常巨大(>100MB),带有“WPS”、“搜狗”等字眼的安装程序。 - 识别非标准扩展名与伪装:
监控内网中出现的 .bRV、.Go 等罕见后缀文件。 - 关注多媒体文件熵值:
体积大于 10MB 且内部数据块熵值异常接近 8.0 的图片文件。
2. 动态行为与内存层面的深度监控
- 异常的事件同步:
EDR 策略应监控进程调用 NtOpenEvent 等待 SC_AutoStartComplete或SAM_SERVICE_STARTED等系统级全局事件的行为,这常被恶意软件用于判断系统是否已完全启动。 - 敏感注册表防篡改:
企业应通过 HIPS 或 EDR 规则,将 HKLM\SYSTEM\Setup\CmdLine和SetupType纳入核心注册表防护与监控策略,严禁非系统更新进程修改。 - API 动态解析拦截:
监控进程的内存访问与 PEB 遍历行为,特别是针对导入表异常精简、却在内存中大量调用敏感 API(如 VirtualAlloc,CreateRemoteThread)的模块。 - 内存扫描与注入检测:
部署定期的内存扫描策略,检测未对应磁盘文件的可执行内存页(MEM_PRIVATE & PAGE_EXECUTE_READWRITE),以发现反射式注入的解密载荷。
夜雨聆风