ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

nid_names.py工具实战:如何解码AnyPS5的NID符号名

nid_names.py工具实战:如何解码AnyPS5的NID符号名 nid_names.py工具实战如何解码AnyPS5的NID符号名【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5AnyPS5 是一个自动将 PS5 可执行程序移植到 Linux 和 Windows 的开源工具。它的 tools/nid_names.py 脚本能扫描整个代码库把一堆难以辨认的 NID 符号如2KpvixvL6E批量解码成真实的系统函数名是参与项目开发时最实用的入门工具之一。1️⃣ 背景NID 符号是什么PS5 的系统库在动态链接时并不按字符串名字绑定函数而是使用一串 11 位字符的NID数字 ID 标识来匹配。你在 core/libs/prx/ 目录下会看到大量这样的导出声明APS5_EXPORT(2KpvixvL6E, scePsmlUnknown__P2KpvixvL6E); APS5_EXPORT(ArakEpzsZo0, scePsmlUnknown_ArakEpzsZo0);NID 本质上是函数名经过 SHA1 哈希、再按特殊字符集编码得到的 11 位密文。算法实现在 tools/nid_names.py 的compute_nid函数中C 侧对应 core/libs/nid/src/NidCompute.cpp函数名 16 字节固定后缀 → SHA1 摘要 → 取 8 个字节反转 → 按A-Z a-z 0-9 -字符集每 6 位一组编码 → 输出 11 个字符当开发者不知道某个 NID 对应哪个真实 API 时就只能先给它起个Unknown占位名。nid_names.py 的作用就是把这些占位符破译出来。 安装准备先获取项目源码git clone https://gitcode.com/GitHub_Trending/an/AnyPS5 cd AnyPS5运行nid_names.py只需要Python 3无其他依赖。首次运行时它会自动下载 NID 数据库一个 CSV 文件并缓存到系统的临时目录anyps5-nid-db/下之后离线也能用。 一键扫描最简使用方式在项目根目录直接执行python3 tools/nid_names.py脚本会自动扫描 core/libs/prx/ 下所有APS5_EXPORT(nid, ...Unknown...)形式的未知导出然后输出一个对照表NID STUB STATUS SUGGESTION 2KpvixvL6E core/libs/prx/libScePsml_debug/Exp.. rename-ready scePsmlSomeFunction ArakEpzsZo0 core/libs/prx/libScePsml_debug/Exp.. unknown ... 128 unknowns, 96 suggestions (12 already implemented)四列输出各自含义列名含义NID11 位密文标识即导出函数的真实链接名STUB当前代码中的占位位置文件路径:符号名STATUS解码状态见下表SUGGESTION数据库中查到的真实函数名状态STATUS解读rename-ready数据库中有名字且代码里还没实现 ——这就是你接下来可以认领的任务already-implemented名字已知且已有实现无需处理MISMATCH数据库给的名字反算出的 NID 对不上数据库该条目不可信需要人工核实unknown数据库里没有记录只能保持占位名脚本结束时会在底部汇总共多少未知项、多少条建议、多少已实现。若出现MISMATCH退出码为 1方便在自动化流程中做校验。 进阶用法指定 NID 查询与 JSON 输出只解码特定的 NID当你手头只有某个 NID比如从游戏日志或技术文档中看到的可以用--nid直接查询无需扫描整个代码库python3 tools/nid_names.py --nid 2KpvixvL6E ArakEpzsZo0输出 JSON 供脚本处理加--json可以拿到机器可读的结果包含数据库总条目数方便接入自己的统计工具python3 tools/nid_names.py --json使用自定义 NID 数据库默认数据库来自项目内置的下载地址缓存于临时目录。如果你有更新的 CSV可以用--db参数或环境变量ANYPS5_NID_DB指定自己的文件python3 tools/nid_names.py --db /path/to/my-nid-list.csv这三个参数的组合方式都定义在 tools/nid_names.py 的参数解析部分。 NID 是怎么算出来的看懂算法后你甚至可以手动验证。以compute_nid函数为例见 tools/nid_names.py把函数名和一段 16 字节的固定后缀拼接计算 SHA1取摘要的第 8 到 15 字节并反转按 3 字节一组最后一组 2 字节做位运算从 64 字符集里取码最终输出 11 个字符的 NID。这个逻辑与 core/libs/nid/ 下 C 模块的Nid::ComputeNid完全一致——构建时 nid_patcher 会用它把所有导出的符号名改写成 NID这样 OS 加载器就能按 NID 完成绑定架构说明见 docs/dev/ARCHITECTURE.md。 拿到建议后如何落地解码只是第一步。一个典型的贡献流程是跑python3 tools/nid_names.py挑一个rename-ready的 NID在对应库如 core/libs/prx/libSceRandom/Export.cpp中把Unknown占位函数改成真实函数名根据文档注释补齐参数签名——部分 NID 的参数签名仍不明确会记录在 docs/dev/TechnicalDebt.md 中用 docs/user/COMPATIBILITY.md 里列出的游戏验证你的修改。总结命令用途python3 tools/nid_names.py全库扫描未知 NID 并给出真实名建议--nid NID...只查询指定的 NID--json输出 JSON 格式结果--db path指定自定义 NID 数据库nid_names.py 用不到 130 行代码就打通了扫描 → 查库 → 校验 → 建议的完整链路是新成员了解 AnyPS5 系统库实现进度的最佳入口。想深入 NID 计算原理可以继续阅读 core/libs/nid/ 模块及其测试用例 test_dynamic_strings.py。【免费下载链接】AnyPS5Tool for automatic PS5 executables porting to Linux and Windows项目地址: https://gitcode.com/GitHub_Trending/an/AnyPS5创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表