QuickBMS 完整指南:用脚本解锁游戏资源提取与重新打包的终极玩法
【免费下载链接】QuickBMSQuickBMS by aluigi - Github Mirror项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS
假设你是个游戏汉化爱好者,某天发现心仪的游戏把全部文本塞进了一个名叫text.pak的二进制包里,双击打开全是乱码。你上网求助,得到的回复是"用 QuickBMS 啊"。QuickBMS 是一款开源(GPL 2.0)的脚本驱动式多平台文件提取引擎,内置上百种压缩与加密算法,能像万能钥匙一样拆开绝大多数游戏的资源容器,甚至把改好的文件再塞回去。本文不打算罗列参数表,而是用一个完整的实战故事,带你从零学会这门手艺。
为什么游戏资源像上了锁的储物柜
大多数游戏的资源文件并不是简单堆在一起的文件夹,而是被封装进一种被称为"容器格式"(archive/pak)的单一文件里。容器内部通常包含三样东西:文件清单(记录每个文件的名称、偏移量、大小)、文件数据本体,以及可选的压缩层与加密层。想取用其中的资源,你必须知道这个容器的"开锁规则"。
传统做法是为每种游戏单独写一个提取工具,但游戏成千上万、格式千奇百怪,没人写得完。QuickBMS 的思路完全不同:把"开锁规则"抽离成一段可读的文本脚本(BMS 脚本),主程序只负责解释执行。遇到新格式时,你不需要等工具更新,自己写几十行脚本,或者从社区论坛找来现成脚本,立刻就能开工。这正是它拥有超过 200 种游戏格式支持、却依然保持轻量的根本原因。
图为 QuickBMS 内置的 Capstone 反汇编引擎演示界面,可对 ARM、x86 等架构机器码做指令级解析
三步完成环境准备,五秒跑通第一次提取
获取并编译程序
克隆仓库后,Linux 和 macOS 用户进入src目录直接编译:
git clone https://gitcode.com/gh_mirrors/qui/QuickBMS cd QuickBMS/src make编译依赖 openssl、zlib、bzip2,Debian/Ubuntu 系可用apt-get install gcc g++ zlib1g-dev libssl-dev补齐;若报 64 位链接错误,再补装libssl-dev:i386即可。Windows 用户则直接使用预编译的quickbms.exe。编译产物只有单个可执行文件,绿色便携,拷到哪都能用。
认识命令行三件套
QuickBMS 的调用格式固定为三段:脚本、输入文件、输出目录,例如:
quickbms script.bms game.pak ./extracted双击 exe 会进入图形向导模式,依次选择脚本、输入文件(支持整个文件夹)和输出目录即可,底层逻辑与命令行完全一致。执行后终端会逐文件打印进度与最终统计,你立刻能在输出目录里看到拆出来的文件。
实战:十分钟写出你的第一个 BMS 脚本
社区脚本虽多,但理解脚本语言才是真正掌握工具的起点。我们动手写一个拆包脚本。假设某游戏资源包的结构如下(实际逆向时用十六进制编辑器即可确认):
- 文件头 4 字节:魔数
GAME - 4 字节(long):文件数量
- 随后为每个文件重复:4 字节偏移 + 4 字节大小 + 以 0 结尾的文件名字符串
对应脚本只需九行:
idstring "GAME" # 校验魔数,防止用错脚本 get FILES long # 读取文件数量 for i = 0 < FILES # 循环遍历每个条目 get OFFSET long # 文件在包内的起始偏移 get SIZE long # 文件大小 get NAME string # 读取文件名字符串 log NAME OFFSET SIZE # 按 偏移+大小 把数据落盘 next i把这九行存为game.bms,然后运行:
quickbms game.bms game.pak ./out脚本能跑通的关键,是你已经摸清了容器格式的字段布局。逆向时手边放一个十六进制查看器,对照着看脚本里每个get是不是读到了正确的位置。读错了就调整类型——QuickBMS 支持byte、short、long、string、unicode、bits等数十种数据类型,配合goto跳转和math运算,几乎能描述任何布局。
进阶实战:解开压缩与加密的两层铠甲
单纯偏移+大小的容器只是入门,真实游戏往往在数据段上又套了一层压缩或加密。处理它们只比上面多两个命令。
压缩数据用 clog 与 comtype
如果文件数据是 deflate 压缩的,脚本里先声明压缩算法,再用clog(compressed log)代替log,额外给出压缩后大小与解压后大小:
comtype deflate # 声明使用 deflate 算法 clog NAME OFFSET ZSIZE SIZE # ZSIZE=压缩后大小, SIZE=解压后大小src/compression/目录下躺着上百个算法源文件:zlib、bzip2、lzma、zstd、snappy、lzo 这些通用选手,也有 PRS(世嘉)、ScummVM、Nintendo 系等游戏专用算法。想知道当前编译版本内置了哪些,运行quickbms -U即可列出清单。
加密数据用 encryption
若数据带 XOR 或流式加密,脚本在处理前设置密钥,之后所有读写都自动经过解密:
encryption rc4 "my_secret_key"src/encryption/提供了 RC4、ChaCha20、Salsa20、AES、Twofish、Serpent 等 80 余种算法。值得注意的是,QuickBMS 还支持callfunction自定义函数、putvarchr分配内存、mem2mem内存文件搬运等高级命令,遇到分块拼接的数据可以先用append合并到MEMORY_FILE再统一处理。
重打包:把修改后的文件塞回容器
提取只是第一步,汉化与 MOD 的关键在于把改过的文件原路放回。QuickBMS 的重导入(reimport)功能复用同一个脚本,零改动即可回写,这也是它被称为"重新打包神器"的原因。
三种重导入模式怎么选
| 模式 | 命令 | 适用场景 |
|---|---|---|
| REIMPORT | -w -r | 改后文件 ≤ 原文件大小,最通用 |
| REIMPORT2 | -w -r -r | 改后文件可大于原文件,自动把超出部分追加到包尾并修正偏移/大小字段 |
| REIMPORT3 | -w -r -r -r | 容器无偏移字段、纯顺序存储时,自动收缩/扩充容器本体 |
仓库scripts/目录下的reimport.bat、reimport2.bat、reimport3_localizations.bat分别封装了这三种模式。完整流程是:
# 第一步:正常提取 quickbms script.bms game.pak ./out # 第二步:修改 out 中的文件,删除未改动的文件 # 第三步:回写(注意先备份原包) quickbms -w -r -r script.bms game.pak ./out三个实用提醒:其一,REIMPORT 模式下改后文件只能等于或小于原大小,想自由增容请用 REIMPORT2;其二,回写压缩文件时工具会自动调用对应的压缩算法重压,个别只提供解压实现的算法会回写失败;其三,容器目录表若本身被压缩或存在内存文件里,REIMPORT2 可能失效,此时只能退回 REIMPORT。
批量作业与性能调优的几个细节
面对一个装有上千个容器的游戏目录,逐个处理显然不现实。QuickBMS 支持把整个文件夹作为输入,配合-F通配符一次跑完:
quickbms -F "{}.pak" zip.bms ./game_dir ./out只想抽取特定文件时用-f(作用于包内文件)加通配符,-f "{}.mp3;!{}.ogg"表示只取 mp3 且排除 ogg;先跑-l列出清单再决定提取哪些,能省去大量无效 IO。调试脚本时,-v输出逐步执行的详细日志、-V面向格式开发者的堆栈信息、-0只跑脚本不落盘,三者组合足以定位绝大多数问题。
内存方面,临时拼接数据优先用MEMORY_FILE(驻留内存、读写极快),超过 2GB 的大块数据改用TEMPORARY_FILE(落盘)。脚本里少用全局变量、及时用putvarchr收缩不再需要的内存文件,长任务能明显提速。
常见问题速查:三个高频翻车点
① 提取一半报错,或输出乱码文件多为脚本版本与游戏版本不匹配,容器的字段布局已变。先对照十六进制工具核对魔数与偏移是否还吻合,用-v看是哪一步读错了;若魔数变了,idstring校验必然失败,直接去社区找对应新版本的脚本更省事。
② 超过 4GB 的大包处理不了标准版 QuickBMS 内部使用 32 位整数,官方提供quickbms_4gb_files变体(把-DQUICKBMS64加进 Makefile 的 CDEFS 重新编译即可获得),支持 64 位偏移。注意该变体对个别脚本兼容性有差异,属于实验性功能,脚本本身也要用longlong等 64 位类型读取字段。
③ 重导入后游戏崩溃或文件没生效先确认改后文件没有超出原大小(REIMPORT 模式硬性限制);其次,容器若带 CRC/哈希校验,重导入无法更新这些字段,游戏会拒绝加载;最后检查是否误改了未导出的文件——重导入只处理输出目录中与提取时同名同序的文件。
学习路线:从抄脚本到写引擎
新手期:先跑通图形界面的"选脚本→选包→选目录"三步,用现成脚本拆几个知名游戏的资源,体会容器格式的通用套路,再对照-l列表理解每个文件的来源。
进阶期:拿着十六进制编辑器逆向一个简单格式,独立写出上文那种九行脚本;接着啃压缩与加密层,学会comtype、encryption、MEMORY_FILE的配合;尝试用-r -r完成一次完整汉化回写。
高手期:研究src/下各模块的实现——quickbms.c是主入口、bms.c负责脚本语法解析、perform.c是命令执行引擎、var.c管理变量系统;在src/compression/与src/encryption/中对照 Makefile 学习如何集成新算法;甚至可以用-W开启实验性 Web API 做二次开发。
结语
QuickBMS 的价值在于它把"为每个游戏写专属工具"的笨办法,替换成了"写一段文本脚本"的轻量方案。学会它的脚本语言,你掌握的其实是所有容器格式的通用解剖学——无论资源藏在压缩层还是加密层之下,都逃不过idstring、get、log这三个基础动作的组合。深入源码时,优先从这几个文件读起:主入口src/quickbms.c、脚本解析器src/bms.c、执行引擎src/perform.c、变量管理src/var.c,以及算法库src/compression/与src/encryption/。
合法使用声明:本文介绍的提取、修改与重打包能力仅限合法的学习与研究用途。未经授权提取或篡改商业游戏资源可能侵犯软件著作权,请在获得开发者许可后再进行实际操作,并严格遵守所在国家与地区的法律法规。
【免费下载链接】QuickBMSQuickBMS by aluigi - Github Mirror项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考