伪装成腾讯元宝 AI 安装包使用白加黑方式加载银狐木马变种样本分析在吉宙实验室例行威胁样本追踪过程中,发现一个伪装成腾讯元宝 AI 安装包,将其上传至吉星云诱捕分析平台 (https://decoymini.com) 进行检测,检测结果如下:其中附加数据大小占了总体积 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 配置文件会将两个压缩文件解压释放到 %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 获取固件信息从中提取以下信息:
将获得值与一份黑名单比较
若存在则将 AI_DETECTED_VIRTUAL_MACHINE 设置为 1bluesoleil_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。741 个导出函数都指向同一个地址 0x10001900由上图可知这 741 个导出函数为空函数,这个就非常可疑了。既然全是空函数,那下一步的调查点是 DLL 入口了,在入口中调用的 sub_10001910 中会对目录下的 gif.png 进行操作查看此 png 文件二进制信息,发现并不是标准的 png 格式,可能是经过加密的载荷,此文件大小为 109KB


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")
通过 LoadLibrary 和 GetProcAddress 获取以下 API 地址
VirtualFree
VirtualAllocEx
VirtualProtectEx
VirtualQueryEx
WriteProcessMemory
GetThreadContext
SetThreadContext
ZwUnmapViewOfSection
这一组 API 通常用于注入,此注入方式为 Process Hollowing,最终执行解密后的 PE在对 sub_405e50 查看时,发现了熟悉特征木马功能在线程函数 sub_406130 中,结合流量数据和线程函数功能可判断为银狐木马,关于此类木马功能分析在此不再展开。本次分析的样本是一个利用 Advanced Installer 打包、具备反虚拟化检测能力的木马程序。安装程序通过检测固件信息规避虚拟环境,随后释放带有有效数字签名的腾讯元宝作为掩护,而恶意核心功能则隐藏在蓝牙助手程序加载的 bssdk.dll 中。该 DLL 在入口点解密同目录下伪装成 gif.png 的加密文件,使用 Process Hollowing 注入方式将木马注入合法进程执行,实现远程控制。该样本通过多层打包、加密、合法软件捆绑及进程注入等技术,有效规避了常规安全检测,其攻击手法成熟,最终载荷赋予攻击者完全控制受感染主机的权限,构成严重威胁。
Hash:
C2: