尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

用 unnpk 快速解开网易NPK文件:从零开始的完整上手指南

用 unnpk 快速解开网易NPK文件:从零开始的完整上手指南 用 unnpk 快速解开网易NPK文件从零开始的完整上手指南【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk如果你玩过《阴阳师》或《魔法禁书目录》大概率遇到过这种尴尬想提取一张立绘、看看某个场景配置结果资源目录里躺着一堆.npk文件双击打不开、改后缀没用、网上搜半天也找不到趁手的工具。别急着放弃unnpk 就是专门解包网易 NeoX 引擎 NPK 文件的开源工具从解包到反编译一条龙这篇文章带你从零跑通全流程。一个周末的执念资源就在眼前却隔着一层壳有位 mod 爱好者在论坛里发帖他想给某款网易手游做皮肤替换美术资源都找到了但全被塞进script.npk、asset.npk这类「铁盒子」里。他试过 Hex 编辑器硬翻翻了一天只确认了文件头有规律却不知道盒子内部怎么编排。这就是 NPK 的常态——它是网易 NeoX 引擎的私有打包格式数据按索引表组织、内部文件大多经过 zlib 压缩格式不公开常规解压软件一概不认。他需要的其实是一套「开箱-拆包-归类」的完整链路先验证这是不是 NPK 文件再读出内部索引解压每个资源最后按类型自动分好类。而 unnpk 项目恰好把这三步全做了还附带解密脚本的工具链。接下来我们不聊原理先让你 10 分钟内看到第一个成果。三分钟上手一条命令跑通 NPK 解包全流程第一步装好依赖并编译unnpk 依赖两个东西zlib解压和 libmagic识别文件类型。不同系统装法不同# Debian/Ubuntu sudo apt-get install libmagic-dev build-essential # CentOS sudo yum install file-devel gcc make # macOS brew install libmagic然后获取源码并编译git clone https://gitcode.com/gh_mirrors/un/unnpk cd unnpk makemake会同时生成两个可执行文件unnpk解包工具和mapnpk结构探查工具。依赖装齐的情况下编译通常几秒钟就结束。第二步执行解包命令# 语法./unnpk [NPK文件路径] [输出目录] ./unnpk game_data.npk extracted注意参数顺序第一个是 NPK 文件第二个是输出目录。如果目录不存在它会自动创建创建失败也只是打个警告不影响继续执行。第三步看懂输出清单运行后终端会打出一张表格列出每个内部文件的信息| Index | Offset | Size | Unzip size | zip | MIME Type | Extension | | 00000001 | 0x00001000 | 1.2 MB | 3.5 MB | Yes | image/png | .png | | 00000002 | 0x00015000 | 450 KB | 450 KB | No | text/xml | .NeoX.xml |同时extracted目录下会按 MIME 类型自动建好分类文件夹图片进image/png/、配置文件进text/xml/文件用八位十六进制的偏移量命名如0A0D60DC.png。到这里第一个 NPK 文件已经成功拆开。本节结论装依赖、make、一条命令三步就能把 NPK 拆成按类型分好类的普通文件。幕后拆解NPK 解析工具内部如何一步步运转目录索引0x14 偏移处的 map_offsetNPK 文件头部并不复杂在偏移0x14处存着一个 4 字节的map_offset它指向文件内部的索引表起始位置。你可以把它理解成仓库门口的指示牌写着「货架清单在第几页」。unnpk 的第一件事就是读出这个值// 跳到文件偏移 0x14读出索引表偏移量相当于找到仓库货架清单 fseek(npk, 0x14, SEEK_SET); uint32_t map_offset; fread(map_offset, 4, 1, npk);拿到索引表起点后工具从那里开始每 28 字节7 个 4 字节字段读一条记录一直读到文件末尾。每条记录就是一个内部文件的「档案卡」编号、数据偏移、压缩后大小、解压后大小、以及一个压缩标志位。解压判定压缩前后大小对不上就拆包档案卡里第 6 个字段是压缩标志另外压缩前后大小file_info[2]与file_info[3]不一致也说明数据被压过。只要命中其一unnpk 就调用 zlib 的uncompress解压// 若压缩标志为真或压缩/解压大小不一致说明数据被压缩过 if (file_info[6] || file_info[2] ! file_info[3]) { // 分配解压缓冲区交给 zlib 解压 uncompress((uint8_t*)file_out_buf, file_destLen, (uint8_t*)file_read_buf, file_info[2]); }如果解压失败Z_DATA_ERROR等它不会直接崩溃而是退一步把原始数据原样写出并在终端提示「Data is not zlib」把选择权留给你——这比一报错就终止贴心得多。类型识别libmagic 先定性内容特征再细分解压完就该给文件定扩展名了。工具先用 libmagic 拿到 MIME 类型做粗分类再针对文本文件看内容特征做细分// 先用 libmagic 识别 MIME 类型再按文件头特征细分扩展名 file_out_type (char *)magic_buffer(cookie, file_out_buf, file_info[3]); // 例如以 NeoX 开头的文本文件标记为 .NeoX.xml if (strcmp(file_out_buf, NeoX) 0) { file_out_extension .NeoX.xml; }所以你能在输出里看到.NeoX.xml、.glsl着色器、.obj模型这类比通用 MIME 更精确的扩展名这就是「按内容特征二次识别」的功劳。本节结论整个解析只有三步——读索引、按需解压、按内容定类型逻辑清晰到你可以直接读unnpk.c全文跟一遍。实战玩法从看图到读脚本的三级跳玩法一先用 mapnpk 摸清 NPK 底细大文件直接解包可能耗时先探查再决定解不解是更聪明的做法。mapnpk输出结构清单支持 Markdown 和 CSV 两种格式# 以 Markdown 格式、十六进制数值输出结构报告到 report.md ./mapnpk game_data.npk -o report.md -f markdown -t hex报告里会包含文件总大小、索引表偏移量以及每个内部文件的偏移、大小、是否压缩等元数据。翻一遍报告你就知道这个包里主要是图片还是配置值不值得花时间解。玩法二解开阴阳师 script.npk 里的 Python 脚本这是 unnpk 的进阶王牌场景README 里有完整流程核心是三步接力# 第 1 步解开 npk取出脚本文件文件以偏移量命名如 0A0D60DC ./unnpk script.npk script # 第 2 步用 script_redirect.py 还原脚本rotor 解密 zlib 解压 字符串反转 python2 tools/script_redirect.py script/0A0D60DC 0A0D60DC.out # 第 3 步用 pyc_decryptor.py 修正 opcode得到标准 .pyc 文件 python2 tools/pyc_decryptor.py 0A0D60DC.out 0A0D60DC.pycscript_redirect.py里维护着三组密钥字符串asdf_dn、asdf_dt、asdf_df这是根据逆向分析得来的。拿到标准.pyc后再用uncompyle2反编译游戏逻辑就变成可读的 Python 源码了。注意这几个工具目前按 Python 2 环境编写跑之前先确认环境。玩法三批量解包脚本多个 NPK 文件逐个手敲命令太累一个三行的循环就能搞定# 批量解包当前目录下所有 .npk 文件到同名子目录 for f in *.npk; do ./unnpk $f out_${f%.npk} done配合前面讲的文件命名规则按偏移量命名、按类型归档批量解包后整理资源就非常顺手。本节结论从探查结构、解包资源到反编译脚本三个场景递进覆盖了资源研究最常遇到的三种需求。避坑清单新手最常踩的 5 个坑参数只给一个或给了三个unnpk 严格校验参数个数argc ! 3时只打印帮助信息就退出。检查一下命令是否恰好是「工具 NPK 路径 输出目录」三段。编译报找不到 magic.h说明 libmagic 开发库没装。Debian 系装libmagic-devCentOS 系装file-devel别只装运行库。解压时出现 Data is not zlib 警告这不是崩溃工具已把原始数据原样输出。这个文件可能本来就没压缩或是其他加密格式先查看原始内容再判断。输出目录名带了结尾斜杠./unnpk a.npk out/也没关系工具会主动把末尾的/去掉但目录创建失败时只有警告建议提前建好目录并确认写权限。script_redirect.py 报No module named rotor需要 Python 2 环境并先pip install rotorpyc 修正那步还需要pymarshal就在tools/目录里保持同在脚本目录即可。遇到问题先看终端输出的E:和W:前缀E是硬错误W大多可以继续跑。本节结论绝大多数坑集中在依赖安装、参数数量和 Python 2 环境三件事上对照排查基本都能解决。共赢展望边界、路线与参与方式最后说点实在的。unnpk 目前的边界也很明显它主要面向经典 NeoX 引擎版本加密算法如script_redirect.py中的密钥串针对特定游戏逆向而来不同游戏、不同版本可能需要重新分析脚本解密依赖 Python 2 工具链对新手有一定门槛。这些恰恰是社区可以发力的地方——项目 README 就明确欢迎大家补充其他游戏的解密方法。如果你有兴趣参与方向很具体在tools/下为其他网易游戏适配script_redirect.py的密钥、为unnpk.c增加更多类型识别规则、或者把 Python 2 脚本迁移到 Python 3。项目采用 Apache 2.0 许可证fork 后提 PR 即可改动小而明确非常适合作为第一个开源贡献。结论一个工具的价值不在于代码量多少而在于它让一群人从「打不开」到「看得懂」——unnpk 正是这样的存在而下一份解密脚本可能就出自你手。【免费下载链接】unnpk解包网易游戏NeoX引擎NPK文件如阴阳师、魔法禁书目录。项目地址: https://gitcode.com/gh_mirrors/un/unnpk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表