火绒安全软件

火绒安全播报
发新帖
打印 上一主题 下一主题

[分析报告] "银狐"变种: 技术分析揭穿病毒多层混淆虚拟化伪装(七)

[复制链接]
246 1
楼主
跳转到指定楼层
本帖最后由 huoronganquan 于 2025-9-27 02:49 编辑

三. 任务载荷(通过感染载荷释放的具有白签名的EXE通过任务计划侧加载的npwzwmc64.dll)分析
1. 结构分析
[1] 白签名EXE签名信息
任务载荷由计划任务启动一个具有白签名的EXE, EXE详细签名信息如下:


白签名EXE详细签名信息

[2] 通过WINDOWS签名特性修改文件哈希值
细心的读者可能注意到, 之前的感染载荷流程中, 感染载荷释放文件时将文件的最后一个字节进行了修改, 但是此处签名依然有效。
Windows在计算PE文件的哈希时会跳过文件末尾的数字签名数据,也就是WIN_CERTIFICATE结构体,该结构体由可选头的安全目录指向。其中,dwLength必须是8的整倍数,表示整个结构体的长度(包括结构体头部和它本身)。因此, 这里篡改后签名仍然有效的原理很简单,在数字签名末尾夹带数据,并对应调整结构体大小就行。
在这里被利用的白签名EXE文件中导入表中包含对"npwzwmc64.dll"的导入, 该病毒通过DLL侧载的原理, 将恶意DLL放到EXE相同路径下, 替换了本应被导入的该DLL, 从而使得DLL被加载。

白签名文件导入表信息

该DLL疑似由VMProtect进行保护, 文件详情如下

任务载荷文件详细信息

2. 执行流程分析
[1] 通过RC4解密SPACE.ICO, 将其写入白文件入口点继续执行
对任务载荷主函数进行优化, 得到代码如下:

  1. __int64 virus_main(__int64 a1, __int64 a2)
  2. {
  3.     kernel32_SetProcessShutdownParameters(1, 1);
  4.     kernel32_SetConsoleCtrlHandler(sub_7FFF678D2F00, 1);

  5.     ZeroMemory(v142, 24);
  6.     {
  7.         const unsigned char k1[8] = {122, 196, 169, 246, 204, 248, 31, 73};
  8.         qmemcpy(v132, InitializePair(v135, k1, v57), sizeof(v132));
  9.         AssignContainer(v142, v132, v58);
  10.     }

  11.     ZeroMemory(v141, 24);
  12.     {
  13.         const char k2[4] = {';', 'G', '_', 'f'};
  14.         qmemcpy(v133, InitializePair(v136, k2, v55), sizeof(v133));
  15.         AssignContainer(v141, v133, v59);
  16.     }

  17.     ZeroMemory(v140, 24);
  18.     LoadEncryptedFile(v140);

  19.     if (v18)
  20.     {
  21.         ZeroMemory(v139, 24);
  22.         ProcessEncryptedSegment(v139, v140, v142, v141);

  23.         if (v28)
  24.         {
  25.             HANDLE     hProcess = kernel32_GetCurrentProcess();
  26.             HMODULE    hModule  = kernel32_GetModuleHandleW(0);
  27.             MODULEINFO mi;
  28.             kernel32_K32GetModuleInformation_0(hProcess, hModule, v137, 24);

  29.             kernel32_WriteProcessMemory(
  30.                 hProcess,
  31.                 (LPVOID)v138,
  32.                 (LPVOID)v139[0],
  33.                 (SIZE_T)(v139[1] - v139[0]),
  34.                 v143);

  35.             kernel32_DisableThreadLibraryCalls(a1);
  36.         }
  37.         CleanupObject_0(v139, 0);
  38.     }

  39.     CleanupObject_0(v140, 0);
  40.     CleanupObject_0(v141, 0);
  41.     CleanupObject_0(v142, 0);

  42.     return 1;
  43. }
复制代码

从代码可知, 其功能为加载并通过RC4算法解密文件space.ico, 将文件写入自身进程的入口点, 从而在回到入口点时执行其自定义的代码。

任务载荷修补入口点代码图

四. 过程载荷(被任务载荷解密的SPACE.ICO)分析
过程载荷解密"vdi_ipc.dat", 通过ManualMap函数将其映射到内存中, 找到其中的导出函数"KMDrvFaxGetJobStatusType", 对其进行调用。

过程载荷主代码逻辑图

