银狐应急

本文首发先知社区:https://xz.aliyun.com/news/92230

一、起因

2026.5.8 15:16,朋友告诉我说他的电脑又被黑了,黑客又用他的电脑给微信群里面群发广告

二、初步排查

由于这次上线与之前相隔时间不远并且上线后的行为高度一致,我想当然的以为上次清除的不干净,鉴于上次是创建了一个服务项作为后门,所以这里去查询安装新服务的系统日志,筛选id为7045,没有看到可疑的,然后常规排查服务项和计划任务也没有收获,倒是用户的开机自启动目录C:\Users\hp\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup下有两个文件很奇怪

1

lnk指向”C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\sgfeedbackhelper.exe”

2

虽然还有一个sgfeedbackhelperz.exe和sgfeedbackhelper.exe长得很像,有点奇怪,但是查看sgfeedbackhelper.exe的属性和签名,好像都没问题

3

于是我没有深究这里,开始按最朴素的方式排查->查外联

netstat -anob,执行完还真有收获:

4

查一下威胁情报

5

到这里就确认了外联进程

6

sgfeedbackhelper.exe…………嘶,这不是刚才那个搜狗程序吗???回到”C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm”仔细端详这个sgfeedbackhelper.exe

7

签名信息也是一样的,这里没太搞明白,如果exe是正常的那就是有个黑dll,而且大概率里在同级目录下,这里我打开ProcessMonitor尝试查看他的行为

8

不看不知道,一看就知道,这又加载了一个dll,但是这是正常的dll,先不管

9

但是下面的比较有意思:在C:\Users\hp\AppData\Roaming\Tencent\beacon目录下进行了LockFile和UnLockFileSingle操作,本来看到beacon有点激动,后来了解了一下,Tencent Beacon是腾讯官方出品的一个PC端的数据分析、崩溃上报与遥测SDK,是正常的。

这里还有一个外联IP,查一下威胁情报:

10

这里有点奇怪,不知道为什么会有两个外联IP
到这里我决定把这个进程杀掉,重新运行,想看一下他在加载的时候到底在哪加载的dll

11

简单看了一下没找到,决定先放下,先对后门进行一个清除,后续在IDA里面分析一下,最后在虚拟机里面再仔细观察一下

三、样本分析

3.1 sgfeedbackhelper.exe

sgfeedbackhelper.exe 是搜狗输入法的”用户反馈助手”程序,具有合法的数字签名:

  • 签名者:Beijing Sogou Technology Development Co., Ltd.
  • PDB路径:E:\landun\pinyin_agent\workspace\...\sgfeedbackhelper.pdb
  • 运行时通过 CheckSig3 ~ CheckSig10 系列函数校验自身签名,验证签名者为 “sogou” / “Beijing Sogou Technology Development Co., Ltd.”

该EXE的IAT(导入地址表)静态导入了同级目录下的两个DLL:

  1. HWSignature.dll → 导入函数GenHWID
  2. ImageMagik.dll → 导入函数 ImageMagickEx_FreePNGBuffer / ImageMagickEx_SVGToPNGBufferByDpi

12

3.2 hwsignature.dll

hwsignature.dll的大小达到了577MB,显然更可疑,IDA打开hwsignature.dll查看导入表

13

发现有bcrypt.dll的调用,而HWSignature.dll从导出函数名看是生成硬件指纹的模块,该功能不需要对称加解密操作,因此导入表中出现的BCrypt系列API是明显异常,由此入手分析。

在Imports窗口双击BCryptDecrypt跳转到其IAT条目,然后按X查看交叉引用,IDA会列出所有引用了该地址的代码位置,可以快速定位到实际调用它的恶意函数。

BCryptDecrypt 的交叉引用指向 sub_100173B0,反编译

14

不难看出这是一个解密的函数,而BCryptGenerateSymmetricKey函数的调用说明这是一个对称加解密,从下图可以看出密钥长度是128,且设置了分组链接模式

15

对 sub_100173B0 再次按X追溯调用者,定位到sub_100177B0,然后对sub_100177B0按X最终定位到 sub_10010B30,反编译该函数可以看到:

16

这里 v68 被设置了字符串 "123" 后,作为参数传入了sub_100177B0:

17

而sub_100177B0又调用了sub_100173B0,sub_100173B0 内部会把传入参数补零到16字节后用于 BCryptGenerateSymmetricKey——可以合理判断 "123" 是解密密钥,asvv.txt是加密数据

3.3 解密验证

已知条件:128位对称加密、有分组链接模式、密钥为 "123"。Windows BCrypt支持的128位对称算法中AES最常见,分组链接模式最常用的是CBC和ECB。逐一尝试:

  • AES-128-ECB,密钥 "123" 补零至16字节 → 仅第一个16字节块解密正确,后续数据损坏
  • AES-128-CBC,密钥 "123" 补零至16字节,IV为全零 → 全部解密正确,输出为有效PE文件

18

19

最终确认算法为 AES-128-CBC,密钥 “123” 零填充至16字节,IV全零。

解密 asvv.txt 得到PE DLL(446,480字节),解密 shouhu.txt 得到PE EXE(733,200字节)。

3.4 C2地址提取

解密得到的DLL需要进一步分析其通信目标。

首先对解密后的DLL提取所有ASCII字符串,未发现任何IP地址格式的内容。在CFF Explorer中查看asvv.dll的节表:

段名 大小(文件) 用途
.text 0xB000 (44KB) 代码
.rdata 0x1000 (4KB) 只读常量
.data 0x5D000 (380KB) 可读写数据

.data段的体积是代码段的近9倍——对一个44KB代码的DLL来说异常庞大,说明内部嵌入了大量数据内容。

在CFF Explorer中点击.data节查看其十六进制内容,注意到大面积的如下模式:

20

每个可见字符后面紧跟 00 字节,这是UTF-16LE编码的特征(ASCII范围的字符在UTF-16LE中高位字节恒为0)。

这与之前分析hwsignature.dll时的观察一致——IDA反编译中出现的 L"ChainingMode"、L"asvv"、L"123" 等字面量均带有 L"" 前缀,表明该程序框架内部统一使用UTF-16LE(宽字符)处理字符串。既然加载器使用UTF-16LE,其释放的payload中配置数据采用同样编码也在预期之中。

UTF-16LE字符串提取

对整个DLL文件按UTF-16LE编码提取所有字符串,提取所有3个字符以上的字符串

21

提取结果中包含大量有情报价值的字符串

杀软检测列表(反杀软/环境感知)

RAT(Remote Access Trojan,远程访问木马)内嵌了一份安全软件进程名列表,用于检测受害者主机的防护状况:

地区 产品
中国 360安全卫士、金山毒霸、火绒安全、电脑管家、百度卫士、联想管家
韩国 安博士V3 (V3Svc.exe)、韩国胶囊 (AYAgent.aye)
巴西 PSafe反病毒 (PSafeSysTray.exe)
国际 BitDefender、Avast、NOD32、卡巴斯基、McAfee、F-Secure、AVG、Dr.Web、Comodo、QuickHeal

通信软件监控列表

进程名 软件
QQ.exe QQ
WeChat.exe 微信
WXWork.exe 企业微信
DingTalk.exe 钉钉
Telegram.exe Telegram

反分析工具检测

包含网络分析和进程监控工具的进程名列表:

工具 用途
Wireshark / Fiddler 网络抓包
ApateDNS DNS欺骗/监控
TCPEye / CurrPorts TCP连接监控
Process Monitor / Process Explorer 进程行为分析
Metascan 多引擎扫描

系统信息收集

  • HDD:%d块 %d Gb Free %d Gb Mem: %d Gb — 硬盘和内存信息格式化模板
  • SOFTWARE\Microsoft\Windows NT\CurrentVersion + InstallDate — 读取系统安装日期
  • 运行时间:%s 开机时间:%d.%d.%d-%d:%d: — 记录运行时长和开机时间

C2配置字符串

在提取结果中,以下两条长字符串明显区别于上述内容——它们是结构化的配置数据:

1
2
0x046fc8: |0:db|0:lk|0:hs|1:ld|0:ll|0:hb|1:pj|...|6666:3o|32.022.832.602:3p|...
0x063fb8: |0:db|0:lk|0:hs|1:ld|0:ll|0:hb|0:pj|...|644:3o|72.601.312.211:3p|...

这两条字符串具有明显的结构化特征:以 | 为分隔符,每个字段格式为 value:key,且包含带点号的数字序列。

22

格式分析与解码

观察 32.022.832.602——含有点号分隔的数字,形似IP地址但数值不合法,尝试将其逐字符反转:

1
2
3
4
32.022.832.602  →  206.238.220.23
72.601.312.211 → 112.213.106.27
6666 → 6666
644 → 446

最终提取到两组C2通信地址:

C2地址 端口
206.238.220.23 6666
112.213.106.27 446

3.5 UTF-16LE解码hwsignature.dll

同样的思路,解码hwsignature.dll看一下也有一些发现:

1
2
0x042fe0: SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA
0x043068: SOFTWARE\Policies\Microsoft\Windows Defender\DisableAntiSpyware

23

转到IDA

24

显示sub_100105F0引用了这两条注册表路径,双击sub_100105F0跳转过去

25

合理推测这个dll禁用了UAC和Windows Defender

四、复现

根据前文的分析,我决定在win10虚拟机运行一下这个木马对分析的准确性进行验证,验证中发现

  1. 木马确实进行了注册表修改操作:
  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA → 0

  • HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\DisableAntiSpyware → 1

26

27

28

但在受害者win11的机器上,只修改了EnableLUA这一项,并没有对DisableAntiSpyware进行修改,于是我继续筛选sgfeedbackhelper.exe对注册表进行修改的事件,尝试验证AI给的分析结论是否和样本真实的行为一致,发现sgfeedbackhelper.exe并没有修改注册表,反而是sgfeedbackhelperz.exe对注册表进行了2处修改

29

30

这不禁让我思考,为什么这个操作不是由sgfeedbackhelper.exe来完成,sgfeedbackhelperz.exe在这个白加黑中扮演什么样的角色?为什么win11上面没有修改DisableAntiSpyware?于是我打开了idaAI进行分析。结果如下:

4.1 sgfeedbackhelperz.exe 的角色

sgfeedbackhelperz.exe 和 sgfeedbackhelper.exe 是完全相同的二进制文件(搜狗官方EXE的两份拷贝),但它们加载的 hwsignature.dll 内部通过命令行参数决定执行不同的代码路径。

hwsignature.dll 主线程 StartAddress(0x1000F890)中存在一个关键分支(0x1000F9D7):

1
2
3
4
5
6
// sub_1001DB30 解析 GetCommandLineW(),返回参数数组
int v88 = argument_array_byte_size;
if ((v88 & 0xFFFFFFFC) == 4) { // 恰好有1个额外命令行参数(32位指针=4字节)
goto sub_100105F0; // → 注册表修改路径
}
// 否则 → 进入C2主逻辑(加载payload、网络通信)

在 sgfeedbackhelper.exe 的C2主逻辑中(0x100103F0),存在以下调用:

1
2
3
// sub_10018B20:从a-z + A-Z(52字符)中随机生成6字符字符串
char* randomArg = generate_random_string(); // 例如 "kRmXfQ"
ShellExecuteW(0, L"open", L"sgfeedbackhelperz.exe", randomArg, 0, 0);

因此,完整的执行逻辑是:

进程 启动方式 命令行参数 分支结果 职责
sgfeedbackhelper.exe 开机LNK启动 无 v88=0 → 条件不满足 C2主逻辑:解密asvv.txt、反射加载RAT、网络通信
sgfeedbackhelperz.exe 被上者ShellExecute启动 随机6字符(如”kRmXfQ”) v88=4 → 条件满足 调用sub_100105F0:禁用UAC + 禁用Defender → ExitProcess退出

