Skip to content

样本分析复健:从行为观察到攻击链重建与检测线索提取

· 22 min

最近参加面试拿到了一个银狐样本,但是限于面试时间比较短,没有办法完全走完一整个完整的样本分析流程。看都看了看到一半就撇了,总感觉如鲠在喉如芒刺背,所以本文将是一篇以分析思路为导向的样本分析复健指南。同时也适合新手参考,属于最具备实际效益样本分析方法论。当然,如果有什么能够改进升级的地方,欢迎给我留言分享和指正,我将不胜感激。

本文将展示怎么从一个混乱样本里,一层一层把攻击链捋出来,并把能落地检测的点提炼出来。最终目标有三个:

一、样本分析的基本思路#

拿到未知样本时,不建议一上来就硬啃 IDA。更稳的方式是先建立画像,再用行为反推代码,最后围绕关键行为做动态跟踪。

1. 基础画像#

通过内部引擎、VT、微步或其他沙箱结果建立初步假设,先判断样本大概是什么类型、可能属于哪个家族、入口文件是什么。

2. 静态特征观察#

获取样本本身的基础信息:

3. 动态行为观察#

把样本放到隔离测试环境中运行,观察:

4. 静态代码分析#

带着前面抓到的行为进入 IDA。重点是用行为反推代码。

5. 动态代码跟踪#

当静态分析看不出有效逻辑时,再使用 x64dbg、WinDbg 或 IDA Remote Debugger 做动态跟踪。跟踪时应以行为结果为依据,围绕 API 边界和关键缓冲区定位。

如果以上步骤仍不能解决任务,可以先搁置样本,过一段时间再从头复盘。很多时候不是有什么技术难点,而是第一轮漏掉了某个关键边界。

二、样本分析环境检查#

1. 防止病毒本地运行#

存放病毒的分区必须通过组策略设置为不可运行。

  1. 运行“gpedit.msc”,打开组策略对话框。                 
  2. 在组策略中依次打开“计算机配置”→Windows设置→安全设置→软件限制策略(Software Restriction Policies)→其他规则(Additional Rules),新建路径规则,填入路径保存后重启计算机

2. 防止病毒局域网传播#

给 vmnat.exe 建“出站阻止规则”,阻止它访问远端 139/445端口。这里要选“远程端口”,不是本地端口。 图形界面做法

  1. 按 Win + R,输入 wf.msc 回车。
  2. 左侧选“出站规则”。
  3. 右侧点“新建规则”。
  4. 选择“自定义”。
  5. 程序路径填: C:\Windows\System32\vmnat.exe 如果你机器上也有这个文件,再单独建一条: C:\Windows\SysWOW64\vmnat.exe
  6. 协议选 TCP。
  7. 远程端口填: 139,445
  8. 操作选“阻止连接”。
  9. 配置文件全选:域、专用、公用。
  10. 名字可以叫: Block vmnat SMB TCP 139 445

三、进入正式拿到样本:#

解压 获取文件格式 更改后缀 Pasted image 20260604171823 是一个安装包 再用7z解压 Pasted image 20260604171927 直接去定位到disk1.cab 一般存在恶意的文件就是在这里面 解包后定位到关键文件: Pasted image 20260604172814 查验下这两个程序的证书,一黑一白,此时已经可以收敛到入口样本为:VC_radist.x64.exe

从命名上看,它伪装成 VC 运行库安装程序。实际行为更像 Inno Setup 风格的安装器/释放器。

第一层,样本基础画像。#

样本初筛参考 VT 与安全引擎命名,其中 ESET、卡巴等引擎的命名可作为家族方向参考,但不能单独作为最终归因依据。 Pasted image 20260604174418

第二层,静态特征观察。#

使用 Detect It Easy 等工具查看样本基础信息: 文件类型;数字签名;编译时间;导入表和导出表;文件来源;是否有壳、混淆、异常资源或 overlay。 Pasted image 20260604175449 当前静态观察可知,入口样本可继续解包,最外层不是最终恶意逻辑。

第三层,动态行为观察。#

样本在沙箱/测试环境中运行后,通过火绒剑、PCHunter 等行为监控工具可观察到进程、文件、注册表与网络行为。 Pasted image 20260604175944

行为监控结果#

释放或捕获到的文件如下: Pasted image 20260604211900 行为日志如下(只抓可疑的): Pasted image 20260604181722

