查看: 139|回复: 2
收起左侧

[病毒样本] 从主控调度到登录态窃取:多平台游戏账号攻击链分析

[复制链接]
瞬犀安全
发表于 3 小时前 | 显示全部楼层 |阅读模式
本帖最后由 瞬犀安全 于 2026-10-28 17:17 编辑

导读

近日,瞬犀安全技术团队发现了一组针对游戏账号与登录态的窃取样本。报告记录的运行链从 cli2update2.exe 启动开始:程序下载并加载 pz2.bin,随后持续检查 Steam、QQ、WeGame/TGP 等客户端进程;发现目标后,进入对应采集分支,并将获取的数据发送到外部服务器。

样本在后台按周期调度多个业务分支,采集路径因平台而异:WeGame/TGP 分支涉及目标进程内存读取及 DLL 注入相关行为;QQ 分支读取账号与 clientkey,借助正常登录跳转链路获取 Cookie;Steam 分支解析 JWT 载荷并读取账号相关数据。报告记录了采集数据向外部地址发送的行为。

•  账号接管风险:账号标识和登录凭据一旦外泄,攻击者可能尝试未授权登录,造成账号控制权丢失。

•  登录态滥用风险:Cookie、令牌等会话材料可能绕过单纯的密码验证,在有效期内被用于冒用会话。

•  游戏资产与关联账户风险:账号失控可能进一步影响虚拟资产、绑定邮箱及其他关联服务。实际是否发生损失,需要结合账户日志和设备取证确认。

•  隐蔽采集风险:分支按目标进程和状态条件触发,且通过内存加载、进程访问等方式运行,单看磁盘文件或单条告警可能无法还原完整链路。

样本来源与分析范围

一、入口与业务调度

cli2update2.exe 是这条链路的前置程序。本节以 cli2update2_dump_SCY.exe 的脱壳程序代码为依据,地址均对应当前脱壳项目。


解码字符串和获取外网地址


下载并动态加载pz2.bin



网络请求1:

网络请求2:

网络请求3:

网络请求4:

网络请求5:

pz2.bin分析

一、入口与业务调度

程序从易语言模块入口 fn_EYuyanMain0(0x1002922D)进入初始化流程,创建运行库和全局对象后,通过 fn_StartMonitorThread(0x1000103B)启动后台线程。

线程经 fn_MonitorThreadEntry 进入 fn_MonitorLoop(0x10001079),循环执行 fn_CheckTargetsAndDispatchPayloads(0x100010AA),每轮约等待 2 秒。

主调度围绕是否已处理过对应业务决定后续操作:micc 尚未尝试下载时,下载并启动;Steam 采集状态允许时,检查目标并采集;Trxa 尚未尝试执行且发现 WeGame/TGP 时,依次下载执行两份载荷;QQ 尚未尝试启动采集时,检查进程并创建采集线程。下文按各项业务分别展开,公共字符串解码集中放在后面说明。

这种编排用于阅读和后续补充分析;主函数的真实调用顺序仍以以下逻辑树为准,Steam 检查先于 micc、QQ 和 Trxa 处理。

fn_CheckTargetsAndDispatchPayloads的函数逻辑如下:





标志位名 | 地址 | 置位条件及含义
g_micc_download_attempted | 0x10045A4D | 为 0 时先置 999,再尝试下载、落地启动 micc.bin;不依赖目标进程是否存在
g_qq_collector_start_attempted | 0x10045A51 | 为 0 且找到 QQ.exe(PID > 1)时,先置 999,再尝试创建 QQ 采集线程
dword_10045A55 | 0x10045A55 | 为 0 时置 999
g_trxa_dispatch_attempted | 0x10045A59 | 为 0 且找到 WeGame/TGP 目标(最终 PID > 1)时,先置 999,再依次下载、内存加载两份 Trxa 载荷

这些标志表示对应业务是否已经尝试处理。

这里有两类不同的重试行为:QQ 或 WeGame/TGP 进程未找到时,对应的 g_qq_collector_start_attempted、g_trxa_dispatch_attempted 保持 0,下轮还会检查;一旦满足进程条件并置位,即使线程创建、下载或 PE 加载失败,这个调度函数也不会再尝试该分支。WeGame 查找仅在 PID < 1 时回退到 tgp_daemon.exe,最终是否进入载荷分支则判断 PID > 1。

Steam 不由上述三个 attempted 标志控制,每轮仍会调用其检查函数。Steam 子流程另有状态重置逻辑,用于重新判断进程和窗口是否满足采集条件。