设计意图(推测): 将高风险的注册表修改操作隔离到独立进程中执行后立即退出。即使该操作被安全软件拦截或导致进程崩溃,也不会影响主C2进程的存活。随机参数仅作为”触发开关”使用,具体内容无意义,目的是避免固定命令行特征被检测规则匹配。

4.2 为什么 DisableAntiSpyware 没有生效

sub_100105F0(0x100105F0)中两条注册表写入是顺序执行的,代码如下:

1
2
3
4
5
6
7
sub_10012120(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableLUA");
sub_100161E0(nullptr); // 写入 DWORD 0 → 成功

sub_10012120(L"SOFTWARE\\Policies\\Microsoft\\Windows Defender\\DisableAntiSpyware");
sub_100161E0((HKEY)1); // 写入 DWORD 1 → 被阻止

ExitProcess(0); // 不检查返回值,直接退出

sub_100161E0(0x100161E0)底层调用 RegOpenKeyExW + RegSetValueExW,但函数的返回值从未被 sub_100105F0 检查——即使写入失败,代码也静默继续。

根本原因: Windows 11 的 Tamper Protection(篡改防护)会拦截对 Windows Defender 策略键的注册表写入。该保护在内核层面(WdFilter.sys)生效,即使进程拥有管理员权限,RegSetValueExW 也会返回 ERROR_ACCESS_DENIED(或静默丢弃写入),但不会终止调用进程。由于代码不检查返回值并立即 ExitProcess,攻击者无法感知写入失败。

而 EnableLUA 属于 Policies\System 键,不受 Tamper Protection 保护,因此管理员权限即可修改成功。

总结: 这不是代码逻辑问题,而是Windows安全机制的主动防御。攻击者的代码尝试了两项修改,但Win11的篡改防护阻止了其中一项。

  1. sgfeedbackhelper.exe确实加载了同级目录下的hwsignature.dll来实现白加黑

31

  1. sgfeedbackhelper.exe在同级目录下读取了asvv.txt

32

  1. shouhu.txt的加载则是由sgfeedbackhelperz.exe来完成的

33

五、AI分析

以下是结合IDA逆向和AI辅助分析的完整结论:

5.1 开发者画像与攻击目标

杀软检测列表中以中文直接标注各产品名称(如”微软杀毒”、”小红伞”、”麦咖啡”),而非使用英文原名或代号,说明开发者的母语为中文。结合杀软列表大量覆盖中国国产安全软件、通讯软件监控列表几乎全为中国主流办公工具、以及RAT配置中分组标识直接使用中文”默认”——攻击目标明确锁定中国用户。

5.2 反分析环境检测

上述反分析工具列表覆盖了恶意软件分析人员常用的完整工具链。RAT运行时枚举当前进程,若发现这些工具正在运行则判定处于分析环境中,可能采取静默退出、延迟执行或隐藏部分功能等规避策略。这说明开发者对安全研究人员的分析手法有充分了解。

5.3 样本概述

文件名 大小 说明
sgfeedbackhelper.exe 3.29MB 搜狗官方签名的合法程序(白利用载体)
sgfeedbackhelperz.exe 3.29MB 与上者MD5完全一致的副本
hwsignature.dll 577MB 恶意DLL(膨胀至577MB用于反沙箱)
ImageMagik.dll 6.15MB 合法的ImageMagick图像处理库
asvv.txt 446KB 加密的Payload/配置数据
shouhu.txt 733KB 加密的守护进程配置(”守护”)
7z.exe / 7z.dll — 7-Zip工具(用于解压部署)
7.exe / 12.exe / 15.exe 4.7~9MB 自定义加壳投递器(详见下文分析)
1.zip 8MB 银狐工具包部署压缩包(ZipCrypto加密)

sgfeedbackhelper.exe 哈希:

  • MD5:be9d0fd7235fd9c760acabe2b26502ff
  • SHA256:b2230f1e1e4fe538eb3c513e6612d82453e708ac94373b155624a656620f1bbc

5.4 攻击手法:DLL侧加载

当Windows加载EXE时,会按照DLL搜索顺序优先从EXE所在目录加载这些DLL。攻击者将恶意的 hwsignature.dll(577MB)放置于同一目录,实现侧加载。

5.5 EXE功能分析

WinMain (0x4242c0) 执行流程:

  1. sub_4240C0 — 初始化日志/错误上报系统(pzt_name → “fd.start”)
  2. sub_421B40 — SGFeedbackApp::InitApp,初始化COM、DUI界面框架
  3. sub_422070 — 创建互斥量 SGFeedbackHelperUnique_E6BAD41F_84A0_4638_BF15_F5BFE746C12E,启动SGFeedbackUIThread线程,打开CEF浏览器窗口加载搜狗帮助页面
  4. CoUninitialize → 清理退出

关键发现:EXE本身不包含任何网络外联代码。其WS2_32导入(gethostbyname/WSAStartup)仅用于 DuiLib::CIPAddressUI 控件获取本机IP地址。所有C2通信均由侧加载的恶意DLL完成。

5.6 恶意DLL深入分析

hwsignature.dll文件结构:

偏移范围 大小 内容
0x0 ~ 0x8AA00 554KB 真实PE代码(32-bit DLL)
0x8AA00 ~ 0x2268AA00 ~550MB NULL字节填充(反沙箱)
0x2268AA00 ~ 0x2268DEA8 13.5KB Authenticode证书(Thawte/Symantec时间戳签名)

PE Security Directory指向文件尾部的证书,中间全部为0x00填充。这种结构使Windows仍能验证签名,同时让文件膨胀至577MB。

导出函数(陷阱设计):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 0x1000f840 - GenHWID(EXE调用的导入函数)
int GenHWID() {
Sleep(INFINITE); // 永远挂起,不返回
return dword_1004F354();
}

// 0x1000f830 - DLLGenHWID
int DLLGenHWID() {
Sleep(INFINITE); // 同样永远挂起
return dword_1004F358();
}

// 0x1000f850 - GetDllVersionA
int GetDllVersionA() {
Sleep(INFINITE);
return dword_1004F350();
}

关键发现:所有导出函数均为Sleep(INFINITE)陷阱。EXE调用GenHWID后会永远阻塞在该调用上,但恶意代码已在DllMain阶段通过创建线程启动执行。这是一个精巧的设计——EXE的正常UI线程被冻住,进程保持存活但不产生可疑的窗口行为。

DllMain执行链:

1
2
3
4
5
6
7
8
DllEntryPoint (0x100232cb)
└→ dllmain_dispatch (0x10023195)
└→ DllMain (0x10016990)
├── 初始化COM (CoInitializeEx)
├── 获取DPI信息 (GetDpiForMonitor)
├── 初始化GDI+
├── 创建 rg_n11031::rg_n21430 对象
└── sub_10016880() ← 核心恶意入口

**反调试机制 (sub_10016880)**:

1
2
3
4
5
6
7
8
9
10
int sub_10016880() {
if (IsDebuggerPresent()) {
// 调试器存在:直接创建线程
CreateThread(NULL, 0, StartAddress, NULL, 0, &tid);
return 1;
} else {
// 正常执行:通过包装函数 sub_1000F860 间接创建线程
return sub_1000F860(); // 内部同样 CreateThread(StartAddress)
}
}

两条分支最终都会创建线程执行StartAddress,但通过不同的调用路径实现——正常路径经过一层间接调用(sub_1000F860),调试器路径则直接创建线程。这种差异可能用于干扰动态分析时的断点设置。

主恶意逻辑 StartAddress (0x1000F890) — 完整执行流程:

阶段1:环境检查与权限验证

1
2
3
4
5
6
7
8
// 1. 加载advpack.dll检查管理员权限
LoadLibraryW(L"advpack.dll");
IsNTAdmin = GetProcAddress(hLib, "IsNTAdmin");
if (!IsNTAdmin(0, NULL)) {
// 非管理员:尝试提权后ExitProcess
sub_100190A0(); // UAC提权尝试
ExitProcess(0);
}

阶段2:命令行分支判断(仅sgfeedbackhelperz.exe路径触发):

触发条件(0x1000f9e8):

1
2
3
sub_1001DB30(v87);  // 解析GetCommandLineW(),返回参数个数
if ( (v88 & 0xFFFFFFFC) == 4 ) // v88为参数数组的字节大小,4字节=1个参数指针
sub_100105F0(); // 仅当传入恰好1个命令行参数时触发(内部ExitProcess,不返回)

即:sgfeedbackhelper.exe <arg> 带参数启动时才会进入此分支。从Startup LNK直接启动(无参数)的实例不会触发此函数,而是继续执行下方的主C2逻辑。

执行架构:第一个实例(LNK启动,无参数)负责C2载荷加载;它随后通过ShellExecuteW携带参数启动sgfeedbackhelperz.exe,第二个实例满足条件后触发sub_100105F0,完成安全对抗后ExitProcess退出。

sub_100105F0 完整逻辑(0x100105F0):

1
2
3
4
5
6
7
8
9
10
11
// 1. 检测ZhuDongFangYu.exe → 如果存在,启动3个线程执行sub_10010700(解密"K360\K"相关数据对抗360)
// 2. 启动3个线程执行sub_10011500 → 解密shouhu.txt(守护进程)
// 3. 禁用UAC:
sub_10012120(L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Policies\\System\\EnableLUA");
sub_100161E0(nullptr); // 写入值 0(DWORD)→ EnableLUA = 0
// 4. 禁用Windows Defender:
sub_10012120(L"SOFTWARE\\Policies\\Microsoft\\Windows Defender\\DisableAntiSpyware");
sub_100161E0((HKEY)1); // 写入值 1(DWORD)→ DisableAntiSpyware = 1
// 5. 退出
sub_1000CCC0();
ExitProcess(0);

阶段3:互斥量与单实例控制

1
2
3
4
5
6
7
8
// 通过OpenEventW检查是否已有实例运行
// 事件名称从加密配置"bh"中读取
if (OpenEventW(EVENT_ALL_ACCESS, FALSE, eventName)) {
// 已有实例,执行清理后退出
ExitProcess(0);
}
// 创建事件,标记当前实例
CreateEventW(NULL, FALSE, FALSE, eventName);

阶段4:安全软件检测(进程枚举)

1
2
3
4
5
6
7
// 使用CreateToolhelp32Snapshot遍历进程列表
// 检查以下安全软件是否运行:
sub_1000CB30("ZhuDongFangYu.exe"); // 360主动防御
sub_1000CB30("360tray.exe"); // 360安全卫士托盘
sub_1000CB30("360Tray.exe"); // 同上(大小写变体)
sub_1000CB30("360sd.exe"); // 360杀毒
sub_1000CB30("360Safe.exe"); // 360安全浏览器

如果检测到360系列安全软件,设置标志v104=0跳过部分持久化操作。

阶段5:持久化部署

1
2
3
4
5
6
7
8
// 使用SHGetSpecialFolderPath(CSIDL_STARTUP=7) 获取启动目录
SHGetSpecialFolderPathW(NULL, path, 7, FALSE); // → %APPDATA%\...\Startup
// 通过COM IShellLink接口创建LNK快捷方式
CoCreateInstance(CLSID_ShellLink, ...); // {00021401-...}
// 设置目标为sgfeedbackhelper.exe
IShellLink->SetPath(exePath);
// 保存到启动目录
IPersistFile->Save(lnkPath, FALSE);

阶段6:启动载荷线程并执行副本

1
2
3
4
// 创建关键工作线程
CreateThread(NULL, 0, sub_10010B30, NULL, 0, &tid); // ← 载荷注入线程
// ShellExecute启动sgfeedbackhelperz.exe(相同MD5的副本)
ShellExecuteW(NULL, L"open", L"sgfeedbackhelperz.exe", args, NULL, SW_SHOW);

5.7 载荷解密与反射加载

sub_10010B30:

这是hwsignature.dll最核心的功能——一个完整的反射式PE加载器。

金山毒霸检测:

1
2
3
4
5
6
7
8
// 首先等待kxetray.exe(金山毒霸)退出
sub_100198E0("kxetray.exe"); // 返回PID
if (pid) {
for (int i = 0; i < 5; i++) {
Sleep(2000);
if (!FindProcess("kxetray.exe")) break;
}
}

AES解密:

1
2
3
4
5
6
// 使用BCrypt API进行AES-128解密
// 密钥:"123"(硬编码明文,padding至128-bit/16字节)
BCryptOpenAlgorithmProvider(&hAlg, L"AES", NULL, 0);
BCryptSetProperty(hAlg, L"ChainingMode", chainingMode, ...);
BCryptGenerateSymmetricKey(hAlg, &hKey, NULL, 0, "123\0...", 16, 0);
BCryptDecrypt(hKey, ciphertext, cipherLen, NULL, iv, 16, plaintext, outLen, &actualLen, 0);

解密参数:

  • 算法:AES-128(密钥长度128-bit,*pbInput = 128)
  • 密钥:字符串 "123" 经零填充至16字节(0x31 0x32 0x33 0x00...)
  • 模式:CBC(零IV,即16字节全0)
  • 已通过实际解密验证:解密后得到合法PE(MZ头 + 有效e_lfanew指向PE签名)

载荷来源:获取当前DLL所在目录路径,拼接 "asvv" + ".txt" 构成完整文件路径后读取

反射式PE加载(内存映射执行):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 解密后的数据是一个完整的PE DLL
// 1. 验证PE格式
if (decrypted[0:2] == "MZ" && PE_HEADER->Signature == "PE\0\0") {
// 2. 检查Machine=0x014C(i386)且是DLL(Characteristics & 0x2000)

// 3. 分配RWX内存
base = VirtualAlloc(preferredBase, totalSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);

// 4. 复制PE头
memmove(base, decrypted, headersSize);

// 5. 映射各Section
for (each section) {
memmove(base + section.VirtualAddress, decrypted + section.PointerToRawData, section.SizeOfRawData);
}

// 6. 基址重定位(IMAGE_REL_BASED_HIGHLOW=3, IMAGE_REL_BASED_DIR64=10)
delta = base - PE_HEADER->ImageBase;
for (each relocation block) {
for (each entry) {
if (type == 3 || type == 10)
*(DWORD*)(base + offset) += delta;
}
}

// 7. 解析导入表(sub_10011940)
for (each import descriptor) {
hDll = LoadLibraryExA(dllName, NULL, 0);
for (each thunk) {
addr = GetProcAddress(hDll, funcName_or_ordinal);
IAT[i] = addr;
}
}

// 8. 调用DLL入口点
if (PE_HEADER->Characteristics & IMAGE_FILE_DLL) {
DllMain = base + PE_HEADER->AddressOfEntryPoint;
DllMain(base, DLL_PROCESS_ATTACH, NULL);
}
}

这个反射加载器的特点:

  • 支持基址重定位(type 3和type 10)
  • 使用LoadLibraryExA+GetProcAddress解析所有导入
  • 通过链表管理已加载的DLL引用计数
  • 使用InterlockedCompareExchange实现无锁链表操作

5.8 shouhu.txt守护进程加载

sub_10011500:

1
2
3
4
5
6
7
8
9
10
11
// 文件名拼接规避静态检测:
sub_1001EDB0(L"shou"); // 第一部分
sub_10021470(L"hu", ...); // 第二部分 → "shouhu"
sub_100212C0(&off_1004E11C); // 添加".txt"扩展名

// 使用相同的AES-128解密,密钥同为"123"
sub_100177B0(decryptedBuf, encData, "123", &keyParams, ...);

// 解密后通过sub_10006B60处理
// 使用rg_n11031::Process_Info类管理守护进程
sub_10006B60(processInfo, ..., &rg_n11031::Process_Info);

shouhu(守护)模块的职责(解密后通过字符串分析确认):

  • 监控主进程(sgfeedbackhelper.exe)存活状态(通过OpenProcess)
  • 主进程被杀后自动重启(通过CreateProcessA)
  • 内置金山/360安全软件对抗(与主DLL相同的检测列表)

5.9 对抗360安全软件

sub_10010700:

1
2
3
4
5
6
7
8
9
10
11
12
// 解密"K360\K"相关配置
// 拆分路径:"K360\\K" → 目录"K360" + 前缀"K"
wcsrchr(L"K360\\K", '\\'); // 分离路径和文件名

// 读取注册表路径获取360安装信息
sub_10015E20(regPath, ...);

// 使用相同的BCrypt AES解密(密钥"123")
sub_100177B0(buf, encData, "123", &keyParams, ...);

// 解密后的数据通过sub_10006B60执行
// 针对360进程实施干扰/终止操作

5.10 ImageMagik.dll 分析

  • 合法的ImageMagick/glib库
  • PDB路径:D:\data\landun\workspace\...\third_party_build\imagemagick\...
  • DllMain直接返回TRUE,无恶意行为
  • 导出函数实现真实的SVG→PNG转换功能
  • 虽然导入了WS2_32网络函数,但均为glib GIO通道的标准实现(g_io_win32_sock_write等)

5.11 HWID指纹机制

EXE中 sub_4179A0 调用 GenHWID(来自 hwsignature.dll):

1
2
GenHWID(&v5);  // 获取128-bit硬件指纹
sprintf(buf, "%08X%08X%08X%08X", ...); // 格式化为32字符HEX

但实际上GenHWID内部是Sleep(INFINITE)陷阱——EXE在调用这个函数时会被永远阻塞。真正的HWID生成和上报逻辑在反射加载的PE(asvv.txt解密后)中实现。这确保了EXE进程保持存活(作为恶意DLL的宿主),同时不会弹出搜狗反馈窗口。

5.12 加密载荷文件

asvv.txt 和 shouhu.txt 均为AES-128-CBC加密的PE文件:

  • 加密算法:AES-128-CBC(BCrypt API,算法标识符 L"AES")
  • 密钥:"123" 硬编码明文,零填充至16字节(0x31 0x32 0x33 0x00...)
  • IV:16字节全零
  • 文件名拼接规避:"asvv" + ".txt" / "shou" + "hu" + ".txt"
  • asvv.txt(446KB):解密后为易语言编写的32-bit DLL(Characteristics含0x2000),包含C2 RAT功能(键盘记录、通讯软件监控、双C2通信)
  • shouhu.txt(733KB):解密后为32-bit EXE(Characteristics=0x010F,非DLL),内含字符串sgfeedbackhelper.exe和CreateProcessA调用,负责监控主进程存活并重启

C2配置提取:使用密钥"123" AES-128-CBC模式(零IV)成功解密asvv.txt,得到一个易语言编写的32-bit DLL(446KB)。该DLL内部以逆序字符串格式存储C2配置(|reversed_value:reversed_key|),提取到两组C2:

配置 C2 IP 端口 配置日期 PE内偏移
Config 1 206.238.220.23 6666 2026.3.15 0x046fc8
Config 2 112.213.106.27 446 2026.3.9 0x063fb8

其他提取到的配置字段:

  • 分组标识(fz):默认
  • 组ID:d33f351a4aeea5e608853d1a56661059
  • 注册表持久化路径:SOFTWARE\Wancc 下的 IpDate / IpDates_info
  • RAT 内置的安全软件检测列表:360全家桶、金山、QQ电脑管家、百度杀毒、卡巴斯基(avp.exe)、BitDefender、Avast、NOD32、趋势(TMBMSRV)等
  • 键盘记录功能([esc]、[enter]、[F1]-[F12]等按键标记字符串)
  • 通讯软件监控:QQ.exe、WeChat.exe、DingTalk.exe、WXWork.exe、Telegram.exe

5.13 持久化机制

  • 通过COM接口IShellLink(CLSID: {00021401-0000-0000-C000-000000000046})在用户Startup目录创建LNK快捷方式
  • LNK指向 C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\sgfeedbackhelper.exe
  • 同时通过ShellExecuteW启动sgfeedbackhelperz.exe(相同MD5的备份副本),实现双进程驻留
  • 利用搜狗输入法的正常安装路径进行伪装,即使用户查看快捷方式属性也不易察觉异常

5.14 关于两个外联IP的解释

通过解密 asvv.txt 直接从 RAT 的 PE 中提取到两组独立的 C2 配置:

C2 IP 端口 配置写入日期
C2 #1 206.238.220.23 6666 2026-03-15
C2 #2 112.213.106.27 446 2026-03-09

每组配置内部有3个服务器槽位(p1/p2/p3),但都填写了相同的IP,说明当前没有组内冗余,而是两组之间构成双C2架构。netstat看到的两个外联就是分别连向这两个地址。

5.15 投递器分析:7.exe / 12.exe / 15.exe

5.15.1 1.zip — 银狐工具包部署压缩包

目录下存在一个1.zip(8MB,创建时间2026-03-21 11:03),使用ZipCrypto加密(ZIP flag bit 0 = encrypted, method = deflate)。通过ZIP头解析确认其内容列表为:

1
2
3
4
5
6
7
1.zip
├── ImageMagik.dll (6,155,648 bytes)
├── sgfeedbackhelper.exe (3,292,544 bytes)
├── sgfeedbackhelperz.exe (3,292,544 bytes)
├── 7z.dll (1,316,352 bytes)
├── 7z.exe ( 357,376 bytes)
└── HWSignature.dll (577,298,088 bytes → 压缩后仅961KB,因550MB为0x00填充)

这是银狐DLL侧加载工具包的完整部署压缩包。

5.15.2 三个投递器的静态分析
属性 7.exe 12.exe 15.exe
伪装身份 cTrader(外汇交易平台) Postman(API测试工具) Visions of Mana(SE游戏)
OriginalFilename cTrader.exe — VisionsofMana-Win64-Shipping.exe
架构 PE32+(x86-64) PE32+(x86-64) PE32+(x86-64)
编译时间 2026-04-05 14:30 2026-04-04 15:28 2026-03-25 15:28
数字签名 无 无 无
文件大小 9,047,552 8,812,544 4,763,136
MD5 39bd13bf7c5f99d3fe351c8873c5d3c7 4d3cad9c3065c4c3ef4f30a525eb0e6b 6d1ff03e75b8f5f7d5ae9ede10939077

PE结构(三者同构):

Section 说明 特征
.text 代码段 仅11~13KB,极小的shellcode-style stub
.rdata 只读数据 ~1.1MB,起始为DEFLATE长度表(3,4,5,…,258)
.bss 未初始化数据 ~11MB虚拟空间,0字节raw(运行时解压缓冲区)
.idata 导入表 完全为空(无任何静态导入)
.rsrc ×2 资源段 两个资源段,包含伪装图标和版本信息
OVERLAY PE尾部追加数据 7.0MB / 7.0MB / 3.0MB 加密载荷

入口点分析(以15.exe为例):

entry point(0x40146c)为一个无导入的位置无关加载器:

  • 通过PEB walking遍历InMemoryOrderModuleList获取ntdll和kernel32的基址
  • 解析目标DLL的导出表,使用API哈希(算法:hash = hash * 15 + char,逐字符累加)匹配函数名
  • 动态解析所有需要的Windows API后执行主逻辑
  • .rdata中的DEFLATE常量表用于解压缩操作
  • .bss的11MB虚拟空间作为解压后的输出缓冲区

Overlay加密格式:

1
2
[0x00 - 0x1F] 32字节顺序头:00 01 02 03 04 05 ... 1E 1F(三个文件完全相同)
[0x20 - EOF] 加密数据(熵值 = 8.00,最大值,完全随机分布)

7.exe和12.exe的overlay大小完全相同:7,340,032字节(恰好7.0MB)。15.exe为3,145,728字节(恰好3.0MB)。

5.15.3 结论与置信度

事实:

  1. 三个文件使用同一打包器生成(同构PE结构、相同的API哈希算法、相同的DEFLATE表、相同的overlay格式头)
  2. 版本信息伪造自合法软件(cTrader/Postman/Visions of Mana),但无对应数字签名
  3. 无静态导入、通过PEB walking动态解析API = Shellcode级别的反检测设计
  4. Overlay为加密载荷(熵值8.0 + 完全无可读字符串)
  5. 1.zip包含完整的银狐工具包且使用ZipCrypto加密

合理推测(基于上下文和经验,未通过动态执行验证):

  1. 这三个文件是银狐的初始感染投递器(Initial Access Dropper)——受害者以为下载的是Postman/cTrader/游戏,实际运行后释放银狐工具包
  2. 7.exe和12.exe的7MB overlay解密后极可能就是银狐工具包的内容(大小与1.zip的压缩数据部分吻合)
  3. 15.exe的3MB overlay可能是一个精简版载荷或针对不同场景的部署包
  4. 感染链:受害者运行伪装EXE → stub解密overlay → 释放文件到ExW38bJm目录 → 创建LNK持久化 → 银狐上线

无法确认的部分(需动态调试):

  • overlay的具体解密算法和密钥(在13KB的stub中,需完整逆向PEB解析后的逻辑)
  • 解密后释放的具体文件列表(只有实际解密才能100%确认)
  • 受害者具体通过哪个文件感染(三个都有可能,也可能是其他未留存的变体)

六、流程图

以下流程标注了对应的函数地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
[开机/用户登录]
│
▼
[Startup目录LNK快捷方式触发]
│
▼
[sgfeedbackhelper.exe 启动] ← 搜狗合法签名
│
├── 静态导入 ──→ [ImageMagik.dll] ← DllMain返回TRUE,无操作
│
└── 静态导入 ──→ [hwsignature.dll (577MB)]
│
▼
┌── DllMain (0x10016990) ──┐
│ COM初始化 / DPI获取 │
│ GDI+初始化 │
└──────────┬───────────────┘
│
▼
sub_10016880 (反调试分支)
IsDebuggerPresent() → 两分支均创建线程
│
▼
StartAddress (0x1000F890) ← 主恶意线程
│
┌────────────────┼────────────────┐
▼ ▼ ▼
[阶段1: 权限检查] [阶段4: AV检测] [阶段3: 互斥量]
advpack!IsNTAdmin 检测360全家桶 OpenEventW单实例
非admin→提权→退出 kxetray(金山) │
│ │ │
▼ ▼ ▼
[阶段2: 禁用安全] ┌─ 360存在时 ─┐ [阶段5: 持久化]
EnableLUA = 0 │ 3线程对抗360│ SHGetSpecialFolder
DisableAntiSpyware └─────────────┘ IShellLink创建LNK
= 1 3线程加载 │
shouhu.txt(无条件) ▼
│ [阶段6: 启动载荷]
│ CreateThread
│ + ShellExecute
│ sgfeedbackhelperz.exe
│ │
└────────┬───────┘
▼
[工作线程 sub_10010B30]
│
┌─────────────┼─────────────┐
▼ ▼ ▼
[等待金山退出] [读取asvv.txt] [AES-128-CBC解密]
最多5轮×2s 从DLL同目录 密钥:"123" IV:全0
│
▼
[验证PE格式: MZ + PE\0\0]
[Machine=0x014C, DLL标志]
│
▼
[反射式PE加载器]
├── VirtualAlloc(RWX, 0x40)
├── 复制PE头 + 映射Sections
├── 基址重定位 (type 3/10)
├── IAT解析 (LoadLibraryExA + GetProcAddress)
└── 调用DllMain(base, DLL_PROCESS_ATTACH, 0)
│
▼
[解密后的C2 RAT模块运行(易语言DLL)]
├──→ 206.238.220.23:6666
└──→ 112.213.106.27:446
│
▼
[接收远程指令:群发广告等]

═══════════════════════════════════════

[shouhu.txt守护进程 (sub_10011500)]
├── 同样AES-128-CBC解密,密钥"123",零IV
├── 文件名拼接:"shou" + "hu" + ".txt"
├── 解密后为EXE(非DLL),含"sgfeedbackhelper.exe"字符串
└── 通过OpenProcess+CreateProcessA监控主进程并重启

EXE的命运:调用GenHWID() → Sleep(INFINITE) → 永远阻塞
→ 进程保持存活作为DLL宿主,但不弹窗、不执行正常UI逻辑

关键路径:LNK → 白EXE → DLL侧加载 → DllMain → 创建线程 → AES解密asvv.txt → 反射加载PE → C2上线

七、免杀手法

  1. 白加黑(DLL Side-Loading):使用搜狗官方签名的EXE作为载体,杀软白名单信任签名程序
  2. 文件膨胀(File Inflation):hwsignature.dll膨胀至577MB,PE实体仅554KB,中间550MB为NULL填充,绕过沙箱(文件大小阈值通常100MB)和杀软扫描
  3. 导出函数陷阱:GenHWID/DLLGenHWID/GetDllVersionA均为Sleep(INFINITE),EXE调用后永久挂起,进程保活但不产生可疑行为
  4. 反射式PE加载:最终载荷(C2 RAT)不落地为独立文件,而是从加密txt解密后直接映射到内存执行,绕过文件扫描
  5. 伪装路径:植入 C:\Program Files\SogouInput\ 目录结构下,与真实搜狗输入法路径混淆
  6. 载荷加密:asvv.txt/shouhu.txt 使用AES-128-CBC加密(零IV),密钥为简单字符串”123”,静态扫描无法识别恶意内容
  7. 文件名拆分:"shou" + "hu" + ".txt" 运行时拼接,避免字符串特征匹配
  8. 合法进程外联:网络通信由白进程(sgfeedbackhelper.exe)发起,防火墙/EDR基于进程名/签名放行
  9. 运行时签名校验:EXE内置CheckSig系列函数验证自身签名有效性,增加篡改检测的欺骗性(实际EXE未被修改)
  10. 主动对抗安全软件:检测360全家桶并启动专用线程对抗,同时通过注册表禁用UAC和Windows Defender
  11. 安全软件等待:启动前等待金山毒霸(kxetray.exe)退出,最多等待10秒,避免在杀软活跃时触发告警

八、沙箱分析

这次沙箱分析的不是很给力,也许是反沙箱做的很好吧,不过我在网上找到了一些相关的沙箱分析报告,时间很接近,行为也基本一致,甚至路径都是一样的:C:\Program Files\SogouInput\15.12.0.2855\[八位随机字符]\

https://any.run/report/9d5e2993cb7369fe21013d30125626e597b94da70228328e7253540041998374/c130623c-573c-4e2a-89cc-60969c5e37bf

https://bazaar.abuse.ch/sample/14f0f6c88eae66521b0ef4fabf6542f44e0f63239e11b3be7f2d7e7a0aaebac8/

https://hybrid-analysis.com/sample/718d8efde0ba4ba81ce3d1bf56a0e1a1acaace8f2dae94677473991b27276d91

https://tria.ge/260313-xn2b9adt7l/behavioral2

感兴趣的大佬可以研究一下

九、IOC(Indicators of Compromise)

文件哈希:

  • sgfeedbackhelper.exe MD5: be9d0fd7235fd9c760acabe2b26502ff
  • sgfeedbackhelper.exe SHA256: b2230f1e1e4fe538eb3c513e6612d82453e708ac94373b155624a656620f1bbc
  • 7.exe MD5: 39bd13bf7c5f99d3fe351c8873c5d3c7(投递器,伪装cTrader)
  • 12.exe MD5: 4d3cad9c3065c4c3ef4f30a525eb0e6b(投递器,伪装Postman)
  • 15.exe MD5: 6d1ff03e75b8f5f7d5ae9ede10939077(投递器,伪装Visions of Mana)

文件路径:

  • C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\sgfeedbackhelper.exe
  • C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\sgfeedbackhelperz.exe
  • C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\hwsignature.dll(577MB)
  • C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\asvv.txt
  • C:\Program Files\SogouInput\15.12.0.2855\ExW38bJm\shouhu.txt
  • %APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup\*.lnk(指向上述EXE)

注册表修改:

  • HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\EnableLUA → 0
  • HKLM\SOFTWARE\Policies\Microsoft\Windows Defender\DisableAntiSpyware → 1

C2通信:

  • 206.238.220.23:6666(配置日期 2026-03-15)
  • 112.213.106.27:446(配置日期 2026-03-09)
  • 组ID:d33f351a4aeea5e608853d1a56661059
  • RAT配置中的注册表路径(推测用于记录C2连接状态):HKLM\SOFTWARE\Wancc\IpDate

行为特征:

  • 进程枚举(CreateToolhelp32Snapshot)检测安全软件
  • BCrypt AES-128-CBC解密(密钥”123”,零IV)
  • 反射式PE内存加载(VirtualAlloc RWX + 手动映射)
  • COM IShellLink创建启动项

十、MITRE ATT&CK 映射

战术 技术ID 技术名称 具体实现
执行 T1129 Shared Modules DLL侧加载hwsignature.dll
执行 T1620 Reflective Code Loading 内存映射解密后的PE并调用DllMain
持久化 T1547.001 Registry Run Keys / Startup Folder Startup目录LNK快捷方式
权限提升 T1548.002 Bypass UAC 注册表禁用EnableLUA
防御规避 T1574.002 DLL Side-Loading 利用搜狗签名EXE加载恶意DLL
防御规避 T1027.001 Binary Padding 577MB文件膨胀绕过沙箱
防御规避 T1027.002 Software Packing 投递器使用自定义壳(PEB walking + API hashing + DEFLATE)
防御规避 T1140 Deobfuscate/Decode Files AES-128-CBC解密asvv.txt/shouhu.txt
防御规避 T1562.001 Disable or Modify Tools 禁用Windows Defender
防御规避 T1036.005 Masquerading: Match Legitimate Name 投递器伪装cTrader/Postman/游戏
发现 T1057 Process Discovery 枚举360/金山进程
发现 T1082 System Information Discovery IsNTAdmin检查管理员权限
采集 T1056.001 Input Capture: Keylogging RAT内置键盘记录([esc]/[enter]/[F1]-[F12]按键标记)
命令与控制 T1071 Application Layer Protocol 双C2: 206.238.220.23:6666 + 112.213.106.27:446
命令与控制 T1008 Fallback Channels 两组独立C2配置,互为冗余

十一、总结

本次银狐样本采用了成熟的多层攻击架构:

  1. 投递层(推测):伪装为合法软件(cTrader/Postman/游戏)的加壳投递器,运行后解密释放银狐工具包
  2. 第一层:搜狗官方签名EXE(白文件)+ DLL侧加载(hwsignature.dll)
  3. 第二层:hwsignature.dll的DllMain完成环境准备(权限提升、安全软件对抗、持久化部署)
  4. 第三层:AES解密asvv.txt并反射加载为内存PE,作为最终C2 RAT运行
  5. 守护层:shouhu.txt解密后为独立EXE,通过OpenProcess/CreateProcessA监控sgfeedbackhelper.exe存活并自动重启

密钥为硬编码的”123”(AES-128-CBC,零IV),解密asvv.txt后提取到完整的C2配置:206.238.220.23:6666 和 112.213.106.27:446,组ID为d33f351a4aeea5e608853d1a56661059。解密后的RAT为易语言编写的DLL,具备键盘记录和通讯软件监控(微信/QQ/钉钉/Telegram)功能。GenHWID导出的Sleep(INFINITE)陷阱让宿主EXE永远停留在DLL初始化阶段,既保持进程存活又不触发任何GUI行为。

关于感染入口(推测):目录下发现了三个伪装为合法软件的投递器(7.exe/12.exe/15.exe)和一个包含完整银狐工具包的加密ZIP(1.zip),受害者极大概率是误下载并运行了其中某个投递器而感染。


银狐应急
http://example.com/2026/05/09/银狐2/
作者
想有双手
发布于
2026年5月9日
许可协议