一次搞定网易游戏资源提取:unnpk 解包 NeoX 引擎 NPK 文件实战指南

发布时间:2026/8/18 3:04:01
一次搞定网易游戏资源提取:unnpk 解包 NeoX 引擎 NPK 文件实战指南 一次搞定网易游戏资源提取unnpk 解包 NeoX 引擎 NPK 文件实战指南【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk想从游戏包里抠几张立绘、研究一段掉落表逻辑结果 .npk 文件在解压软件里全显示成乱码开源工具 unn/DSMLparameter pk 就是为解包网易 NeoX 引擎 NPK 资源包而生的。这篇文章我会用自己实际踩坑的经历带你从零跑通解包、结构分析、脚本解密和批量处理的完整链路新手也能照着做。从一次全军覆没的解压开始我最初的动机很朴素想研究一下某款手游的美术资源是怎么组织的。拿到手的是一个几百 MB 的.npk文件file命令只告诉我dataWinRAR 打不开7-Zip 也打不开连xxd看开头都只有一串看不懂的魔数。折腾了大半夜差点就准备自己写解析器了。后来在社区里看到有人提到 unn/DSMLparameter pk——一个专为网易 NeoX 引擎 NPK 文件编写的解包工具支持阴阳师、魔法禁书目录等游戏的资源包。编译完一试一条命令就把包拆开了文件还自动按类型分好了类。那一刻的爽感值得写篇文章分享出来。初次见面unnnpk 到底帮我干了什么这个项目很小但分工很清晰一共就两块unnpk主解包程序负责读取 NPK、还原压缩数据、按类型归类输出mapnpk只读分析器把包里的文件清单、偏移量、压缩状态打印成表格方便你解包前侦察tools/ 下的三个 Python 脚本针对脚本类资源如阴阳师的 script.npk做二次解密这是普通解包器做不到的。它适合三类人想提取素材做 MOD 的玩家、想研究私有文件格式的开发者、以及刚入门逆向想找个真实练手对象的爱好者。不需要懂太多前置知识能敲命令就行。三步环境配置五分钟跑通第一个解包先装好一个依赖libmagicunnnpk 靠 libmagic 识别文件类型不同系统装法不一样# macOS brew install libmagic # CentOS / RHEL sudo yum install file-libs file-devel # Debian / Ubuntu sudo apt-get install libmagic-dev编译克隆仓库后一条make搞定编译需要 gcc 和 zlibgit clone https://gitcode.com/gh_mirrors/un/unnpk cd unnpk make编译成功后目录里会出现unnpk和mapnpk两个可执行文件。第一个解包案例用法就一行两个参数NPK 文件路径 输出目录./unnpk yys_assets.npk extracted/预期输出终端会打印一张文件清单表格同时extracted/目录下出现按 MIME 类型分类的子目录像这样extracted/ ├── image/png/00000001.png ├── image/jpeg/0000002A.jpg ├── application/zip/0000005C.zip └── text/plain/000000F3.txt有两个细节值得注意解出来的文件没有原始文件名用的是 8 位十六进制索引比如0A0D60DC这是 NPK 格式本身就不存文件名的缘故压缩数据会自动用 zlib 还原遇到损坏或非 zlib 数据时工具会把原始字节原样吐出来而不是直接报错终止——这种降级策略在解包工具里很实用。动手前先侦察用 mapnpk 把包看个底朝天第一次解包 500MB 的资源包我连里面有什么都不知道。后来养成了习惯先mapnpk看一眼再决定要不要解。./mapnpk -i yys_assets.npk它会输出包的总体信息和每个文件的索引、偏移量、压缩前后大小、校验位、是否压缩。支持导出 Markdown 表格或 CSV数值也支持十六进制/十进制/原始字节三种显示方式# 导出 CSV方便丢进表格软件里筛选 ./mapnpk -i yys_assets.npk -f csv -t int file_list.csv # 十六进制查看偏移方便配合十六进制编辑器核对 ./mapnpk -i yys_assets.npk -t hex预期输出示意# mapnpk! File size: 58234168 Byte Map offset: 0x00000024 | Index | Offset | Size (Byte) | Unzip size (Byte) | Chk | Unzip Chk | Is zip | | --- | --- | --- | --- | --- | --- | --- | | 0x00000001 | 0x00000038 | 0x00000A5C | 0x00002541 | 0x00000000 | 0x00000000 | Yes |看到Is zip列是Yes说明对应文件在包里是压缩存储的Size和Unzip size差距越大压缩收益越高。这一手在判断哪些文件值得提取、包有多大水分时特别好用。重头戏阴阳师 script.npk 的脚本解密流水线如果你只是想要图片和音频上面两步就够了。但如果你想要的是游戏脚本源码比如掉落概率、活动逻辑就得走完一整条解密链路。我以阴阳师的script.npk为例这是我认为这个项目最有含金量的部分。整个流程分四步解包 → 解密脚本 → 修正字节码 → 反编译。第一步解出脚本文件./unnpk script.npk script_raw/解开后你会发现很多没有扩展名的文件因为脚本的二进制内容既不是图片也不是文本无法被类型识别命中。第二步rotor zlib 字节反转拿其中一个文件比如0A0D60DC跑 tools/script_redirect.pypython tools/script_redirect.py script_raw/0A0D60DC 0A0D60DC.dec这个脚本是作者逆向阴阳师官方redirect.py后改写出来的内部做了三件事# 伪代码示意完整逻辑见 tools/script_redirect.py data rotor.newrotor(密钥).decrypt(data) # 1. ROTOR 流式解密 data zlib.decompress(data) # 2. 解压 data 反转并异或(data) # 3. 字节反转 异或 154密钥由asdf_dn、asdf_dt、asdf_df三段常量拼接而成不同游戏可能不同。这点很关键后面会再讲。第三步修正 opcode0A0D60DC.dec已经是 Python 2.7 的 pyc 内容了但还不能直接用因为字节码的 opcode 被映射过指令码被换成了一套自定义编号。跑 tools/pyc_decryptor.py 把它映射回去python tools/pyc_decryptor.py 0A0D60DC.dec 0A0D60DC.pyc这个脚本依赖同目录下的 tools/pymarshal.py——一个自己实现的 Python marshal 序列化器用来在读出 code 对象后重写co_code字节码。如果你对 Python 字节码格式好奇这个文件本身就是很好的教材。第四步反编译成源码uncompyle2 -o 0A0D60DC.py 0A0D60DC.pyc到这里加密的脚本就变成了可以阅读的 Python 源码。技术提示解密用的redirect.pyc其实就藏在script.npk里某个版本对应FB54F059这个文件文件名即它在包中的偏移量。想适配其他网易游戏可以按 README 里描述的思路先解包、再根据特征定位 redirect.pyc、提取出asdf_dn等密钥常量就能复用整条流水线。把解包变成流水线批量处理与按需筛选游戏更新很频繁每次版本变更都要重新解包。手敲命令太傻我写了个几行的批量脚本#!/bin/bash # 批量解包当前目录下所有 .npk for pkg in *.npk; do [ -e $pkg ] || continue out${pkg%.npk}_out mkdir -p $out echo [*] 处理 $pkg ... ./unnpk $pkg $out || echo [!] $pkg 解包失败继续下一个 done磁盘够快的话用xargs并行更省时间ls *.npk | xargs -P 4 -I {} ./unnpk {} {}.out按需提取的思路则是先用mapnpk导出 CSV再用awk筛选出目标条目只解感兴趣的包避免全量解包浪费时间。新手最容易搞错的四件事误区一以为 unnpk 能解所有网易游戏。不是的。NPK 外壳是统一的但脚本层的加密参数因游戏而异。解图片音频大概率没问题解脚本就要自己去找对应密钥了。误区二把 mapnpk 当成解包工具。它只读不写负责输出清单和分析报告解包请认准unnpk。这两个名字相似别搞混。误区三以为解出来的 pyc 能直接跑。不行脚本 pyc 的 opcode 被篡改过必须先过pyc_decryptor修正再补上标准 pyc 文件头才能交给反编译器。误区四看到Z_BUF_ERROR/Z_DATA_ERROR就以为失败了。这其实是工具的容错设计遇到无法解压的数据它会保留原始字节原样输出方便你后续自己研究而不是让整个解包流程崩溃。另外提醒一句README 作者明确说 Windows 上太折腾建议用 macOS / FreeBSD / Linux 环境跑这套工具链。源码里值得偷师的几手unnpk.c只有一个文件、三百行左右很适合当二进制解析的入门读物。几个亮点定位索引区文件偏移0x14处存着索引区起始位置读完就得到文件清单定长记录每个文件一条 28 字节记录7 个uint32分别存索引、偏移、压缩前后大小、校验位和压缩标志结构简单到可以手推类型嗅探先用 libmagic 判断 MIME再结合魔数KTX、RGIS、PKM和文本特征NeoX、vec4、v / vt / f推断出 ktx、glsl、obj 等格式这套内容识别思路可以直接迁移到别的解析项目里。二次开发的方向也很明确往扩展名判断分支里加你关心的新格式或者给脚本解密链写个一键化的 shell 封装想做得更友好还可以用 Python/Tk 套一层图形界面把unnpk当子进程调用。生态与同类工具对比和那些动辄几万 star 的通用解包框架比unnnpk 属于小而美的典型两个 C 程序加三个 Python 脚本没有花哨的 UI但把特定场景做到了极致。横向对比一下方案上手成本对 NPK 的适配脚本二次解密适合谁unnpk低一条命令专为 NeoX 设计自带工具链想快速拿资源的玩家和开发者通用解包框架中高不识别私有格式无处理通用格式的场景自己写解析器高完全可控自研想深挖格式原理的逆向爱好者README 用中文撰写作者明确欢迎 PR 补充内容社区研究脉络比如当年 fate0 公开的阴阳师脚本解密思路也直接写进了文档里。项目更新不算频繁但作为格式研究案例它的价值不在于版本迭代速度而在于把一条完整的逆向链路浓缩成了可复现的步骤。结语从一个打不开的.npk开始到脚本源码摆在眼前中间只隔着一串命令和几段可读性很好的 C 代码。下次再遇到打不开的资源包先别急着放弃——解包工具的思路往往比工具本身更值钱。延伸阅读跑通script.npk流水线后建议再读一遍 README.md 里关于定位redirect.pyc的说明那一段藏着适配其他网易游戏的钥匙也欢迎把新游戏的适配经验以 PR 形式回馈给项目。【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考