ValveResourceFormat/SteamAppInfo
GitHub: ValveResourceFormat/SteamAppInfo
该工具是一个示例程序,用于解析 Steam 客户端的 appinfo.vdf 和 packageinfo.vdf 二进制文件,并提取其中的 AppID、SubID 及 PICS 令牌。
Stars: 130 | Forks: 11
这是一个简单的程序,用于查找磁盘上的 Steam 安装位置,读取 `appinfo.vdf` 和 `packageinfo.vdf` 文件,并转储 appid/subid 及其 tokens。
这主要旨在作为如何读取这些文件的示例。
## appinfo.vdf
### 文件头
| Type | Size | Version | Field Name | Description |
|--------|------|---------|---------------------|-------------|
| uint32 | 4 | | Magic | 版本标识符(参见 Version History) |
| uint32 | 4 | | Universe | Steam 宇宙(始终为 1) |
| int64 | 8 | 41+ | String Table Offset | 从文件开始到字符串表的偏移量 |
### App 条目(重复)
| Type | Size | Version | Field Name | Description |
|----------|----------|---------|---------------|-------------|
| uint32 | 4 | | App ID | Steam 应用程序 ID |
| uint32 | 4 | 36+ | Size | 直到二进制 VDF 结束的数据大小 |
| uint32 | 4 | | Info State | 状态标志(2 = 正常,1 = 预发布/无信息) |
| uint32 | 4 | | Last Updated | 最后更新的 Unix 时间戳 |
| uint64 | 8 | 38+ | PICS Token | Product Info Change Set token |
| bytes | 20 | 38+ | SHA-1 Hash | 文本 appinfo VDF 的哈希 |
| uint32 | 4 | 36+ | Change Number | Steam 变更编号 |
| ~~uint8~~| 1 | <38 | Section Type | 节标识符(重复直到 0x08) |
| bytes | 20 | 40+ | Binary SHA-1 | 二进制 VDF 数据的哈希 |
| bytes | variable | | Binary VDF | 二进制格式的 VDF 数据 |
重复读取,直到第一个 uint32(App ID)为零(即文件页脚)。
### 字符串表 (Version 41+)
位于文件头中指定的偏移量处:
| Type | Size | Version | Field Name | Description |
|------------------|----------|---------|--------------|-------------|
| uint32 | 4 | 41+ | String Count | 表中的字符串数量 |
| null-terminated | variable | 41+ | Strings | 以 null 结尾的字符串数组 |
此字符串表用于对所有二进制 vdf blob 中的字符串进行去重,因此需要先解析此字符串表,然后使用此字符串表解析二进制键值对。
### 版本历史
| Version | Magic Number | Start Date | Description |
|---------|--------------|-----------------|-------------|
| 36 | `0x06564424` | circa 2011 | 新增 size 字段 |
| 37 | `0x07564425` | circa 2012 | 结构与 v36 相同 |
| 38 | `0x07564426` | circa 2013 | 新增 PICS token 和 SHA 哈希 |
| 39 | `0x07564427` | circa 2017 | 与 v38 相同,但统一了 VDF 结构 |
| 40 | `0x07564428` | Dec 2022 | 新增二进制 VDF SHA1 哈希验证 |
| 41 | `0x07564429` | June 2024 | 新增带有偏移指针的字符串表 |
*关于解析此处未实现的旧格式,[请参阅此仓库](https://github.com/eepycats/appinfo-parser/)。*
### SHA-1 哈希字段
appinfo 格式包含两个用于不同目的的不同哈希字段:
#### SHA-1 哈希
此字段包含 Steam 内部 protobuf 协议中原始 `CMsgClientPICSProductInfoResponse.AppInfo.buffer` 的 SHA-1 哈希,不包括最后一个字节(该字节始终为 `\x00`)。Steam 使用此哈希通过 HTTP 从 CDN 下载 appinfo,它对应于 Steam 客户端向服务器请求 appinfo 时提供的哈希。
仅凭 VDF 数据无法轻易重新计算此哈希,因为它代表的是 Steam 从服务器接收的原始 protobuf 缓冲区的哈希,而不是本地 VDF 表示形式的哈希。
#### 二进制 SHA-1 哈希 (20 bytes, version 40+)
此字段包含紧接在此字段之后的二进制 VDF 数据的 SHA-1 哈希。此哈希可以直接从 VDF 数据计算得出,用于验证本地二进制 VDF 内容的完整性。
## packageinfo.vdf
### 文件头
| Type | Size | Version | Field Name | Description |
|--------|------|---------|------------|-------------|
| uint4 | 4 | | Magic | 版本标识符(参见 Version History) |
| uint32 | 4 | | Universe | Steam 宇宙(始终为 1) |
### Package 条目(重复)
| Type | Size | Version | Field Name | Description |
|----------|----------|---------|---------------|-------------|
| uint32 | 4 | | Package ID | Steam 包/订阅 ID |
| bytes | 20 | | SHA-1 Hash | 包数据的哈希 |
| uint32 | 4 | | Change Number | Steam 变更编号 |
| uint64 | 8 | 40+ | PICS Token | Product Info Change Set token |
| bytes | variable | | Binary VDF | 二进制格式的 VDF 数据 |
重复读取,直到第一个 uint32(Package ID)为 `0xFFFFFFFF`(即文件页脚)。
### 版本历史
| Version | Magic Number | Start Date | Description |
|---------|--------------|-----------------|-------------|
| 39 | `0x06555627` | Before Apr 2020 | 基本格式 |
| 40 | `0x06555628` | Apr 2020 | 新增 PICS Token 字段 |
标签:AppID, appinfo.vdf, packageinfo.vdf, PICS Token, Steam, Steam客户端, SubID, VDF, 二进制发布, 二进制解析, 云资产清单, 代码示例, 多人体追踪, 开源工具, 数据分析, 文件格式, 文件结构, 游戏平台, 解析器, 逆向工程