二、micc 分支分析

主调度检查 g_micc_download_attempted。为 0 时,先将其设为 999,再调用 fn_DownloadDropAndRun(0x10008142)。该函数接收主流程传入的加密地址,解码后请求 http://***.***.***.116:9517/micc.bin。

响应长度大于 5000 字节时,程序生成六个随机小写字母组成的名称,将下载内容写入宿主 EXE 所在目录,设置隐藏属性,再调用 CreateProcessA 启动。

▌落地启动中的关键操作

目录由 fn_RuntimeGetHostDirectory(0x1002B5F0)取得,其内部使用 GetModuleFileNameA(NULL, ...) 获取宿主 EXE 路径,再去掉文件名。写文件、设置属性和创建进程分别由对应的运行库包装函数完成。




后续经分析micc.bin:与盗号业务无关,故在此不做进一步展示.

三、Steam 分支分析

fn_CheckSteamAndCollect 分析:

fn_CollectSteamTokensAndSend 分析:

循环获取 steam.exe / steamchina.exe 的pid


调用fn_ReadRemoteText获取到JwtPayload:




传入 fn_DecodeJwtPayload(0x10005A35)。该函数把文本按点号分成三段,Base64 解码中间载荷段并返回 JSON 文本。



随后,从 JSON 中取得 iss 字段,与解码得到的 steam 字符串比较



获取steam的steamui模块的基址



请求http://***.**.***.238:5212/pz.txt获取偏移的密文

解码偏移密文:1194E85


获取steam账号信息



向服务器发送获取到的steam数据


网络请求1:

网络请求2:


四、TGP/Wegame分支分析

这一分支从 g_trxa_dispatch_attempted 开始判断。为 0 表示尚未尝试分发执行 Trxa;随后检查 wegame.exe,仅在查找结果小于 1 时改查 tgp_daemon.exe。最终 PID 大于 1,才把标志设为 999,进入两份载荷的下载执行流程。

1. 判断是否需要下载执行

2. 两份载荷的下载顺序
主流程先查找 wegame.exe,未找到时再检查 tgp_daemon.exe;目标存在后,请求以下两份文件:
下载地址 | 后续处理
http://***.***.***.116:9517/Trxa_address3.bin | 将响应交给内存 PE 加载器
http://***.***.***.116:9517/Trxa.bin | 将响应交给内存 PE 加载器

3. 下载后在当前进程内加载执行
两份下载响应经 fn_LoadDownloadedPe(0x100086A2)传入 fn_MemLoadPE0(0x100086C0)。继续进入加载器,可以看到完整的手工映射过程。
程序先检查 MZ 和 PE 标记,按映像大小分配内存,再复制头部和各节。当实际加载地址与首选基址不同,加载器遍历重定位表修正地址;随后解析导入模块和函数,设置节属性,最后调用被加载 DLL 的入口函数。



3. 下载后在当前进程内加载执行相关逆向分析截图

4. 动态加载Trxa_address3.bin 分析

分析其脱壳版本 Trxa_address3_dump_SCY.dll,当前 IDA 加载基址为 0x701F0000。模块在 DLL 初始化时创建工作线程,随后进入 WeGame/TGP 的凭据采集流程。

入口调用树如下:


fn_CollectWeGameCredentialsAndReport 的业务调用树如下

第一次使用OpenProcess打开TGP进程

第二次则会使用OpenProcess全权限来打开TGP进程

使用ReadProcessMemory遍历TGP的内存,这里ReadProcessMemory 断点被命中了4w多次.



上报给黑客服务器,这里只是一部分负载.


网络请求1: 获取公网信息



网络请求2:


网络请求3:


网络请求4:获取公网信息


网络请求5:


5. 动态加载Trxa.bin 分析

分析其脱壳版本 Trxa_dump_SCY.dll,IliDA 加载基址为 0x10000000,易语言模块入口为 fn_EYuyanMain0(0x1003A1D4)。该模块等待目标进程,通过内嵌 hx 库扫描、读取 WeGame/TGP 内存,提取账号和登录相关数据,加密封装后上报。

入口调用树如下:


fn_CollectWeGameCredentialsAndReport 的业务调用树如下。多处相同的特征扫描、内存读取和加密操作合并展示。


解码字符串








内存加载自身内嵌的pe,并且获取hx导出函数.


hx:尝试以全权限打开进程,分配空间



hx:释放DLL文件




hx:设置全局钩子注入dll






这里wegame就已经被注入了


发包函数调用时,已经拿到了账号的信息.


网络请求1:


