盯上网吧终端:挖矿木马借漏洞驱动窃取游戏账号凭证
-
作者:火绒安全
-
发布时间:2026-09-08
-
阅读量:1330
一、概述
近日,火绒安全工程师在网络安全监测过程中发现一组针对网吧终端环境的模块化恶意程序。该样本会主动识别多类网吧或终端管理环境,收集网吧编号、MAC地址及客户端版本等信息,并从远程服务器获取任务。
与常见的单一挖矿木马不同,该样本具有两条相对独立的获利路径:一条为下载公开发行的PeakMiner矿工程序并运行,在游戏启动时主动暂停挖矿;另一条会伪装成系统ntdll.dll,从WeGame/TGP进程内存中提取用户会话凭据。当样本无法读取目标进程时,窃密模块还会下载恶意无签名驱动,利用存在已知漏洞的驱动临时关闭驱动签名强制,加载恶意无签名驱动,从内核完成目标进程内存读取。
目前,火绒安全产品已实现对该行为的拦截与查杀。

图1、火绒查杀图
二、流程图

图2、第一阶段流程图

图3、第二阶段挖矿分支流程图

图4、第二阶段窃取凭证分支流程图
三、样本分析
样本启动后检查命令行参数。当命令行携带/fork时,样本生成随机文件名,将自身复制至用户%TEMP%目录,写入用于后续清理的配置,并启动复制后的样本。新进程读取配置后删除原始样本。

图5、命令行参数判断与自复制分支
在/fork分支中,样本还会释放并启动ReportBSGuard.exe。该组件结合parent_pid、source_path、cleanup等字段,协调父进程退出、文件复制和残留文件清理。

图6、ReportBSGuard守护及清理逻辑
样本会枚举磁盘、进程和网络适配器,重点检查以下与网吧管理相关的对象:
lwclient64.exe
lwclient64\config\config.ini
BCData\BarClientView.ini
barclientview.exe
NBMSClient
C:\Windows\Sand.dat
样本从相关INI文件中读取serverip、BarId等字段,并收集MAC地址、进程信息及客户端版本,作为服务端请求参数。上述路径和进程均与网吧管理软件相关。




图7、网吧客户端检测与环境信息采集
样本将收集到的终端信息组织为请求数据,内容如下:
{
"bar_id": "123456",
"bar_type": "3",
"bm_verson": "1.1.6",
"cmd": "get_url",
"mac": "00-0c-29-1e-94-f6"
}
请求和响应为加密数据。样本内置固定密钥及配套编解码流程,对提交数据进行处理,并在收到响应后完成解密和解析结构。

图8、请求加密密钥及相关初始化

图9、网络通信能力及请求封装

图10、终端配置请求数据

图11、返回数据解密流程

图12、响应数据解析函数
测试发现,使用无效或默认bar_id请求时,服务端返回:
{"code":1,"msg":"empty"}
使用测试中可被服务端识别的bar_id=1后,服务器返回包含两个二阶段DLL的任务配置:
{"args":{"tasks":[{"args":"","hash":"e448be71181ee3d3e24687390e041308","load_mode":"disk",
"name":"oqmvkzbo.dll","save_dir":"%temp%","task_type":2,"type":"dll"},
{"args":"","hash":"b093ce197e5e5cac104263a9e52ede02","load_mode":"disk",
"name":"hpxilyoz.dll","save_dir":"%temp%","task_type":2,"type":"dll"}]},"code":0,"msg":"ok","task_type":2,"ts":"1787396072"}

图13、Id无效时服务端返回的数据
样本实现了三类任务执行机制。第一类是命令执行。样本解码C:\Windows\System32\cmd.exe和/c,拼接服务端下发的命令,并通过CreateProcessA以CREATE_NO_WINDOW标志运行。

图14、cmd命令拼接与无窗口执行
第二类是磁盘DLL加载。当任务指定load_mode=disk时,样本将DLL写入指定目录,再调用LoadLibraryA加载;任务结束后可按配置删除落地文件。

图15、磁盘DLL任务调用入口

图16、通过LoadLibraryA加载外部DLL
第三类是内存DLL加载。函数0x42D390检查PE头,在当前进程中分配内存、复制映像、处理重定位和导入表、设置节权限并调用DllMain。加载前,样本还会修改DLL中可能导致宿主进程退出的函数,使二阶段模块无法直接结束主控进程。

图17、内存加载器解析PE映像

图18、修改DLL退出函数
样本对局域网资源发现采用以下局域网协议:
BMCLAN|1|REQ|、HERE、GET、FILE
样本还关联到111.229.25.197:85。该地址可能为样本的管理页面。

图19、关联服务管理页面
SHA256为582b04506efa29214b42b5359c47c9b0e182644b47a0b539c777cb2b3b350b13的DLL由PECompact保护,需脱壳分析。

图20、脱壳后还原的DllMain
模块枚举本机进程,并根据内置列表终止竞争矿工或可能影响自身运行的进程,为后续挖矿释放计算资源。

图21、竞争进程识别与结束功能
模块向远程接口提交UID、时间戳和签名等参数,以获取后续资源和矿工配置。

图22、远程接口及网络参数
收到响应后,模块使用内置算法完成解密并解析配置。

图23、请求参数与签名生成

图24、返回包解密算法

图25、解密后的挖矿配置
配置中的game_processes用于识别游戏运行状态。检测到指定游戏进程时,模块可暂停挖矿,降低CPU/GPU占用,减少用户感知及暴露概率。
随后模块访问远程资源并将矿工载荷下载为1.exe。

