本文为 其乐用户(UID:1120058) 发布的原创文章,转摘前请联系该用户获得许可
本帖最后由 1120058 于 2024-8-16 18:00 编辑
最近更新到3.x版本的steam了想绑个第三方令牌来确认报价,毕竟大促前准备粮饷时遇到批量确认和批量暂挂都是很难受香菇的,结果发现原来的法子不好用了,一个是现在Android14不ROOT访问不了data/data只能访问Android/data,拿不到原来那两个文件了,然后咱用这个帖子的备份大法拿到了data/data/com.valvesoftware.android.steam.community目录里的文件,结果需要的字段已经转移到SecureStore.xml且被AES加密了,然后照着Wiki上Android手机导入方式还得ROOT(而且里面用的SteamGuardExtractor模块也不适配新版steam了),但咱绑令牌的手机是主力机,日常要使用银行类APP,进行面部识别等等操作,靠隐藏Magisk应用、排除列表、Shamiko模块等等法子来始终不太稳定且不一定能过检测,ROOT拿来玩的还是备用机比较好,本来我寻思着用Wiki里ASF 2FA来结果竟然要解绑现在的令牌重新绑,市场要暂挂15天,本来最近正好在清理库存里的卡牌之类的多少有点不方便,还好找到有新的模块SteamGuardDump可以不用ROOT一键解密获取需要的令牌数据,只涉及到转移令牌所以只暂挂两天,于是我一顿霍霍终于把令牌导出来了
下载工具: 按照ROOT情况下载以下4个APP: 或 直接下载下面这个APP: 建议是自己安装模块来获取令牌,因为如果Steam更换数据格式参数之类的模块的HOOK功能可能就会失效,到时候就可以自己更新模块来获取新的令牌数据,且如果想要更新Steam APP的版本,就要先下载新的官方版本使用LSPatch/LSPosed等工具再修补一遍覆盖安装(令牌不会发生变化),如果上面这些你都不在意,只是想方便快捷的获取到令牌数据,准备长期用这个版本的Steam APP,不准备换新令牌,好吧,如果你信得过的话你可以下载这个咱自己修补的可独立运行(不需要再安装上述软件和模块)内置SteamGuardDump模块的Steam安装包安装(仍需先卸载原版且绑定新令牌)
导出令牌: 以未ROOT的流程为例: 1.安装上述除Steam的所有软件到手机上(如果安装了原版Steam就卸载掉(不要解绑令牌),因为安了模块的安装包与原安装包不能共存,卸载前记得看是否绑定手机,没有就绑定一个,后面转移令牌(会暂挂两天市场)会用到) 2.打开Shizuku,点击无线调试的配对,按照步骤打开对应的开发者选项,输入配对码,然后点击启动 3.点击应用管理,在里面勾选LSPatch,将软件切换到后台 4.打开LSPatch,确认显示Shizuku服务可用 5.点击左下角下载旁的管理,点击+号选择“从存储目录中选择(多个)apk”,找到并选中下载的Steam安装包 6.选择集成模式(可在其他设备单Steam独立运行),然后点击开始修补,等待修补完成 7.点击安装来安装修补后的Steam,安装后打开Steam正常登陆(记得开加速器),使用手机验证码绑定新令牌 8.重启Steam,下方弹出窗口显示 SteamGuardDump:SteamGuard data copied! 即代表成功导出令牌数据,此时数据在剪贴板里,可以通过通讯软件、Privnote之类的阅后即焚网站等传输到电脑上 已ROOT用户可以采用类似的步骤操作先用Magisk启用Zygisk,再本地安装Zygisk-LSPosed模块,最后安装SteamGuardDump和LSPosed勾选SteamGuardDump模块中的Steam启动即可(具体步骤可以参考Wiki写的) 或 1.安装Steam(内置SteamGuardDump模块)到手机上(如果安装了原版Steam就卸载掉(不要解绑令牌),因为安了模块的安装包与原安装包不能共存,卸载前记得看是否绑定手机,没有就绑定一个,后面转移令牌(会暂挂两天市场)会用到) 2.重启Steam(内置SteamGuardDump模块),下方弹出窗口显示 SteamGuardDump:SteamGuard data copied! 即代表成功导出令牌数据,此时数据在剪贴板里,可以通过通讯软件、Privnote之类的阅后即焚网站等传输到电脑上
确认导入令牌需要的数据格式: 拿到的数据格式为: {"accounts":{"64位SteamID":{"shared_secret":"略","identity_secret":"略","secret_1":"略","serial_number":"略","revocation_code":"略","account_name":"略","token_gid":"略","steamguard_scheme":略,"steamid":"略","uri":"略"}},"uuid_key":"略:略"}
Steam 帐户名称:account_name 共享密钥:shared_secret 64 位 Steam ID:steamid 身份密钥:identity_secret
(BotName:你需要绑定令牌的机器人(BotName.json)的名称) BotName.maFile中 { "shared_secret": "略", "identity_secret": "略"} 上述数据会在ASF启动后会以下列格式被写入BotName.db中 "_MobileAuthenticator":{"identity_secret":"略","shared_secret":"略"} 且 BotName.maFile 将会在 ASF 2FA 导入成功后被自动删除
64 位 Steam ID.maFile(steamid.maFile) { "shared_secret": "略", "identity_secret": "略", "account_name":"略", "steamid":"略", "device_id":"uuid_key"}
令牌名称:随意 Steam UUlD:uuid_key SteamGuard 数据格式为: {"shared_secret":"略","identity_secret":"略","serial_number":"略","revocation_code":"略"}
Name:随意 steam_uuid.xml:uuid_key SteamGuard-NNNNNNNNNN:{"shared_secret":"略","identity_secret":"略","serial_number":"略","revocation_code":"略"}
导入令牌: Steam 令牌验证器(浏览器脚本,可查看令牌验证码可确认报价):确认已经安装好油猴扩展和脚本(复制代码-浏览器油猴图标-添加新脚本-清空原内容粘贴-文件-保存),打开任意Steam页面,点击Steam 令牌验证器,选择添加账户,按照上面的数据格式复制对应的数据填入(可多不可少),点击确认即可
ASF 2FA(可查看令牌验证码可自动确认 ASF 所发送/接受的报价):打开ASF的安装目录,进入config目录下,鼠标右键选择新建文本文档,双击进入,按照上面的数据格式复制对应的数据填入文本文档(可多不可少),然后保存文本文档(文件-保存),再右键文本文档选择重命名将其重命名为BotName.maFile,启动ASF打印形如的输出,且使用命令(按下C键即可输入命令) 2FA 得到的令牌代码与手机上的一致即为导入成功
SDA(Steam Desktop Authenticator)(可查看令牌验证码可确认报价):打开软件,选择This is my first time and I just want to sign into my Steam Account(s),进入主界面,选择,然后在任意位置鼠标右键选择新建文本文档,双击进入,按照上面的数据格式复制对应的数据填入文本文档(可多不可少),然后保存文本文档(文件-保存),再右键文本文档选择重命名将其重命名为64 位 Steam ID.maFile(steamid.maFile),然后在SDA主界面选择File-Import Account,点击Select .maFile file to lmport找到刚才创建的.maFile文件,打开后在登陆窗口的Password栏输入steam账号对应的密码,点击Login即可
Steam++(可查看令牌验证码):打开软件,切换到本地令牌页面,点击新增,选择Steam令牌导入,按照上面的数据格式复制对应的数据填入(可多不可少),确认导入即可
WinAuth(可查看令牌验证码(可确认报价)):打开软件,点击Add,选择Steam,点击Import Android,按照上面的数据格式复制对应的数据填入(可多不可少),点击OK,会有一个保护界面叫你选择保护令牌的方式,第一个是用自定义密码,第二个是用Windows内置账户加密加密令牌数据,第三个是Yubikey令牌(实体令牌)锁定,不过一般用第一个就够了,填上自定义密码,点击OK,或者你不需要每次打开都验证直接点Cancel跳过,然后右键Steam图标点击Confirmations...(可以顺带勾选上Auto Refresh来自动刷新)来尝试登陆账号以使用确认报价的功能(但是似乎该功能已失效,指无法成功登录)
当然,备份大法拿到的文件里面也是有令牌数据的,不过在本地要拿到的话又得去翻代码看AES解密的相关函数,拿到密钥(keyStore.getEntry(extendedKeyStoreAlias="keystoreAuthenticated", null).getSecretKey(),为AES_KEY_SIZE_BITS=256位)、初始化向量(IV_PROPERTY/iv)、加/解密算法(AES_CIPHER=AES/GCM/NoPadding)、密文(CIPHERTEXT_PROPERTY/ct)等等,然后在本地构建程序(形如:Cipher.getInstance(AES_CIPHER).init(AES_CIPHER/str, gCMParameterSpec, ivSpec(r0.label)).doFinal(Base64.getDecoder().decode(CIPHERTEXT_PROPERTY)))解密,按照常规AES解密来说是这样,但当你看到KEYSTORE_PROVIDER = "AndroidKeyStore"、keyGenerator = KeyGenerator.getInstance("AES", keyStore.getProvider())等东西的时候你就该知道完蛋,这对密钥用AES算法生成后保存在Android Keystore system里,每次加密解密都是在系统进程内加密进行,私钥的内容不会以明文形式出现在设备的主机内存中,也就是说你能用密钥但拿不到具体的密钥数据,所以像模块里那样使用 after 回调,在 decryptItem 方法执行之后查找为 readJSONEncodedItem 或 readLegacySDK20Item 的调用,如果被调用就检查decryptItem方法的返回值(Steam运行中解密完的令牌数据),如果不为空就把它拿到添加上uuid、uri之类的数据然后使用 ClipboardUtils.copy 方法将处理后的数据复制到剪贴板这种HOOK函数的方法就是相当于变相使用密钥拿到解密后的数据但拿不到密钥本身的数据
|