原文网络请求记录 23
token字段 | 置为 1 的条件 | 置为 0 的条件
w | 检测到 xclient.exe、xcom.exe、xcomw.exe、xcomu.exe 中任意一个,且取得 PID | 上述检测没有返回有效 PID
s | 检测到 panshisafeclient.exe | 未检测到
c | 检测到 ACE-Tray.exe | 未检测到
j | 检测到 lwcloudarmourclient.exe | 未检测到

网络请求2:


五、QQ分支分析

QQ 分支先定位 QQ.exe 中的 wrapper.node,再读取目标进程内存中的账号与 clientkey,使用这些数据请求 QQ 登录跳转接口。取得 Cookie 后,将账号与 Cookie 文本发送至 121.36.222.197:2021。下方保留实际请求、响应和上报载荷,调用树集中说明这些数据的来源。

核心采集与上报调用树如下。这里存在两条读取路径:特征扫描使用切换到 64 位模式后的直接系统调用;命中后的字段读取使用 ZwWow64ReadVirtualMemory64


多次调用 NtWow64ReadVirtualMemory64读取qq进程的内存



从QQ的进程中读取到clientkey


拼接出网络链接路径



请求制作出的网络链接


本次记录的前两条 HTTP 请求属于 QQ 官方登录跳转链路;第三条发往 ***.**.***.197:2021 的 TCP 请求才是向外传送账号和 Cookie 的上报。

网络请求1:


网络请求2:


网络请求3:


六、各项业务使用的公共字符串解码

样本把目标进程名、窗口参数、下载地址和注册表路径保存为加密文本,在使用前调用 fn_DecryptBase64Rc4String(0x100019E0)还原。

该函数先执行 Base64 解码,再以固定 ASCII 密钥 0123456789 进行 RC4 解码。Base64 解码位于 fn_Base64Decode(0x10001BBE);RC4 的密钥调度与密钥流处理分别位于 fn_RC4KeySchedule(0x10032060)和 fn_RC4CryptBuffer(0x10032130)。

▌字符串解码逻辑


部分密文放在易语言字节集中,前面有 8 字节对象头,实际文本不以 NUL 结束。提取时需要按字节集长度读取,普通字符串列表不能覆盖全部配置。

密文地址 | 解码结果 | 使用位置
0x10043240 | http://***.***.***.116:9517/micc.bin | 首次下载并落地启动
0x10043278 | wegame.exe | 额外载荷触发目标
0x10043290 | tgp_daemon.exe | 备用触发目标
0x100432FF | Steam.exe | Steam 状态检查
0x10043313 | steam.exe | Steam 采集目标
0x10043327 | steamchina.exe | SteamChina 采集目标
0x10043343 | vguiPopupWindow | 窗口类名
0x1004335F | 无标题 | 窗口标题
0x100434A2 | steam | JWT 的 iss 字段筛选
0x100434D0 | http://***.**.***.238:5212/pz.txt | Steam 内存偏移配置
0x10043504 | Software\Valve\Steam\AutoLoginUser_steamchina | SteamChina 账号备用来源
0x10043554 | Software\Valve\Steam\AutoLoginUser | Steam 账号备用来源
0x1004398F | QQ.exe | QQ 采集目标

七、样本文件 MD5

文件名 | 对应环节 | MD5
cli2update2.exe | 最初获取的程序,下载并加载 pz2 载荷 | 6c4c57d1da6ecd50eacc092ab913b263
pz2.bin | Steam、QQ 采集及附加载荷调度 | 49868e081a8a56dc2649bbc0b2d04351
micc.bin | pz2 下载并落地启动的载荷 | 25447dc4798b3dbbc5974ea15bd5d587
Trxa_address3.bin | WeGame/TGP 凭据采集载荷 | bcffe96e3b447c051cc472ee60c58cf5
Trxa.bin | 通过内嵌 Hx 库采集 WeGame/TGP 数据的载荷 | 48c77efb23f6faa8fb2e020fdccf8849




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?快速注册

x
Myrenaser
发表于 3 小时前 | 显示全部楼层
呃,没看见图片插入啊,是出什么问题了
瞬犀安全
 楼主| 发表于 3 小时前 | 显示全部楼层
Myrenaser 发表于 2026-10-28 16:55
呃,没看见图片插入啊,是出什么问题了

施工中,稍等

评分

参与人数 1人气 +1 收起 理由
Myrenaser + 1 很给力!

查看全部评分

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2026-10-28 20:49 , Processed in 0.028417 second(s), 4 queries , Redis On.

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

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