解不开网易游戏的 NPK 包?这份 unnpk 上手路线图请收好
【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件,如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk
你可能在某个资源站下载过《阴阳师》的补丁,满怀期待地解压,却只得到一堆十六进制文件名和乱码。这些.npk文件是网易 NeoX 引擎打包游戏资源的专用容器,市面上几乎没有现成的通用工具能打开它。开源项目unnpk正是为此而生:两个用 C 写的可执行程序负责拆包,三个 Python 脚本负责解密,组合起来能把《阴阳师》《魔法禁书目录》等游戏里的模型、贴图、脚本一件件完整"请"出来。
先弄清楚:NPK 到底难在哪
如果把 NPK 文件比作一间没有门牌的仓库,你会更容易理解它的结构:
- 文件头相当于仓库的登记簿,记录着版本、大小等元信息;
- 索引表是货架清单,告诉你每份资源"叫什么、堆在哪、占多大";
- 数据区则是密密麻麻的货架本体。
麻烦的地方在于,索引表里的"名字"不是models/hero.png这样的明文路径,而是一串经过哈希运算的数字;而且索引表的起点藏得很深,需要从文件偏移0x14处读出一个 4 字节的数值才能定位。通用解压软件既没有这套哈希映射,也不知道该去哪找索引,自然只能干瞪眼。
所以正式动手之前,建议先用配套的mapnpk摸个底。它能按多种格式把索引表原样导出,帮你确认包内资源的构成:
./mapnpk -f csv input.npk > structure.csv # 导出 CSV 表格 ./mapnpk -f markdown -t hex input.npk # 默认输出 Markdown 表格每行对应一条资源记录,包含索引号、数据偏移、压缩前后的大小、压缩标志等 7 个字段。看懂了这张表,后面解包时心里就有数了。
十五分钟跑通第一次解包
unnpk 对运行环境的要求不高,Linux、macOS 都行,唯一的外部依赖是libmagic(用于识别文件类型):
# macOS brew install libmagic # CentOS / RHEL sudo yum install file-libs file-devel依赖装好后,clone 源码并编译,一个make就能得到unnpk和mapnpk两个可执行文件:
git clone https://gitcode.com/gh_mirrors/un/unnpk cd unnpk make解包本身更是简单到只有一条命令,两个参数分别是"待解包的 NPK 文件"和"输出目录":
./unnpk scene_resources.npk extracted_scenes命令跑完,你会在extracted_scenes下看到按MIME 类型分好的子目录,比如image/、text/、application/,里面是0A0D60DC.png这类"哈希名 + 扩展名"的文件。为什么这样命名?因为 NPK 索引里根本没有原始文件名,哈希值就是它唯一的身份标识。控制台还会同步打出一张表格,列出每个文件的偏移、大小、压缩状态和识别出的类型,方便你核对有没有漏包。
它凭什么认识这些文件
拆包只完成了一半,另一半是类型识别。如果解出来的全是一堆无扩展名的裸数据,后续处理依然很痛苦。unnpk 的思路是"双保险":
- 先交给 libmagic,根据内容特征给出 MIME 类型,比如
image/png、video/mp4、application/font-sfnt; - 再对游戏特有的格式做二次校验。文件头是
KTX、RGIS、PKM等魔数时直接补上对应后缀;文本类内容则根据<NeoX、<FxGroup、<SceneMusic这类开头标签识别出各类 NeoX XML,还能通过vec4、tex2D、float等关键词把 GLSL 着色器和 OBJ 模型区分出来。
也就是说,它像个眼力很好的分拣员:先看整体类别,再抠细节特征,尽量减少"类型张冠李戴"的情况。
另一个贴心的细节是解压失败不中断。当某个文件被判定为 zlib 压缩、但解压时报错时,unnpk 会保留原始字节照常输出,只在终端打一条警告,整个批次继续往下走。对于动辄上千个文件的资源包来说,这种"坏一个不拖垮全队"的设计能帮你省下大量排查时间。
硬核彩蛋:把《阴阳师》的脚本完整解密
如果说拆包是开胃菜,脚本解密才是 unnpk 真正亮眼的地方。以《阴阳师》的script.npk为例,解包后会得到一堆无扩展名的文件,其中就藏着游戏逻辑脚本。挑一个(比如0A0D60DC),按下面三步走:
# 第一步:依次完成 rotor 解密、zlib 解压与字符串反转 python tools/script_redirect.py 0A0D60DC > 0A0D60DC.out # 第二步:修复被重新映射的 Python 字节码 opcode python tools/pyc_decryptor.py 0A0D60DC.out 0A0D60DC.pyc # 第三步:反编译成可读的 Python 源码 uncompyle2 -o 0A0D60DC.py 0A0D60DC.pyc三层保护逐层剥掉,最终拿到接近原始样貌的.py文件。这里要特别提醒:tools/script_redirect.py中的asdf_dn、asdf_dt、asdf_df三个加密参数是针对《阴阳师》逆向得到的,不同游戏、不同版本可能不同。一个实用的找参数思路是——解密用的redirect.pyc本身就躺在script.npk里(3.0.3 版本对应FB54F059这个文件),先把它解出来,再通过动态调试反推出新参数。
上手前,先避开这几个坑
- 别在 Windows 上硬刚。作者的建议很直白:路径分隔、libmagic 编译、Python 2 环境都会让你怀疑人生,老老实实用 Linux/macOS;
- 解密链路依赖 Python 2 和 rotor 库,以及 uncompyle2 反编译器,装环境时别漏了它们;
- 不是所有网易游戏都适用同一套参数。解不开时先怀疑版本差异,再怀疑工具本身。
说到底,unnpk 适合三类人:研究游戏引擎资源组织方式的逆向爱好者、想拿原始素材做 MOD 或本地化翻译的玩家,以及把"二进制格式解析"当教学案例的学生。当然也请守住一条底线——这些能力只用于个人学习研究,别拿去商用或二次分发。
想动手的话,现在就去 clone 一份源码,准备一个手头的 NPK 文件,按文中的路线完整走一遍。当你第一次看到上千个资源被整齐地分门别类摆进目录时,那种感觉还是挺奇妙的。🚀
【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件,如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考