
查杀图
Steam 是一款游戏整合平台,其平台的部分游戏商品需用户付费“入库”后才能游玩。目前,网络上存在一类售价远低于官方渠道的Steam游戏激活码,且商家宣传其是 “正版游戏”“永久激活”“绝非共享”等承诺。

部分商家会明确告知其激活码需借助第三方软件运行;另有部分商家通过具有欺骗性的宣传话术诱导消费者,让消费者误以为其所售产品是官方正版密钥,进而促成购买。
在完成购买后,商家会向用户发送一个伪装为Steam官方提供的软件或命令行工具,要求用户运行该工具后,再向Steam客户端中输入其提供的“正版激活码”以完成“入库”。

使用说明图
目前,火绒安全软件已具备对该程序的核心组件及网络连接进行拦截查杀的能力。若您尚未安装火绒安全软件且系统已经受到影响,建议您参考下方我们提供的手动清理方案:
[1] 建议彻底卸载、删除 steam 客户端及文件,然后重新安装并执行步骤[4]。
[2] 尽快删除 steam 客户端根目录下的 hid.dll 和 zlib1.dll 。
[3] 在资源管理器中输入 %APPDATA% 并删除 Stool 目录以清理衍生文件。
[4] 在注册表中清理 HKEY_CURRENT_USER\Software\Valve\Steam\Steamtools 键来清理衍生注册项。
在 steam 根目录下删除 steam.cfg 来还原官方客户端配置,使官方客户端能够正常安全更新。
一、准备流程分析
商家首先会要求用户运行其提供的第三方程序或脚本,这些程序或脚本通常会伪装成Steam平台官方工具。本文以商家提供的PowerShell脚本为例,商家会指示用户在终端中运行其提供的PowerShell脚本,具体代码如下:

其中 irm 为从对应的网址下载内容, iex 为将前面下载的内容作为 PowerShell 脚本执行。
其执行流程图如下:

通过 irm 下载的脚本主要内容如下:
![]()



PowerShell脚本主要内容
文字版描述脚本运行逻辑如下:
1.删除a.ps1(部分版本通过a.ps1文件运行)。2.创建 %APPDATA%\Stool 目录。
3.通过注册表读取 Steam 路径并终止正在运行的 Steam 进程。
4.从 gitee 仓库下载 legit, appdata.vdf, hid.dll, zlib1.dll 文件并解密。
5.删除 Steam 路径中的 steam.cfg, version.dll, user32.dll 文件 (其他版本的假入库利用文件)。
6.修改 loginusers.vdf 文件中 WantsOfflineMode = 0 来关闭离线模式。
7.修改 config.vdf 中 DisableShaderCache = 1 来关闭着色器缓存。
8.通过 steam://open/activateproduct 来打开 Steam 并启动激活窗口。
利用hid.dll 篡改程序执行流程是网络灰黑产常用手段,因其隐蔽性和优先级高、实施简单且兼容性好,深受黑灰产从业者青睐。
由于 hid.dll 是 Steam 客户端运行必需的系统 DLL 动态链接库,脚本将伪造的 hid.dll 放在与 Steam 可执行文件相同的目录中。系统会优先加载该目录下的 hid.dll,而非系统路径中的原始文件。通过这种优先加载机制,伪造的 hid.dll`可以在 Steam 初始化前执行其代码,从而篡改客户端的运行逻辑。

HID.DLL代码
该hid.dll 携带由已注册公司提供、状态正常的签名,公司信息为“临沂追风艾美信息科技有限公司”。

状态正常的签名信息
当Steam客户端运行后,其会自动加载hid.dll。该文件首先从系统路径载入原有的hid.dll,以确保相关程序功能正常运行;随后对先前释放的appdata.vdf文件进行解密与解压,并在内存中直接执行所得到的DLL动态链接库文件。
由于此DLL由appdata.vdf解密并解压生成,下文将其称之为appdata.dll。
该 appdata.dll 文件读取其内存中的一系列hash字符串并将其在内存中解码为新的DLL动态链接库文件,然后在内存中不落地执行该最终DLL动态链接库,我们将其称为 unpacker.dll 。然后, unpacker.dll 读取 legit 文件并在解密解压后内存执行,我们将其称为 legit.dll 。最后,核心动态链接库 legit.dll 执行程序的主要逻辑。此时,程序中共有 3 个内存 DLL 文件(Memory-PE)。

内存中DLL文件表
二、核心流程分析
核心动态链接库文件 legit.dll 的主要逻辑代码均由代码虚拟化保护壳保护,分析难度较高。
[1]程序在 Steam 进程空间中劫持系统库、加密库、UI库、客户端库的执行逻辑。

[2]程序请求托管在公开网站上的数据,获取可更新的服务器地址。
首先,程序从内存中解密、生成配置并解析配置来控制后续的行为。

内存中生成的数据
解密后的数据包含用于替换用户数据的Steam用户ID、存储云控配置所在的GitHub仓库路径与分支信息、待启用功能特性以及访问时使用的UA等配置参数。
配置中还包含多个镜像地址,用于确保全球不同地区均可访问获取云控配置数据。程序将通过访问指定的代码仓库来下载经过加密的云控配置文件。

云控原始数据
[3]程序在本地生成数据库,将劫持得到的Steam数据保存到本地。
程序运行时会把本地数据以加密 sqllite 数据库的方式保存到 %APPDATA%\Stool 目录中的 info , info-journal , info-wal 文件中。其中 info 应为加密后的数据库长期存储文件, info-journal 和 info-wal 是在 sqllite 数据库操作的过程中产生的临时文件,程序会在使用后立即删除。

产生的文件
经过对程序逻辑的详细分析后,解析得到程序数据库文件结构如下:

程序数据库文件结构
程序可以通过劫持 crypt32.CryptUnprotectData 的方式过滤获取所有将解密的密钥数据,使得用户数据不再安全,并将用户的敏感信息字段:
AuthSessionTicket 的二进制源数据,jwt 的完整字符串数据完整保存到数据库中。
AuthSessionTicket 是 Steam 中的用户身份验证令牌,持有令牌后可以使用用户的账户请求任意 Steam API ,从而窃取账户所有权。
在Steam平台用户数据中 jwt 全称 JSON Web Token ,持有者可以获得 Steam 账户的登陆权限,从而窃取账户所有权。

将插入JWT事务提交到数据库中





