计算机术语
比特
英文名:bit。
比特是信息量最小单位。表示一个二进制数,即0或1。
字节
英文名:byte。
字节是二进制数据的单位。一个字节通常8位长,即8个比特。单位为B。因为它由8个比特组成,因此它可以表示0~255之间的数字。
1024字节将被简称为1KB,1024KB为1MB。以此类推的单位含有GB、TB。
字节集
英文名:binary,bin。
别名:字节数组,二进制数据
由多个字节组成的数据。根据信息的需要决定。例如1KB的数据就是1024个字节组成。在电脑中任何数据均可以以二进制数据的方式读取。
十六进制数据
英文名:hex。
是一种用16个符号来表示数值的数据表示方法。这16个符号包括0-9和A-F(或小写的a-f)。一个十六进制数据由两个16进制数字组成,可以表示一个字节。例如一个字节的值为255,它的二进制为1111 1111,前四位对应16进制为F,后四位也为F,所以FF可以代表255。一般使用0xFF代表这是一个16进制数。
整数
英文名:integer,int。
整数通常占用32位,32比特即4个字节。即二进制中使用32个1或者0来表示一个数字。理论上可以表达2^32个数字。但是有些表达中将最高的一位识别为符号位,用来代表数字的正负。因此有两种表示方式,一种是“带符号整数”(signed int)一种是“不带符号整数”(unsigned int)。带符号整数只能表达2^31个数,但是可以是负数。不带符号整数只能是正数。
例如:
带符号整数
-1的二进制表达为32个1。
1的二进制为1,前面补30个0,因为是正数,最高位是0,所以是31个0跟一个1。
2的二进制为10,前面补29个0,因为是正数,最高位是0。将32个数字以8个比特分割,有四个字节,每个字节用十六进制表示为:0x00 00 00 02。
大端与小端
英文名:大端:Big Endian。小端:Little Endian
在大端模式中,数据的最高有效位存储在内存的最低地址处,而数据的最低有效位存储在内存的最高地址处。这就像我们平时读数的习惯,从高位到低位。
在小端模式中,数据的最低有效位存储在内存的最低地址处,而数据的最高有效位存储在内存的最高地址处。这就像我们有时在计算器上输入数字的方式,从低位到高位。
例如整数2:
我们认为的写法0x00 00 00 02,从高到低。这是大端。小端写法为0x02 00 00 00。注意的是我们一般书写方式是大端的,而电脑一般(默认)书写方式和读入方式是小端的。
大端与小端的转换:
例如0x12 34 56 78(小端)。转换之后为:0x78 56 34 12(大端)。两者是等价的。
注意是78563412,而不是87654321。
INT32LE
中文解释:此名词根据它的名字拆解成几个部分:INT 32 LE。INT整数。32位:四个字节。LE小端。
根据这个解释我们可以判断,这是一个整数,它占用4个字节,并且是以小端的形式记录的。这里似乎没有写是否包含符号,默认是包含,即这个数字可以有正负区分。
例如数字2:0x02 00 00 00
UINT16LE
中文解释:此名词根据它的名字拆解成几个部分:U INT 16 LE。U:不带符号的INT整数。16位:2个字节。LE小端。
例如数字2:0x02 00
UINT32LE
请根据上方两个词条,分析此类型。
标识位
英文名:flag
标识位是通过比特(bit)来表示的一种开关机制。每个比特可以是0或1,通常我们用一个字节(8个比特)来表示多个功能的开关状态。1代表功能开启,0代表功能关闭。我们把“开启某个功能”称为“立flag”。
举个例子,如果有一个字节:
- `00 00 00 00`,其中第7个比特是0,表示没有开启“加密”功能。
- `00 00 00 10`,这个字节的二进制表示是`00000010`,第7个比特变成了1,表示已经开启了“加密”功能,也就是“立了加密的flag”。这个字节转换成十进制就是2。
- `11 00 00 10`,这个字节的二进制表示是`11000010`,第7个比特是1,表示“加密”功能开启了,这个字节转换成十进制是194。
- `00 00 01 00`,这个字节的二进制表示是`00000100`,第7个比特是0,表示“加密”功能没有开启,这个字节转换成十进制是4。
虽然4比2大,但对于“加密”功能的标识位来说,它并没有开启,因此没有立flag。
总的来说,标识位就是用来表示各种功能是否开启的一种机制,相当于功能的“开关”。
校验和
英文名:checksum
别名:校验值 哈希值 hash
校验和主要用于校验一组数据项的和,以确保数据的完整性和准确性。具体来说,它通常是以十六进制为数制表示的形式,表示的是一组二进制序列的累加和。
校验和有多种算法,但是它们都有一个特点,对于同一种算法,不管多大的数据,结果永远是一样的长度。
同样的字节集数据校验和永远一样。
一般情况下不同的字节集数据(哪怕1GB只有一个字节不一样)检验和也不一样。极少的情况下,两个数据不同,但是它们的校验和相同,几乎不可能。即使发生特殊情况,换一种算法,它们的值也是不同的。
校验和可以快速验证两个数据是否一样。
数据可以通过校验算法转成检验和,但是校验和不能还原成原数据。
Base64
一种编码算法。可以将字节集数据转成文本形式。
注意文本也是一种字节集数据数据。因此文本也能被编码成base64编码数据。
例如:"apple"的base64为"YXBwbGU="
虽然"YXBwbGU="无法被人类阅读,但是它就是代表apple,因此Base64不能算加密,只能算编码。
二进制数据编码成base64,之后必然是文本格式的。因此一些二进制数据可以通过base64编码之后,以英文字母和特殊符号的形式书写出来保留在文本中。
例如:红警的地图文件是ini格式的,是文本的。但是地图文件可以包含一张地图缩略图的图片。图片是二进制的,因此红警的地图缩略图显示通过LZO压缩,之后通过Base64编码,变成了文本的形式,保存在ini中。
Blowfish
Blowfish是一种加密算法。需要设置一个密钥。一段字节集经过密钥由Blowfish算法加密成同等长度的加密字节集。同理此加密字节集可以用同样的密钥转换成原来的字节集。
如果没有密钥,加密的数据是无法复原的。因此这种数据+密钥=密文的编码方式可以称为加密算法。
因为加密和解密都是用同样的密钥,因此这种加密称为对称加密。
Blowfish只能加密特定长度的字节集,如果文件长度不是指定的加密长度,则可以将文件切片来分段加密。
RSA
RSA是一种加密算法。需要设置两个密钥。将其中一个密钥用来对字节集进行加密。加密后的密文需要用另外一个密钥进行解密。
因此可以将其中一个密钥透露给对方,这种被对方知道的密钥称为公钥,自己保留的则是私钥。可以将明文使用公钥加密成密文。而自己用私钥进行解密。
这种加密被称为不对称加密。
考虑以下问题:校验、编码和加密的区别是什么?
结构体
英文名:structure
结构体是许多编程语言(例如:C++语言)中用于封装一组不同类型的数据项的数据结构。这些数据项可以是基本数据类型或其他数据类型。通常在内存中是连续的。
例如:定义一种结构体:坐标。坐标由横坐标和纵坐标组成。我们假设横坐标和纵坐标都是基础类型整数型组成的。例如坐标是(2,1),那么写入数据应该是0x02 00 00 00 01 00 00 00。
彩虹表
英文名:Rainbow Table
彩虹表是一种用于快速破解密码的工具。它通过预先计算大量的密码及其对应的【校验】值来节省破解密码时的计算时间。
【校验】函数是将密码转换成固定长度的字符串,例如密码`12345`可能被【校验】成`827ccb0eea8a706c4c34a16891f84e7b`。因为【校验】过程是单向的(无法直接从【校验】值还原密码),破解密码通常需要猜测密码并计算【校验】值,然后进行对比。
彩虹表的核心思想是将“猜测和计算”这一步提前完成,并将结果存储在一个表中。表中包含了大量常见密码及其【校验】值的对应关系。例如:
- 密码`12345` → 【校验】值`827ccb0eea8a706c4c34a16891f84e7b`
- 密码`password` → 【校验】值`5f4dcc3b5aa765d61d8327deb882cf99`
- 密码`qwerty` → 【校验】值`d8578edf8458ce06fbc5bb76a58c5ca4`
当攻击者获得一个【校验】值时,只需查找彩虹表,找到对应的密码,而无需重新计算【校验】值。
然而,彩虹表有一个局限性:如果密码很长或加入了“盐”(salt,额外的随机数据),彩虹表的计算和存储成本会显著增加,从而变得不实用。
总的来说,彩虹表是一种通过时间换取空间的密码破解方法,是学习密码学时的重要概念。
CC-BY-SA许可
CC-BY-SA是Creative Commons组织提供的一种知识共享协议。具体来说,CC BY-SA协议允许再使用者以任何媒介或格式分发、混音、改编和构建材料,只要注明出处并遵循以下两个主要条件:
BY:必须注明原始作品的创作者,即“署名原作者与来源”。
SA:改编作品必须在相同的条款下共享,即“要求同协议共享”。这意味着,如果再使用者对原始作品进行了重新混合、改编或基于原始材料进行构建,那么这些改编作品也必须使用与原始作品相同的CC BY-SA协议进行共享。
目前在【火星鼠汉化组】官网提供的资料均使用此许可。
具体的说,如果要转发火汉网站提供的资料,需要标注这些资料的来源。我们不希望再看到有人将这些资料发到网上之后再标一个原创,甚至发到收费的博客里去。
MIX文件名词
在某些资料中,不同的作者称呼这些名词为其他的名字,这里尽量将别名罗列在一起。且在火汉的资料中统一他们的命名。
标头
英文名:header,mix_header
标头中包含了,标识位、Blowfish密钥密文(加密才有)、内部文件数、内部文件大小。
如果不包含加密字段,一个标头应该是10字节。
文件ID
英文名:File ID
一种使用变种的CRC32算法计算的校验和。由16进制的数字组成。一共4个字节。
红警的文件ID是将文件名,带后缀,并且大小写不敏感,用CRC32算法得到的,然而这是一种单向的变换(你可以理解为这种变换是有损耗的),因此我们无法根据ID反算得到文件名。这里你可以输入字符串(文件名)来获得一个ID,进行手动验证。
初学者可以单纯理解为文件名和文件ID是一一对应的。
例如:rulesmd.ini即8218F9F4,8218F9F4即rulesmd.ini。前者很容易使用工具计算出后者。而后者很难从人类角度理解,但如果知道对应关系则可以直接转换。
在红色警戒游戏中,不会读取文件名,而是计算出文件的【文件ID】来读取数据。文件名对游戏来说是没有意义的。但是玩家可能要通过文件名才能识别一个文件。
文件偏移量
英文名:offset
一个INT32LE,它代表文件的第N个字节开始读取数据。配合读取的长度,就可以从文件中取出任意数据。
例如有如下表达式:
mid(a,b,c)
它代表,从a这个数据中,从第b位开始,取出c长度的数据。
例如:"1234567890",那么mid("1234567890",2,3)的结果就是:234。从第二个字开始取出了三个字。
其中b的概念就是【文件偏移量】。
Mix的文件偏移量不是相对文件本身的,而是相当对索引表尾部之后的。也就是说如果要从mix文件头部去计算文件的偏移量:那么应该是10+12*n+文件偏移量(未加密)。
Sizeof(mix_header) + Sizeof(mix_index) * fileCount + offset
MIX索引
英文名:mix_index
一个MIX索引有一个【文件ID】、【文件偏移量】、【文件大小】组成。有了MIX索引,程序就可以在海量的数据中,定位到一个文件的位置。并且根据它的大小,将它的数据复制一份,形成一个文件。也就是从MIX里提取了一个文件。一个【MIX索引】只能表达一个文件的信息。
并不是所有的【MIX索引】都完整的表达了一个文件的信息。一个文件必须要包含完整的结构,而MIX索引只能表达mix中的一个片段的数据。虽然一般每个片段都是一个文件,但是并不代表一定是这样。
如果根据一个MIX索引取出的数据不能组成一个文件,那么这个数据被称为【脏数据】(dirty data)。对游戏来说脏数据没有任何意义。
根据它的成员,一个【MIX索引】是12字节。
MIX索引表
英文名:mix_index_table
一个MIX索引能表示一个文件,而每个文件都应该对应的有一个MIX索引。一个索引表应该的大小应该是:
索引表大小 = Sizeof(mix_index) * fileCount = 12 x 内部文件数
实际文件大小
Mix文件在Windows中显示的大小。可以通过右键Mix文件,属性中查看。在文件属性中,实际文件大小对应的是【大小】的值。而不是【占用空间】的值。
内部文件大小
内部文件大小是mix标头中的一个值。通常用于标记除了mix自身的数据(标头与索引表)之外,所有mix内部的文件合在一起的大小。
按常理来说:
标头大小 + 索引表大小 + 内部文件大小 = 实际文件大小
但是实际上游戏不会读取这个值,因此此值对红色警戒来说是无意义的。
文件名数据库
英文名:local mix database.dat。别名:LMD。
由于Mix文件本身不包含文件名,XCC Mixer为了能够在打开mix之后能够让玩家看到文件名,因此创建了一个由xcc mixer自身读取的文件。里面包含了所有这个mix里的文件名。
XCC Mixer的工作流程应该是在打开mix之后寻找文件名数据库,然后将数据库中的文件名的id计算出来。然后再组建的将mix里的file id文件对应文件名。
并没有指定一定要有对应的文件名才能正常运作,所以没有文件名数据库,或者数据库中没有对应的文件名,那么此文件会以Id的形式显示。这不会影响游戏运作和XCC Mixer的读取。在有些加密手段会破坏这个文件的数据。以至于XCC Mixer无法正常读取正确的文件名。
根据工作原理来说,文件名数据库是一张【彩虹表】。
全局数据库
英文名:global mix database.dat
与【文件名数据库】同理,官方的MIX中没有文件名数据库,因为文件名数据库是为XCC Mixer准备的。所以XCC作者为所有TS\RA使用MIX文件的游戏的所有MIX文件名制作了一个全局数据库。与文件名数据库不一样的是,这个数据库中还有对文件的作用进行注释。也就是说XCC Mixer默认可以识别所有官方的文件名。
MIX助手专有名词
混淆
英文名:scrambling
MIX标头中存在【内部文件大小】数据,红警游戏本身不会检查这个值,而XCC Mixer会检查MIX数据的完整性。
如果【内部文件大小】不正确,XCC Mixer会将MIX识别为unknown,即使数据是可读的。
利用这种特性,将随机的数据覆盖MIX文件的数据,以达到Mix不能被打开的目的,被称为【混淆】。
除了【内部文件大小】,【文件名数据库】的MIX索引也能进行混淆。
【混淆】通常只是简单的加锁方式,它的原数据通常可以通过逆运算来计算出来。
如果没有上下文,仅有【混淆】指的是对内部文件大小进行混淆。
篡改
英文名:mangling
对指定的数据,用置零或置随机值的方式覆盖数据或删除数据。以达到原数据不能被读取的目的。
MIX中有些数据并没有被游戏所应用。将这些篡改数据将不会对游戏造成影响,但会对XCC Mixer的读取造成影响。
与【混淆】不同的是【篡改】通常是不可逆的。即使是MIX的创建者也不能恢复被【篡改】的数据。
【文件名数据库】的MIX索引可以被篡改。【文件名数据库】本身也能被篡改。玩家可以通过篡改它们来保护自己的数据信息。
但是修改【内部文件大小】不能算【篡改】,因为它可以通过逆运算来计算所以它只能算【混淆】。
解锁
英文名:unlock
【解锁】通过对【内部文件大小】进行逆运算,通过修复MIX标头,用于将那些XCC mixer识别为unknown的mix重新恢复为mix,以便XCC Mixer能够读取其中的数据。
这种解锁的mix中可能是没有【文件名数据库】的,可能是因为数据库被删除或被置入了脏数据。如果文件名数据库不能被XCC Mixer正常读取,MIX的文件名只能显示为【文件ID】。
使用这种方法的前提条件:
MIX必须符合MIX文件格式。
MIX不能是加密类型的。
解锁与【混淆】互为逆操作。
萃取
英文名:extract
无视MIX的加密状态。不更改mix文件的任何内容,获取mix索引表,并根据索引表直接提取mix中的文件。需要提前创建文件夹来保存这些文件,因为索引表中不包含文件名,这些文件的文件名以它们的文件ID来命名。
【萃取】可能取到脏数据。
如果要获取真的文件名,请在后续步骤恢复。
萃取是MIX恢复助手最佳实践的第一步。
探底
英文名:dredge
无视MIX的数据结构。以其他二进制数据文件数据结构特征对文件进行搜索。并生成【探底索引表】。
探底不会对文件进行验证,会产生不正确的【脏数据】。探底的结果不包含文件ID,不能进行【恢复】。这些文件的文件名以它们的后缀名来命名。
不能保证所有数据能被探底。
探底能恢复一些被删除的MIX数据。但对【恢复】功能来说是无用的。探底的主要作用是生成【探底索引表】。
使用这种方法的前提条件:
数据文件必须是二进制格式的,不能是文本格式。
例如:INI、MAP文件是文本格式的。
例如:SHP、PAL文件没有数据结构特征。
认领空间
英文名:dredge_index。别名:探底索引。
认领空间的空间结构与MIX索引,由【文件代号】、【文件偏移量】、【文件大小】组成。
不同的是【文件偏移量】是相对于文件头,而不是相对于MIX索引表。
【探底】会修改探底索引表,且会忽略认领空间中的内容。
例如:a.mix中有b.mix,b.mix中有c.bmp。探底只能找到b.mix,而不能找到c.bmp。因为它在b.mix的认领空间里。
探底索引表
英文名:dredge_index_table。
由认领空间组成的索引表。
爆破
英文名:crack。
【爆破】使用【探底】来对【文件名数据库】的【MIX索引】进行逆运算。试图恢复被【混淆】的MIX索引表。这个方法可能会造成mix被破坏,所以使用前要先备份mix文件。
使用这种方法的前提条件:
备份MIX(可选)
MIX中存在文件名数据库。
文件名加密
英文名:encrypt_filename
对文件名数据库进行【篡改】或对文件名数据库索引进行【混淆】或【篡改】。
加密文件名之后,依旧可以在XCC Mixer打开Mix文件。
如果在没有上下文的情况下说文件名加密,指的是对文件名数据库索引进行混淆。
遍历
英文名:transversal
跟据INI文件的命名规则,列举出所有可能的文件名。
萃取是MIX恢复助手最佳实践的第二步。
文件名列表
英文名:filelist, CSV。
csv文件是一种逗号分隔文本文件,即用逗号和换行符来切割文本。文本类似于表格。csv文件可以被excel,记事本读取。在本软件中,使用这种格式作为文件名和文件ID对应关系的数据库的格式。相当于MIX恢复助手版【文件名数据库】。
理论上,8^16(281兆+)个记录可以包含所有的文件名。但实际上作不到。
文件名列表是一种【彩虹表】。
恢复列表
英文名:restorelist。
文件名列表导入到程序之后的表格。用于恢复文件名。恢复列表会对CSV中的数据进行排列去重。
恢复
英文名:restore
跟据【遍历】出的结果,计算所有的文件名的ID。生成【恢复列表】。通过文件名列表中文件名与文件的对应关系,将萃取的文件ID重命名为文件名。
萃取是MIX恢复助手最佳实践的第三步。
遍历、恢复与【篡改】互为逆操作。
另存为
英文名:saveas
以MIX索引表为基础,重新生成一个MIX文件。另存为有效的去除脏数据、混淆、删除残留数据。减小了MIX的占用空间。
特殊情况下是修复MIX的一个方法。
注入
英文名:inject
将一个文件写入MIX文件。同时修改文件数据与MIX索引表。即在MIX文件中添加一个文件。
注释
本文采用CC-BY-SA 4.0许可协议(署名-相同方式共享)发布。这意味着您可以自由地分享和修改本文,但是您必须标明作者为火星鼠汉化组,且标明引用出处(此网页),并且在任何修改或派生作品中使用相同的许可协议共享。
返回上一页