五. 最终载荷(过程载荷解密的vdi_ipc.dat)分析
1. 结构分析
该文件的大小为0x616755(6.08MB), 文件信息分析如下, 被VMProtect+OLLVM保护。

最终载荷文件分析详情图

2. 执行流程分析
由于程序混淆力度较强, 控制流杂乱, 我们主要对该程序的组成模块进行分析, 不再分析其执行条件顺序。
[1] 程序遍历所有进程, 通过进程名找到安全软件对应的进程ID并记录
搜索的安全软件名称如下:

安全软件名称列表



[2] 程序加载漏洞驱动结束安全软件进程
(1) 程序运行时读取C:\Windows\TEMP\ranchserv.jpg作为驱动文件数据
(2) 程序创建管道, 名称为"\\.pipe\ntsvcs"
(3) 程序通过RPC协议创建服务
程序通过RPC协议发送RPC_CMD_ID_CREATE_SERVICE来创建服务, 服务名称为"TCLService"
在Windows中, 进程可以通过RPC向"367abb81-9844-35f1-ad32-98f038001003"发送请求来创建服务, 在本样本中, 载荷通过RPC创建名称为"TCLService"的服务。具体原理———附录:参考文章[6]
加载驱动代码图
(4) 程序通过加载漏洞驱动并终结安全软件进程
程序通过服务加载"TrueSight"漏洞驱动, 然后打开其IO设备, 通过IO控制码0x22E044强制终结所有被搜索到的安全软件进程。
[3] 程序尝试创建或检测互斥体
名称如下:
{4E062DDA-444A-A2A8-84CE-E105F66A5AB3}
Global\8E416074-5245-AF71-E9F7-7D3194498C53
Global\3575D265-2C4F-5C20-EB78-D147D5670A9C
[4] 程序扫描火绒安全软件
程序扫描火绒主进程和主防进程, 如果在调用漏洞驱动终结进程后还存在则停止执行后续逻辑。

扫描火绒安全软件代码图

[5] 程序读取“C:\Users\Public\Music\desktopbak.ini”

读取对应文件代码图

[6] 程序枚举注册表子项“HKEY_LOCAL_MACHINE\SOFTWARE\SysConfigDate”

打开注册表键代码图

[7] 程序进一步访问下一步C&C(已下线)
在检测一系列条件后,  程序从内存中异或解密出被加密的C&C字符串。
其密文为:
  1. blob1 = bytearray(b"\x00\xEA\xCB\xDB\xF4\xD0\xC6\xD2")
  2. blob2 = bytearray(b"Lm",n,$( 2!%>b,"&)[        DISCUZ_CODE_122        ]lt;0'{585v<(r7.8`")
复制代码


密文串获取对应代码

对其算法去虚拟化后, 得到最终解密算法为将所有字节异或4。
  1. blob1 = bytearray(b"\x00\xEA\xCB\xDB\xF4\xD0\xC6\xD2")
  2. blob2 = bytearray(b"Lm",n,$( 2!%>b,"&)[        DISCUZ_CODE_123        ]lt;0'{585v<(r7.8`")
  3. for b in range(len(blob1)):
  4.     blob1[b] ^= 4
  5. for b in range(len(blob2)):
  6.     blob2[b] ^= 4
  7. url = blob1.decode() + blob2.decode()
  8. print(url)
复制代码

最终代码解密结果

目前该病毒C&C已失效, 后续流程通常是继续获取用户主机的控制权, 从而在用户主机中布置远控后门, 实现个人信息的窃取和利用。具体细节可查看参考文章中往期分析对银狐样本的报告。

五、结语
该样本总体上来说攻击方法相比较之前的银狐样本并未有太大改变, 在往期分析报告中也分析到过与本文样本行为相似的恶意样本, 地址在参考文章中。———附录:参考文章[5]
与往期分析报告不同的是, 本文样本的代码混淆强度和方式得到了明显提升, 这背后可能对应着一条完整的"免杀"产业链。在"黑客"群体中, 有这样一种人: 其掌握着对代码进行混淆、变异等各种手段欺骗安全软件使其对原本"报毒"的样本不再报毒的手段, 专门通过为其他人的病毒提供"免杀"服务来谋取利益。
但是只要代码还需要被二进制化执行, 就一定可以被分析。其考验安全从业人员的功底, 也意味着安全软件的自动化分析流程不断面临新的挑战。

六、附录
参考文章:
HASH:
C&C:


回复

使用道具 举报

246 1
沙发
发表于 5 天前 | 只看该作者
可算看完了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | [立即注册]

本版积分规则

快速回复 返回顶部 返回列表