乐于分享
好东西不私藏

伪装成腾讯元宝 AI 安装包使用白加黑方式加载银狐木马变种样本分析

伪装成腾讯元宝 AI 安装包使用白加黑方式加载银狐木马变种样本分析

点击上方蓝字关注我们

在吉宙实验室例行威胁样本追踪过程中,发现一个伪装成腾讯元宝 AI 安装包,将其上传至吉星云诱捕分析平台 (https://decoymini.com) 进行检测,检测结果如下:
进程详情
网络行为
释放的文件

样本信息

腾讯元宝 AI 安装包
样本是一个大小为 58MB 的 32 位程序
其中附加数据大小占了总体积 95% 以上,非常可疑。浏览附加数据,发现末尾有如下特征 (magic -> ADVINSTSFX)
经搜索后得知使用了 Advanced Installer 进行了打包,它是一款收费的 MSI 安装工具,官网:https://advancedinstaller.com。以往打包程序都是 Innon Setup、Setup factory 和 NSIS,这个倒是很少见,DIE 也未检测出,以下为目录结构

解 包

网上并没找到解包器,于是花了点时间逆向了 Advanced Installer 目录结构,用 Rust 手搓了一个解包器,源码已上传至 https://github.com/decoymini/AdvancedInstallerExtractory,解包如下

其中包含 3 个文件

  • 5B0D69A\FILES.7z

  • 5B0D69A\您的应用程序.7z

  • 您的应用程序.ini

ini 配置文件内容
运行后根据 ini 配置文件会将两个压缩文件解压释放到 %APPDATA%\您的公司\您的应用程序 1.0.0\install 目录下,您的应用程序.7z 中只包含一个名为您的应用程序.msi 文件,大小为 5.17 MB
其中包含待释放的文件,这些文件是包含在 FILE.7z 中,大小为 53.3MB
根据 CustomAction 字段可知 msi 运行后会执行两个文件 bluesoleil_assistant.exe 和 yuanbao_2.76.1.626_x64.exe

分 析

主体文件运行后提示
说明有反虚拟化操作
在 msi 文件 LaunchCondition 表中存在 AI_DETECTED_VIRTUAL_MACHINE 执行条件
AI_DETECTED_VIRTUAL_MACHINE 不是 MSI 的标准属性,它是 Advanced Installer 可自定义添加属性
当定义该属性时,打包程序会将 SoftwareDetector.dll 打包进安装程序中
在 CustomAction 表中也存在 SoftwareDetector.dll
当安装程序运行时,会临时将数据解包分多次写入到 %TEMP% 目录下,其实这个 MSIxxxx.tmp 文件就是 SoftwareDetector.dll,执行 OnDetectSoftware 导出函数,执行完后删除
在 OnDetectSoftware 导出函数中,调用 GetSystemFirmwareTable 获取固件信息

从中提取以下信息:

  • Manufacturer

  • Model

  • BIOS

将获得值与一份黑名单比较

若存在则将 AI_DETECTED_VIRTUAL_MACHINE 设置为 1
bluesoleil_assistant.exe 和 yuanbao_2.76.1.626_x64.exe 均为两个带有有效签名的文件,大小分别为 37.2KB 和 50.7MB
两个文件均无害,bluesoleil_assistant.exe 为一个蓝牙助手程序,yuanbao_2.76.1.626_x64.exe 为腾讯元宝 AI 安装包程序,经进一步分析发现,bluesoleil_assistant.exe 加载的一个 DLL 有问题,这个 DLL 为 bssdk.dll。

bssdk.dll

bsssdk.dll 中导出函数有 741 个
741 个导出函数都指向同一个地址 0x10001900
由上图可知这 741 个导出函数为空函数,这个就非常可疑了。既然全是空函数,那下一步的调查点是 DLL 入口了,在入口中调用的 sub_10001910 中会对目录下的 gif.png 进行操作
查看此 png 文件二进制信息,发现并不是标准的 png 格式,可能是经过加密的载荷,此文件大小为 109KB
将文件内容读入到缓冲区并执行相关操作
解密算法 (多个 XOR)
根据伪代码用 Python 进行还原
import structdef decrypt_data(data):    # int32_t xmm1[0x4] = *"{{{{{{{{{{{{{{{{"    key = 0x7b    key_bytes = bytes([key] * 16)    result = bytearray(data)    length = len(result)    i = 0    aligned_len = length & 0xfffffff0    while i < aligned_len:        # 取16字节块        block = result[i:i+16]        # *arg1 = _mm_add_epi8(*arg1 ^ xmm1, xmm1) ^ xmm1        temp = bytearray(16)        for j in range(16):            # 先异或            xor_val = block[j] ^ key_bytes[j]            # 再加(模拟8位溢出)            add_val = (xor_val + key_bytes[j]) & 0xFF            # 最后异或            temp[j] = add_val ^ key_bytes[j]        result[i:i+16] = temp        i += 16    # 处理剩余字节    remaining = length - i    if remaining > 0:        for j in range(remaining):            idx = i + j            # byte ^= 0x7b; byte += 0x7b; byte ^= 0x7b            b = result[idx]            b ^= key            b = (b + key) & 0xFF            b ^= key            result[idx] = b    return bytes(result)def decrypt_file(input_file, output_file):    with open(input_file, 'rb'as f:        encrypted_data = f.read()    decrypted_data = decrypt_data(encrypted_data)    with open(output_file, 'wb'as f:        f.write(decrypted_data)if __name__ == "__main__":    decrypt_file("gif.png""decrypted_payload.bin")
解密出来就是一个 PE 文件

通过 LoadLibrary 和 GetProcAddress 获取以下 API 地址

  • VirtualFree

  • VirtualAllocEx

  • VirtualProtectEx

  • VirtualQueryEx

  • WriteProcessMemory

  • GetThreadContext

  • SetThreadContext

  • ZwUnmapViewOfSection

这一组 API 通常用于注入,此注入方式为 Process Hollowing,最终执行解密后的 PE

解密后的文件

解密后的文件是一个 32 位 PE 文件
入口处还挺简单
在对 sub_405e50 查看时,发现了熟悉特征
C2 配置特征
C2 为 23[.]226.57.16:771
木马功能在线程函数 sub_406130 中,结合流量数据和线程函数功能可判断为银狐木马,关于此类木马功能分析在此不再展开。

总 结

本次分析的样本是一个利用 Advanced Installer 打包、具备反虚拟化检测能力的木马程序。安装程序通过检测固件信息规避虚拟环境,随后释放带有有效数字签名的腾讯元宝作为掩护,而恶意核心功能则隐藏在蓝牙助手程序加载的 bssdk.dll 中。该 DLL 在入口点解密同目录下伪装成 gif.png 的加密文件,使用 Process Hollowing 注入方式将木马注入合法进程执行,实现远程控制。

该样本通过多层打包、加密、合法软件捆绑及进程注入等技术,有效规避了常规安全检测,其攻击手法成熟,最终载荷赋予攻击者完全控制受感染主机的权限,构成严重威胁。

IoCs

Hash:

  • 212d6b6ed3c8910e12580e8d7f5844f1471aa4e4be50261f9402c8569fad6377

C2:

  • 23[.]226.57.16:771