网络侧也观察到 C2 暴露(通过微步威胁情报平台确认此情报): Pasted image 20260604183801 在微步上,除了确认家族信息,还可以获取关联样本,之后若有需要以此做拓线找同源样本很方便。

针对释放的组件做静态分析#

当前静态观察中较关键的异常点包括:

gjSum.exe 证书异常: Pasted image 20260604183235 导入函数函数名混淆: Pasted image 20260607165602

lz.L.dll 导出函数名存在混淆: Pasted image 20260604183129

Zsa9H.s.PNG 大概率是shellcode加密载荷

综合以上结果做上下文推断#

样本——>攻击链#

入口安装包 VC_radist.x64.exe
-> 落地 gjSum.exe、lz.L、Zsa9H.s
-> 启动 gjSum.exe
-> 加载 lz.L
-> 读取 Zsa9H.s
-> 执行 icacls 保护落地目录
-> 执行 PowerShell 关闭安全提醒和 UAC
-> 写入随机扩展名关联和二进制注册表数据
-> 在内存中释放多个功能模块
-> 载荷解密、config.ini 读取和 C2 生成
-> 连接 192.238.192.11:22

行为日志——>具体行为#

防护规避与目录加固#

gjSum.exe 拉起 cmd.exe 执行 icacls

Terminal window
C:\Windows\System32\cmd.exe /c icacls "." /deny "Users":(D) & icacls "." /grant "Users":(OI)(CI)(RX)

随后 cmd.exe 分别拉起两个 icacls.exe

Terminal window
icacls "." /deny "Users":(D)
icacls "." /grant "Users":(OI)(CI)(RX)

实际被设置权限的文件包括:

C:\ProgramData\uNKTL\jwffIQ\gjSum.exe
C:\ProgramData\uNKTL\jwffIQ\lz.L
C:\ProgramData\uNKTL\jwffIQ\Zsa9H.s
关闭安全提醒与关闭 UAC#

gjSum.exe 拉起两个 PowerShell 进程:

Terminal window
powershell -Command "Set-ItemProperty -Path 'HKCU:Software\Microsoft\Windows\CurrentVersion\Notifications\Settings\Windows.SystemToast.SecurityAndMaintenance' -Name 'Enabled' -Value 0 -Force"

该命令用于关闭当前用户安全和维护提醒。

Terminal window
powershell.exe -Command "New-ItemProperty -Path 'HKLM:Software\Microsoft\Windows\CurrentVersion\policies\system' -Name 'EnableLUA' -PropertyType DWord -Value 0 -Force"

随后在注册表写入:

HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA = 0
随机扩展名文件关联与 DOS 设备映射实现隐蔽启动#

Pasted image 20260607213133

在持久化阶段,样本表现出与公开银狐情报中“文件关联 + 虚拟设备映射 + PendingFileRenameOperations”组合技法高度一致的行为。该技法并非依赖传统 Run 键或直接投放可执行文件到启动目录,而是将多个看似低风险的系统机制组合使用,从而降低单点行为被安全软件拦截的概率。

首先,行为日志显示 gjSum.exe 创建随机扩展名文件关联,例如 HKLM\SOFTWARE\Classes\.f51so = Oi0S3,以及 HKLM\SOFTWARE\Classes\.6hn3A = T2efhHKLM\SOFTWARE\Classes\T2efh\Shell\Open\Command -> gjSum.exe。这意味着当系统打开对应随机扩展名文件时,会通过 Windows 文件关联机制拉起恶意主程序。由于扩展名和 ProgID 均为随机字符串,该行为不属于常见的 .exe.dll.lnk 等高敏感关联篡改,因此更容易被视为弱风险注册表修改。

其次,样本修改 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\DOS Devices\O:,将 O: 映射到 \??\C:\ProgramData\Microsoft\Windows\Start Menu\Programs。该路径是公共启动目录 Startup 的上层目录。通过这种 DOS 设备映射,样本后续可使用 O:\Startup\... 访问真实的公共启动目录,从而在行为日志和安全监控中弱化对真实启动目录路径的直接暴露。

随后,日志中出现 gjSum.exe 打开 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup\TZpf4.f51so 这类随机后缀文件的行为,说明样本确实触达了公共启动目录下的随机扩展名锚点文件。结合 PendingFileRenameOperations 相关痕迹,可以推测样本可能利用 Windows 会话管理器在重启早期执行延迟文件操作,将随机扩展名文件投放或处理到启动目录,再借助文件关联完成 gjSum.exe 的启动。

