资讯动态

shadPS4Plus破解PS4游戏加密:AES-XTS解密PFS数据区+zlib解压PFSC全流程教程

发布时间:2026/10/23 1:52:33 来源:尧图企业网站定制
【免费下载链接】shadPS4PlusStandalone PKG extractor based on code that used to be in ShadPS4项目地址https://gitcode.com/gh_mirrors/sh/shadPS4Plus点击查看免费下载shadPS4Plus是一个开源的 PS4 游戏 PKG 文件解包工具它从 PS4 模拟器 ShadPS4 的代码中独立而来无需真机即可还原加密的游戏安装文件。本文是加密原理系列的下篇带你完整看懂最后两步如何用AES-XTS 模式解密 PFS 数据区以及如何用zlib 解压 PFSC 压缩块把加密字节真正变成可读取的游戏文件 一、先回顾上一篇我们做到了哪里在上篇中我们走完了 PKG 的密钥推导链。简单回顾整条链路读取 PKG 文件表中的ENTRY_KEYSID 0x10与IMAGE_KEYID 0x20条目用内置私钥RSA-2048 解密出 DK3对「条目数据 DK3」做SHA256 得到 ivkey再AES-CBC 解密得到 imgKey第二次 RSA 解密 imgKey得到解开 PFS 的总钥匙——EK_PFS。这条链的入口在 pkg.cppRSA2048Decrypt(dk3_, key1[3], true)解出 DK3ivKeyHASH256aesCbcCfb128Decrypt解出 imgKeyRSA2048Decrypt(ekpfsKey, imgKey, false)解出 EK_PFS。拿到 EK_PFS 后还差临门一脚EK_PFS 还不能直接用来解密 PFS 数据区它要先「派生」出两把真正的密钥。下面开始下篇的正题。二、PFS 文件系统游戏数据藏在哪个结构里PKG 文件里装游戏的主体部分叫PFS 镜像PS4 的文件系统PS4 File System。它的核心规则PFS 以4KB0x1000为基本扇区sector整个 PFS 数据区被按扇区加密镜像内嵌一块叫PFSCPFS Cache的元数据区存放文件表inode和目录项direntPFSC 内部按64KB0x10000大块组织每个大块要么「原样存放」要么「zlib 压缩后存放」。相关的数据结构定义在 pfs.h 的PFSCHdr中其中block_sz2块大小、block_offsets扇区偏移表位置、data_length数据总长是后文的关键字段。 一句话概括PFS 管在哪AES-XTS 管解得开zlib 管拆得小。三、AES-XTS 解密原理为什么 PS4 选它AES 加密有两种常见用法模式工作方式隐患AES-CBC数据块之间连环依赖相同明文在相同 IV 下产生相同密文可被比对AES-XTS每个块额外叠加一个位置因子tweak位置不同加密结果就不同PS4 给 PFS 扇区选的就是AES-XTS。你可以把它想象成「双保险箱」dataKey数据密钥真正的锁芯负责加解密每个 16 字节的数据块tweakKey调整密钥一个位置编码器扇区编号是多少锁芯的咬合角度就偏多少。这样即使两个扇区内容完全相同只要扇区号不同加密后的密文就完全不同——攻击者无法通过对比密文来猜测或篡改数据。3.1 密钥派生EK_PFS seed → 两把钥匙两把钥匙由PfsGenCryptoKey生成源码见 crypto.cpp把0x14 字节计数器和 PFS 头部的 16 字节seed拼成 20 字节输入以EK_PFS 为 HMAC-SHA256 的密钥对上述输入做摘要得到 32 字节前 16 字节是tweakKey后 16 字节是dataKey。其中 seed 从 PFS 镜像偏移0x370处读取派生调用见 pkg.cpp。3.2 解密循环每个扇区内的四步舞XTS 对每个扇区4096 字节 256 个 16 字节块的处理流程在 crypto.cpp 的decryptPFS中实现逻辑可以浓缩为tweak ← AES-ECB 加密(tweakKey, 扇区号) 对扇区内的每个 16 字节块 ① 密文块 XOR tweak → 临时块 ② 用 dataKey 做 AES-ECB 解密(临时块) ③ 解密结果再 XOR tweak → 明文块 ④ tweak ← GF(2^128) 乘 {2}xtsMult为下一块准备其中第 ④ 步的「tweak 乘法」在有限域 GF(2^128) 上进行实现只有短短几行——左移一位、若高位溢出则异或常数0x87见 xtsMult。正是它保证了「同一个扇区内、不同位置的块使用不同的 tweak」。⚠️两个实现细节扇区号直接以 8 字节小端整数写入 tweak 的前 8 字节memcpy(tweak, current_sector, 8)所以扇区号算错全盘皆密文decryptPFS从偏移0x10000起解密见 源码注释保留头部不解密调用时传入的起始扇区号与解密范围要一致。四、PFSC 在哪里按魔数扫描PFS 镜像解密完成后需要先找到 PFSC 元数据区的起点。shadPS4Plus 的做法非常朴素且稳健——扫描魔数见 GetPFSCOffset从偏移0x20000开始每隔0x1000064KB取 4 字节与魔数0x43534650即 ASCII 的PFSC比较命中即返回 PFSC 的偏移否则继续找。找到后把 PFSC 整体拷出并读取头部PFSCHdr算出大块数量num_blocks data_length / block_sz2再按block_offsets指向的位置读出sectorMap扇区偏移表——一个「每块起始偏移」数组后一块的起始位置就是前一块的实际长度。五、zlib 解压sectorSize 就是压缩判据PFSC 里每个 64KB 大块的「实际长度」由 sectorMap 相邻两项相减得到见 pkg.cppsectorSize 0x10000 → 该块未压缩直接拷贝 sectorSize 0x10000 → 该块是 zlib 压缩流需要 inflate 展开解压函数 DecompressPFSC 是标准 zlib 调用三件套inflateInit初始化解压器inflate(…, Z_FINISH)一次性展开inflateEnd释放资源。解压后的 64KB 内容按顺序依次是inode 表每个 0xA8 字节记录文件类型、大小、扇区位置、flat_path_table、.、..、然后是各目录项dirent。代码正是靠识别这些标记来解析出完整的目录树和文件清单见 pkg.cpp。六、完整流水线从一个文件到磁盘把上、下两篇串起来PKG::ExtractExtractFiles的完整流程是校验 PKG 头magic0x7F434E54解析文件表密钥链RSA → SHA256 → AES-CBC → RSA得到 EK_PFSpkg.cpp读 PFS seedHMAC-SHA256 派生 dataKey / tweakKey读取 PFS 镜像AES-XTS 整段解密decryptPFS起始扇区号为 0扫描PFSC魔数 → 读头部 → 建 sectorMap → zlib 解压各块 → 得到 inode 与目录表对每个文件按 inode 的loc/Blocks定位其在 PFS 中的扇区 → 逐扇区XTS 解密 zlib 解压→ 写盘ExtractFiles。第 6 步有个小技巧解单个文件时会多读一个扇区pfsc_buf_size 0x11000并把读到的整块按正确的扇区号重新解密保证 tweak 对齐见 pkg.cpp。七、动手使用 extractor 命令行工具理解了原理实际使用只需要一条命令。独立工具入口在 extractor/main.cpp命令行用法pkg_extractor pkg文件路径 [输出目录]第二个参数可省略默认解包到 PKG 同目录程序会自动识别 PKG 类型基础游戏返回码 101、游戏更新102追加-patch目录、DLC103按 CONTENT_ID 中的 label 归档配套的 install_pkg.sh 脚本可把游戏直接安装到 ShadPS4 的 games/addons 目录需先编辑目录配置Windows 下可直接把 PKG 拖到 exe 上。八、常见问题 FAQQ1解密出来全是乱码大概率是扇区号与解密范围不对齐——XTS 的 tweak 由扇区号决定错位一个扇区全盘失效。检查传入decryptPFS的sector参数是否与数据在镜像中的位置匹配。Q2zlib 解压报错说明该块本应未压缩却被当压缩块处理或反之。以sectorSize是否等于0x10000为准别自己猜测。Q3需要 PSN 账号或联网吗不需要。shadPS4Plus 是纯离线工具密钥均为公开内置常量全程不联网。Q4可以解什么文件仅限本地 PKG 安装包游戏本体 / 更新 / DLC用于提取或备份自己合法拥有的内容。写在最后到这里shadPS4Plus 的加密世界就完整了RSA 解开钥匙、SHA256/AES-CBC 层层传递、HMAC 派生双钥、AES-XTS 守护扇区、zlib 压缩瘦身——PS4 的 PKG 加密体系看似复杂拆开看只是几种经典算法的组合拳。相关文档可参阅 building-linux.md也欢迎在 Debugging 文档 基础上继续深入源码调试 ️赞分享【免费下载链接】shadPS4PlusStandalone PKG extractor based on code that used to be in ShadPS4项目地址https://gitcode.com/gh_mirrors/sh/shadPS4Plus点击查看免费下载相关推荐cvxpylayers与控制系统从LQR到MPC的可微分控制策略实现cvxpylayers与控制系统从LQR到MPC的可微分控制策略实现 cvxpylayers是一个强大的可微分凸优化层Differentiable conv人工智能深度学习Rufus制作启动U盘完整指南GPT/MBR分区方案与UEFI/BIOS怎么搭配Rufus制作启动U盘完整指南GPT/MBR分区方案与UEFI/BIOS怎么搭配 Rufus是一款免安装的免费启动U盘制作工具支持GPT/MBR分区方案与U桌面应用存储上一篇50纳秒到10倍性能提升gperftools全链路优化实战指南下一篇mirrors/ggml-org/models开源AI模型镜像库全解析轻松获取全球顶尖语言模型创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