图26、矿工载荷下载功能
模块还内嵌含一个SHA256为d0c365f86e6a12126cf8e533efaf72a893210a00fbaa3e14b238f83114166130 PE启动器。

图27、模块内嵌的PE文件
样本将该PE释放到文件系统并执行。

图28、内嵌PE的释放与启动
启动器创建挂起状态的%SystemRoot%\System32\notepad.exe,使用VirtualAllocEx和WriteProcessMemory写入下载的矿工映像,处理重定位后修改线程上下文并恢复执行,形成典型的进程替换。

图29、向notepad.exe实施进程替换
矿工运行约数秒后,启动器读取远程PEB及ProcessParameters,将目标进程命令行改写为正常的notepad.exe路径,从普通进程查看工具中隐藏矿池、钱包和启动参数。

图30、远程进程命令行清理
SHA256为391c30154e75302838ba8f7cc5451bef4ab2849ed778efd457ca1321253fd9fa的DLL采用较强混淆,无静态导入表。模块遍历PEB中的已加载模块并按导出名哈希动态解析所需API,同时使用SIMD异或隐藏C2、进程名和业务字符串。

图31、Dll的导入表无数据
该样本存在大量的字符串解密和函数混淆。

图32、异或解码C2地址和目标进程名称
解码结果包括:
wegame.exe
tgp_daemon.exe
rail.exe
103.36.165.120
ACE-Tray.exe
样本首先以普通用户态方式尝试采集,失败后最多再重试一次。样本调用OpenProcess打开WeGame/TGP目标进程,通过VirtualQueryEx枚举可访问内存区域,再由ReadProcessMemory读取区域内容。

图33、初始化全局字符串
内存扫描器支持包含?通配符的字节模式,兼容不同版本WeGame/TGP中地址、偏移及相对调用操作数的变化。

图34、带通配符的进程内存特征扫描
解析函数搜索以下字段:
bauth_openid
bopenid
bbiz_ticket
btgp_id
bctid
其中,字段名前的b与其类型或序列化格式有关。解析结果包含openid/auth_openid、biz_ticket、tgp_id和ctid。
取得字段后,样本重新构造TGP会话数据:
Cookies=tgp_id=
mid=-365;tgp_biz_ticket=
样本同时收集machine_id、deviceid、计算机名、系统信息和目标进程信息,随后通过WinHTTP封装以POST方式向以下服务提交数据:
103.36.165.120:4096
当普通用户态读取失败时,窃密DLL初始化内核窃取信息路径,并从同一C2下载载荷其SHA256为d7b8fdc2ba857683d25696c36a3e093c5eaf6e85a15c0810a1c3a7f3d47fce33:
http://103.36.165.120:4096/dse.bin

图35、GET/dse.bin下载函数

图36、远程加载文件
初始化后,样本会确认恶意驱动是否就绪。
dse.bin是一个64位用户态加载程序,内部嵌入DellDBUtilDrv2、配套INF和一个无签名恶意驱动。

图37、dse.bin内嵌的DBUtilDrv2.sys

图38、Inf文件

图39、恶意驱动
样本将驱动及其安装文件写入文件系统。其中,DBUtilDrv2映像位于dse.bin的文件偏移0x24010,映射后的虚拟地址为0x140024C10,大小为0x6CF8字节。调用0x140067221完成文件创建和内容写入。

图40、内嵌驱动及安装文件的落地
外层样本安装DBUtilDrv2并打开设备\\.\DBUtil_2_5,获得内核内存读写能力:
样本定位并保存系统代码完整性状态,通过DBUtilDrv2临时写入替换值,使系统能够接受无签名恶意驱动。

图41、定位、保存并临时修改DSE状态

图42、DBUtilDrv2内核读写封装及DeviceIoControl调用
样本调用OpenSCManagerW和CreateServiceW,以SERVICE_KERNEL_DRIVER、按需启动方式创建驱动服务,再调用StartServiceW完成加载。驱动启动后,样本立即恢复原始DSE状态。
父DLL首先通过命令1000向恶意驱动提交WeGame或TGP进程PID。驱动调用PsLookupProcessByProcessId取得并保存目标EPROCESS。随后,父DLL通过命令2000提交远程地址、本地缓冲区、长度和复制方向;恶意驱动在0x1400060C7中调用MmCopyVirtualMemory,将目标进程内存复制到请求进程。

图43、恶意驱动调用MmCopyVirtualMemory读取游戏进程内存
无签名恶意驱动不创建明显的用户态设备接口,而是调用CmRegisterCallback注册注册表回调。父DLL通过动态解析的NtSetValueKey触发回调,将注册表操作用作用户态与内核态之间的隐蔽命令通道。

本次捕获的网吧定向恶意样本集采用模块化设计,同时具备挖矿牟利与窃取WeGame账号会话凭证双重攻击能力。攻击手法隐蔽,对网吧上网用户账号与设备资源均存在较大威胁。火绒安全在此提醒广大用户:
- 网吧公共上网场景:在网吧使用WeGame等游戏客户端结束后,务必主动退出账号登录;尽量不在网吧设备保存密码、记住登录状态,离开前确认账号完全登出,避免会话凭证被恶意程序窃取造成账号被盗。
- 其他场景:保持安全防护软件正常开启,及时查杀外来恶意样本;不要运行来源不明的程序、破解工具,警惕陌生文件落地;一旦发现账号异常登录、资产变动,第一时间修改密码并做好账号安全校验。
四、样本IOC
文件

网络
http://103.36.165.120:4096/dse.bin
111.229.25.197:85
43.139.233.8:1443/r