需要注意的是,样本多次运行会生成不同的随机扩展名、随机 ProgID 和随机锚点文件名,因此 .6hn3AT2efhTZpf4.f51so 等不应作为固定 IOC 使用。

除上述启动链相关注册表外,样本还写入 :

HKLM\SOFTWARE\lfvZ2cRnO7Du2-NoQl15DaoG

疑似载荷/配置。 Pasted image 20260607175647

第四层,静态代码分析。#

值得使用 IDA 做静态分析的,主要是 gjSum.exelz.L.dll。 丢到 IDA 里看,首先看左侧的 Function 表,找主函数(main、start),再搜索字符串,看下有没有值得定位的。 但这两个文件在实际分析过程中,并没有可以直接看到的有效逻辑,说明真实逻辑可能被壳、虚拟化、动态解密或内存加载隐藏。

打开 lz.L.dll,在代码中看到存在反调试/反分析相关迹象。IDA 不断崩溃、卡死,难以继续进行静态代码分析,因此直接转入下一层动态跟踪。 Pasted image 20260607191527

第五层,动态代码跟踪。#

核心思路:盯住“内存变成可执行”的瞬间,然后 dump 那块内存区域。

最实用的做法有三种

  1. x64dbg 手工抓
  2. 用 PE-sieve 自动扫
  3. 用 Process Hacker / System Informer /火绒剑 辅助定位

如果用dbg手工抓,就是传统的下断点,注意内存权限变为可执行的地方。 如果用火绒剑,选中程序,内存列表,筛选出,已提交的可执行内存,再做内存转储。 Pasted image 20260607192647 如果用 PE-sieve ,没什么特别需要说明的,对银狐/侧载/内存载荷这类,PE-sieve 经常能直接把关键区域 dump 出来。很好用。

本篇的样本在实际过程中,使用PE-sieve 从 gjSum.exe 进程中 dump 出了 628aaf0.exe

IDA 复查后确认它包含以下功能:

由此可知,628aaf0.exe 为内存驻留的目标抑制/清理子模块。

但是这些功能无法解释进程行为中出现的 PowerShell、目录 ACL、Zsa9H.s 解密与最终 C2 通信行为。因此不能把全部行为都归因到 628aaf0.exe

icacls 与 PowerShell 命令的触发来源确认#

为确认目录权限加固与 PowerShell 命令究竟由哪个模块触发,分析过程中在 gjSum.exe 进程内对 CreateProcessW 下断。命中断点时,当前 RIP 位于 kernelbase.dll 的系统 API 内部,因此不能直接以当前指令地址作为归因依据。x64 调用约定下,CreateProcessW 入口处的栈顶 [RSP] 保存了 API 返回后的调用者地址,因此通过查看 [RSP] 及调用栈中第一个非系统模块地址,可以判断真实触发来源。

CreateProcessW 命中时,参数中可见样本准备执行如下命令:

C:\Windows\System32\cmd.exe /c icacls "." /deny "Users":(D) & icacls "." /grant "Users":(OI)(CI)(RX)

此时返回地址为:

[RSP] = 00000000032ADA08

该地址在内存布局中位于无模块名的 MEM_PRIVATE 私有内存区域。由此可确认,icacls.exe 目录权限加固命令由运行时解密/加载后的内存代码发起。 Pasted image 20260607221146 Pasted image 20260607221716 该结论也解释了为什么单纯分析 gjSum.exe 的导入表、导出表或磁盘文件难以定位相关行为:关键逻辑已经转移到进程内的私有可执行内存中执行。后续针对 PowerShell 命令的触发源也可采用同样方法验证。

Zsa9H.s 解密与 shellcode 定位结果#

在后续调试中,重点围绕 Zsa9H.s 的读取、解密和执行转移进行跟踪。断点下在:

CreateFileW / ReadFile
VirtualAlloc / VirtualProtect

重点观察 Zsa9H.s 的读入缓冲区、解密前后内存变化、新建 RX/RWX 内存区域以及首次执行入口。 调试结果显示,程序会读取 Zsa9H.s,并将其内容作为后续内存载荷进行处理。原始文件内容被读入后,经过解密/变换,最终执行流转移到 0x03D70040 附近。该地址位于新建的私有可执行内存区域,因此可确认其为 Zsa9H.s 解密后 shellcode 链的第一层执行入口。

对该内存区域进行完整 dump 后,以 raw binary 方式导入 IDA 分析。由于该内存并非标准 PE 文件,不能直接按 PE 结构解析。通过 IDA MCP 辅助识别,可见两个关键函数:

0x40 ShellcodeEntry_JumpToDecoder
0x2E04 DecodePayloadInPlace_ThenRetJump

其功能可以描述为: shellcode 入口先跳转到解码器; 解码器取得内联加密载荷地址; 对后续内存区域进行原地解码/反混淆; 解码完成后通过 ret 转移到解码后的 payload 入口。

因此,0x03D70040 所在内存区域应被理解为第一层 shellcode loader 与内联加密载荷的组合,而不是最终远控模块本体。该阶段证明样本已经进入 Zsa9H.s 派生出的 shellcode 执行链,后续仍需跟踪解码器跳转后的执行流,才能获得下一层真正执行的 shellcode 或 PE 模块。

config.ini 读取与 C2 线索出现#

在继续跟踪 0x03D70040 后续执行流时,调试器观察到样本打开并读取同目录下的 config.ini。这说明 Zsa9H.s 解密出的内存代码已经进入下游配置加载流程。

在运行时继续跟踪后,内存中能够观察到 C2 地址相关内容。这表明 C2 配置并非直接以明文完整保存在磁盘文件中,而是在运行时由内存代码读取配置、解码/拼接后生成。

因此,config.ini 的读取行为可以作为连接 Zsa9H.s shellcode 与后续 C2/远控模块的重要证据:Zsa9H.s 解密后的代码负责继续加载配置,并在内存中恢复后续通信所需的 C2 信息。

后续远控/后门模块追踪结果#

继续沿 Zsa9H.s 解密后的执行链跟踪后,在内存中发现了解码出的 PE 结构内容。该内容可以被 dump 并导入 IDA,但整体混淆程度较高,代码段可读性很差,难以通过静态分析直接还原完整逻辑。

从现有线索(字符串)来看,该阶段已经不再是单纯的解密 shellcode,而是进入了下游能力模块的加载与执行流程。结合前面的配置读取、内存执行、C2 相关线索以及运行时行为,可以判断该模块具备远控/后门方向的能力特征。 Pasted image 20260608004219 由于 dump 出来的模块经过较强混淆,当前无法准确还原其完整命令集、通信协议和具体函数实现。因此,本文不对其具体远控功能做过度推断,仅将其归类为由 Zsa9H.s shellcode 链加载的疑似远控/后门模块,并将 C2 配置恢复、网络通信行为与 API 字符串作为支撑证据。

结论#

本次分析确认,该样本是一个银狐系多阶段加载样本。入口 VC_radist.x64.exe 主要负责释放组件,随后由 gjSum.exe 承载后续执行流程,并加载 lz.L、读取 Zsa9H.sconfig.ini

行为层面上,gjSum.exe 触发了目录 ACL 加固、关闭安全通知、关闭 UAC、随机扩展名文件关联、DOS 设备映射以及 Startup 随机锚点文件访问等动作。其中“随机扩展名文件关联 + DOS Devices\O: 映射 + PendingFileRenameOperations/Startup 投放”与公开银狐情报中披露的无痕启动持久化技法高度一致。

内存层面上,PE-sieve 从 gjSum.exe 中 dump 出的 628aaf0.exe 可归类为目标抑制/清理子模块,主要用于进程抑制、服务/目录清理和 TCP 连接重置,但它不能解释全部后续行为。继续跟踪 Zsa9H.s 后,执行流进入 0x03D70040 附近的私有可执行内存。IDA 分析显示该区域是第一层 shellcode loader,会继续原地解码并跳转到下一层 payload。

后续跟踪中,样本读取 config.ini 并在运行时恢复出 C2 相关内容,随后内存中出现疑似远控/后门能力模块。由于该模块混淆较强,本文不展开完整命令集和通信协议,仅将其作为后续深入分析方向。

因此,本文最终沉淀的核心价值是:从行为日志、内存 dump 和动态调试中重建了 VC_radist.x64.exe -> gjSum.exe -> lz.L/Zsa9H.s -> shellcode loader -> config/C2/疑似远控模块 的执行链,并提取出可用于检测的进程链、注册表、启动项、内存载荷和网络外连线索。