从本质上来说,QuickBMS只是一个通用解包器引擎,由Luigi Auriemma开发并维护,虽然QuickBMS简单而高效,技术组也经常使用QuickBMS来解包游戏的资源文件,但任何技术都存在一个入门门槛,而本篇以及后续教学笔记就试图为同学们拆除这个门槛。
那么,进入QuickBMS世界的门槛有多高呢?我将使用什么方法来拆除这个门槛呢?
第一节 QuickBMS使用方法
QuickBMS的使用方法没有任何难度,其步骤如下所示:
1、使用鼠标左键双击运行quickbms.exe程序。
2、选择一个解包脚本。
3、选择一个游戏资源文件(包文件)。
4、选择一个输出文件夹来存放解包出来的文件。
5、观察解包进度。
就这么几个步骤,是不是很简单啊?请同学们牢记,针对QuickBMS程序来说,无论在任何情况下,解包脚本、包文件和输出文件夹都是必须的,让我们来仔细的观察一下这三个必须存在的东西:包文件已经由等待汉化的游戏提供出来了,输出文件夹我们自己在硬盘上建立一个就行了,那解包脚本在哪里呢?答案是没有。这也是我们为什么把QuickBMS称为通用解包器引擎而不是通用解包器的原因,QuickBMS本身并不包含万能的解包脚本(因为根本不存在什么万能解包脚本),而是需要使用者自己针对特定的包文件结构编写出特定的解包脚本,这就是所谓的QuickBMS技术门槛,对猛犸技术组来说,这个门槛的高度是零,技术组的真正门槛是分析和汇总各种各样的包文件结构并最终整合,但对于同学们来说,在已知包文件结构的前提下,如何编写出解包脚本是现阶段必须跨过的门槛。
在讨论怎样编写解包脚本之前,先让我们简单了解一下QuickBMS程序的术语或适用范围,如下所示:
1、编程技术并不是必须的,但是会编程能够让你更好的理解解包脚本的逻辑性。
2、解包过程并不需要知道全部的包文件格式,只要知道了文件名称、数据偏移和文件大小就可以解包。
3、解包脚本中的命令和变量名称大小写不敏感。
4、任何32位数值都是有符号的(-2147483648到2147483647),因此QuickBMS不能处理大于2GB的文件,但是能够在小于4GB的文件上进行查找,也就是说只能处理最大4GB的包文件和最大2GB的包内文件。
5、被称为常量的字符串(依赖于命令的上下文)可以处理成C语言中的字符串标记法,例如: "\x12\x34\\hello\"bye\0",这里的关键是C语言的转义字符或转义序列。
6、支持由0x开头的16进制数值,例如1234和0x4d2是相同的。
7、任何大于8位的操作都要受控于全局大小序,默认是小序,否则需要使用Endian命令来指定。
8、注释能够使用C语言的//和/* */,以及BMS语法#。
9、QuickBMS中打开的每个文件都有一个关联号,所有的命令都使用这个号码来存取文件,默认为0。
10、内存文件是临时文件的一种特殊类型,驻留在内存中,其工作类似于普通文件。
11、临时文件可代替存储在物理硬盘上的相同文件。
了解了这么多,那么我们该如何编写解包脚本呢?其实所谓的解包脚本就是一个文本文件,其内容描述了特定包文件的逻辑结构关系,QuickBMS本身为我们提供了20种数据类型和40条命令,用来方便我们编写解包脚本,这就像炒菜一样,油盐酱醋、蔬菜和肉类都放在那里了,你只要按照一定的顺序依次下锅,就会色香味俱全了。
下面的两个小节就分别列出QuickBMS提供的数据类型和命令(截止于0.4.6a版本),同学们可以细细体会一番,而后续教学笔记将使用具体的游戏实例来讲解这些数据类型和命令的使用方法以及如何分析出特定的包文件结构,这就是前言里面提到的拆除门槛的方法,必须要经过多个游戏实例的练习才能够有所掌握,希望同学们能够下定决心并坚持到底。
第二节 QuickBMS的数据类型
序号
|
类型名称
|
类型描述
|
1
|
BYTE
|
8位数值,0到0xff
|
2
|
SHORT
|
16位数值,0到0xffff
|
3
|
THREEBYTE
|
24位数值,0到0xffffff
|
4
|
LONG
|
32位数值,0到0xffffffff
|
5
|
LONGLONG
|
假的64位,所以数值是0到0xffffffff,但是却读取8个字节<
|