
QuickBMS 深度解析文本脚本驱动的二进制文件提取引擎【免费下载链接】QuickBMSQuickBMS by aluigi - Github Mirror项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS游戏 MOD 制作中常见这样的局面资源被压进一个没有公开文档的.pak文件里官方工具只能整体安装、不能单文件替换。为每一种格式写一个独立提取器再写一个重打包器成本极高。QuickBMS 的思路是反过来的引擎本身不内置任何文件格式格式知识全部外置为纯文本脚本.bms同一个脚本既能提取也能把改过的文件重新注回原包。这个「脚本即格式」的设计是它区别于专用解包工具的根源。一个脚本如何变成解包器BMS 解释器QuickBMS 的核心不是某段解析代码而是一个对 BMS 语言的递归解释器。入口在 src/bms.c 的start_bms()它把脚本读成一串命令Get、Log、Clog、For、If……然后逐条执行遇到For、Do、If这类递归命令时用宏BMS_START_NEW递归调用自己break/continue 通过参数继承。命令枚举集中在 src/defs.h 的CMD_Get、CMD_Log等约七十项里。这个解释器的几个设计决定值得注意一切皆变量。除数字常量外标识符一律当变量处理变量和常量在运行时是同一数据结构命令名和变量名大小写不敏感get OFFSET long与GeT oFfSeT lOnG等价。文件编号模型。输入包固定是 0 号文件Open打开的辅文件从 1 起编号负数编号是内存文件-1即MEMORY_FILE。大段中间数据比如解密后的临时缓冲区不落盘这正是很多带加密表格式脚本能工作的原因。有界整数。标准构建用带符号 32 位运算约束是归档最大 4GB、包内单文件最大 2GB。超过这个量级要换quickbms_4gb_files加-DQUICKBMS64编译的实验构建64 位数值部分脚本数学运算可能出错。一个最简脚本的样子逻辑就是读目录 → 循环取文件名/偏移/大小 → Clog 解压落盘get MAGIC long if MAGIC ! 0x50414B31 cleanexit endif for get NAME string get OFFSET long get SIZE long if OFFSET 0 break endif clog NAME OFFSET SIZE nextComType一张字符串表分派 875 种压缩脚本里写ComType ZLIB引擎怎么知道调哪个解码器答案在 src/cmd.c 的CMD_ComType_func()3917 行起把算法名做stricmp字符串匹配命中后设置全局g_compression_type真正干活的是 src/perform.c 的perform_compression()里面 1000 多个case COMP_*分支把数据交给具体实现。算法名表维护在 src/comtype.h875 个QUICKBMS_COMP(X)宏定义通过 X-Macro 同时生成枚举、名称列表和分派语句——新增算法只需加一行宏再在 perform.c 补上 case。分派逻辑还处理别名与变体例如NRV2b映射到 UCL 库、base32nintendo走COMP_MULTIBASE并改写字典长度、SCUMMVM6到SCUMMVM31是一整族游戏专用算法。压缩/解密的算法实现体则按来源散落在 src/compression/约 173 个文件与 src/encryption/约 92 个文件第三方库统一收在 src/libs/ 下包括 zstd、brotli、capstone反汇编支持Get ... ASM类型、lua脚本可跑 C 片段见 src/libs/lua/等。 这个机制直接决定了 QuickBMS 的能力上限脚本作者不需要懂 C只要知道目标格式用了哪种压缩就能在脚本里指名道姓地调用。重导入同一份脚本反向跑提取器人人会写能把改过的文件塞回原包且不破坏结构才是 QuickBMS 的识别度所在。-r选项触发 REIMPORT 模式执行时引擎把QUICKBMS_REIMPORT置位Log/CLog从写出变成定位原文件中该文件的位置并覆写。源码依据见 src/defs.h 中CMD_Reimport与g_reimport2_offset/zsize/size等全局状态。三种模式的能力差异很清楚REIMPORT-r新文件必须小于或等于原大小多余部分用-b指定的填充字节补上。REIMPORT2-r -r更大的文件追加到包尾并回写 TOC 里的 offset/size/压缩大小三个字段但要求 TOC 明文且位于头部且脚本对该字段最多做一次 math 运算MAX_REIMPORT_MATH_OPS限制下的匹配逻辑压缩表或MEMORY_FILE里的目录不支持。REIMPORT3-r -r -r在 REIMPORT2 基础上对无 offset 字段的顺序型包做整体缩容/扩容适合语言文件之类。CRC 与哈希字段无法参与回写带 chunkAppend的内容和依赖 MEMORY_FILE 临时解密的加密表也只支持实验性回导——这些边界在 readme.md 第 3 节有完整清单动手前先读。目录里有什么关键逻辑落点位置职责src/quickbms.c命令行入口、参数解析40 余个开关src/bms.cBMS 解释器主循环start_bms()src/cmd.c逐命令实现CMD_ComType_func()在此src/perform.cperform_compression()实际算法分派src/file.c、src/file.c 同级的 src/types.c文件抽象含 MEMORY_FILE与数据读写字节序src/extra/CallDLL 运行时tcc、内存模块等扩展能力典型用法批量提取与回注命令行只需三个必需位置参数脚本、输入文件或整个目录、输出目录。输入可以是目录——配合-F能对一整棵游戏目录做批处理quickbms -F {}.arc -o script.bms C:\game\assets C:\out quickbms -l -f {}.mp3 zip.bms archive.zip quickbms -w -r script.bms archive.pak C:\out第一段批量解包指定目录下所有.arc并覆盖同名输出第二段只列出.mp3不落地第三段是回注。注意通配符在 Windows 控制台里建议用{}代替*避免 shell 抢先展开-l列表、-f/-F过滤是日常最常用的三个开关。编译与部署Makefile 一条命令源码在 src/ 下有 Makefile依赖只有 openssl、zlib、bzip2mcrypt、tomcrypt 可选默认在 CDEFS 里用DISABLE_*关掉。Debian 系缺依赖时的标准修复apt-get install gcc g zlib1g-dev libssl-dev unicode make⚠️ Makefile 里CFLAGS带-m32QuickBMS 只在 32 位下测试过64 位原生代码会出问题。macOS 用户需要 Homebrew 的 opensslMakefile 会自动切-m64静态链接 brew 的库。装好后make install会把二进制放进/usr/local/bin。边界与排错先想清楚是哪一层的错引擎把错误码分得很细src/defs.h 中QUICKBMS_ERROR_COMPRESSION、QUICKBMS_ERROR_BMS等 13 类排错时按顺序排除脚本报错BMS 类加-v看逐命令输出偏移、命令号、源码行-V是面向格式调试的另一种详细模式。90% 的情况是偏移算错或字段宽度byte/short/long读错。字节序问题默认小端。大端格式要么在脚本里用Endian big要么偷懒用-E选项整体翻转所有数值字段配-w可写回常用于 Xbox/PC 格式转换。压缩错误COMPRESSION 类算法名与数据实际编码不符-e可忽略错误强转 dump 出乱码数据辅助判断-U列出全部可用压缩名-U 关键词搜索。大文件崩溃或内存不足标准版 4GB/2GB 上限之外扫描大目录吃内存时可加-9关闭内存保护或换 4GB 版可执行文件。回注失败先对照 REIMPORT2 的不适用清单——压缩表、尾部 TOC、顺序内容、字段多重运算、游戏信任原包大小命中任何一条就换模式或放弃。与同类工具的差异点其实就两条专用解包器通用压缩工具QuickBMS新格式成本写新工具不支持几行文本脚本提取后回注通常没有无同一脚本反向跑收个尾QuickBMS 把格式知识从二进制里挪进了 875 条宏名的字符串表和几行文本脚本ComType的分派表与-r的回注状态机是这套架构里最见功力的两块。当第 101 种未知归档出现在桌上时写脚本的成本远低于写工具——这大概就是它活了十几年还有人往 comtype.h 里加名字的朴素原因。【免费下载链接】QuickBMSQuickBMS by aluigi - Github Mirror项目地址: https://gitcode.com/gh_mirrors/qui/QuickBMS创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考