当前 steam 版本: 8.63.11.84, 更新于 2024年1月13日,8:58:56
注意到 steam 的 UI 是网页格式的, 检查后确定其使用 CEF 展示, 在 steam 根目录游走发现steamui\localization
下放了 steam 的本地化文件, 且steamui\chunk~2dcc5aaf7.js
是入口文件.
尝试随机修改一些翻译后触发了 steam 的更新, 更新后相关文件复原. 注意到 logs
下有许多日志, bootstrap_log.txt
描述了启动流程. 当一切正常时, 最后几行如下:
1 2 3 [2024-01-18 19:40:21] 正在验证安装... [2024-01-18 19:40:21] Performing checksum verification of executable files [2024-01-18 19:40:22] Verification complete
修改任何关键文件后, 则会有如下类似输出:
1 2 3 4 5 6 7 8 9 10 [2024-01-18 19:43:16] Downloaded new manifest: /steam_client_win32 version 1705108172, installed version 1705108172, existing pending version 0 [2024-01-18 19:43:16] Package file bins_cef_win32_win7.zip.vz.314ded663999d66f03023b3a12690d93d9d34974_66447549 missing or incorrect size [2024-01-18 19:43:16] Package file bins_webhelpers_win32_win7.zip.vz.fe15dbe6e1b60812fbaee813884270a7b58aac0e_2518032 missing or incorrect size [2024-01-18 19:43:16] Add pending download: https://client-update.akamai.steamstatic.com/bins_cef_win32_win7.zip.vz.314ded663999d66f03023b3a12690d93d9d34974_66447549 [2024-01-18 19:43:16] Manifest download: send request [2024-01-18 19:43:16] Add pending download: https://client-update.akamai.steamstatic.com/bins_webhelpers_win32_win7.zip.vz.fe15dbe6e1b60812fbaee813884270a7b58aac0e_2518032 [2024-01-18 19:43:16] Manifest download: send request [2024-01-18 19:43:16] 正在下载更新 (已下载 0,共 67,349 KB)... ...省略进度行 [2024-01-18 19:43:23] 正在下载更新 (已下载 35,320,共 67,349 KB)...
注意到大部分 bootstrap 里的输出都是英文的, 而正在验证安装
是中文的, 那么肯定在某个地方放置了翻译文件. 全局搜索可知public\steambootstrapper_schinese.txt
下有一些启动时翻译文件, 找到相关行如下:
1 2 3 "SteamBootstrapper_UpdateInstalling" "正在安装更新..." "SteamBootstrapper_InstallVerify" "正在验证安装..." "SteamBootstrapper_DownloadComplete" "下载完成。"
遂全局搜索SteamBootstrapper_InstallVerify
发现在steam.exe
中有引用, 使用 IDA Pro 打开 steam.exe
.
在 String 视图中有:
循其引用, 只见其一, 所在片段如下:
那么sub_466120
肯定是一个翻译函数, 随意修改 steam 一些字节, 重新运行可见:
1 2 3 4 ... [2024-01-18 20:23:35] 正在验证安装... [2024-01-18 20:23:36] BVerifyInstalledFiles: bad CRC on steam.exe (da921668 expected, ef3173b5 actual) ....
那么只要把验证函数空置, 应该就能处理掉不少问题, 搜索 BVerifyInstalledFiles
可见:
1 2 3 4 5 Address Length Type String .rdata:006E729C 00000028 C BVerifyInstalledFiles: bad directory %s .rdata:006E72C4 00000037 C BVerifyInstalledFiles: %s is %lld bytes, expected %lld .rdata:006E72FC 00000026 C BVerifyInstalledFiles: can't read %s\n .rdata:006E7324 0000003F C BVerifyInstalledFiles: bad CRC on %s (%x expected, %x actual)\n
第一个是处理错误目录的, 第二个是检查长度的, 第三个是报错不能读取的, 第四个是检查文件 CRC 的.
打开此函数反汇编伪代码, 前几行是:
1 2 3 4 5 6 7 8 9 10 v4 = (int )this; v76 = this; sub_457870(v47); v77 = 0 ; sub_4616F0(v46, 778 , v4, 1 ); if ( !(_BYTE)a2 && !(unsigned __int8)sub_49A920(v46) ){ v5 = 1 ; goto LABEL_87; }
LABEL_87
在尾巴上, 接近返回, 大概就是兜底. 因此反转此条件. 将两个jnz
改成jz
, 之后修改翻译文件, 将Login_PickUser
改做:
1 "Login_PickUser":"谁要玩游戏 Hello World?"
启动 steam 可见:
被糊掉的是我的头像
至此修改成功. 查看 Login_PickUser
附近代码有:
这附近引用到了一个s.Config
, 导出看看:
现在可以一键替换「steam」为「斯迪姆」了