找回密码
 点一下
查看: 2966|回复: 0

MPQ文件结构与加密的一些问题

[复制链接]
发表于 2010-12-20 19:56:56 | 显示全部楼层 |阅读模式
   "反MPQ类"

前面说过使用Wc3MapOptimizer等工具只能说是优化而非加密,原因之一是他们主要是做使地图变小,读取变快的优化,另一方面就是对于这类反WE的地图,修改者最常用的手段是使用MPQ工具进行内部文件的修改,对于这类修改,很长时间内可以说是无敌的解密方法, 因此真正可以说得上是加密的就是反MPQ类.

1.MPQ头文件修改

这种修改方式由来已久,直到不久前hackwaly的新加密方法出现之后才真正流行起来要讲其原理,需要先了解一下mpq头文件的结构

struct TMPQHeader          文件头结构定义
{
DWORD dwMpqFlag;          头文件标志,一般是'MPQ'        
DWORD dwHeaderSize;       头文件大小   
DWORD dwArchiveSize;       MPQ包大小
USHORT wFormatVersion;    版本(这个直到WOW燃烧远征才开始有用,MPQ2这个值是1,魔兽的MPQ1是0)
USHORT wBlockSize;           块大小,熟悉的人一般叫它BUFFER SIZE
DWORD dwHashTablePos;        哈希表偏移位置
DWORD dwBlockTablePos;    块表偏移位置
DWORD dwHashTableSize;    哈希表大小
DWORD dwBlockTableSize;    块表大小
};

具体的含义在MPQ讲解中我还会介绍,这里只说和加密相关的.

1.同样的这种加密也是随着相关MPQ工具而发展的,最早是soar(GA的c-a)的mpqworkshop,这个工具有一个弱点是其寻找MPQ时需要检验头文件大小(dwHeaderSize)这个值,而由于MPQ1的这个值显然是固定的32,所以当人为的修改这个数为一个随机数时,该工具就会认为这是个无效的MPQ文件,造成无法打开,当然明白了原理后这是很容易破解的,而且现在的MPQ工具都忽略这个错误.不过这个修改这个值几乎成了习惯,虽然没有作用也还一直沿用着.

2.之后出现了w3mmaster和mpqmaster,依然是soar的作品,使用自己制作的mpqlib,可以忽略 dwHeaderSize的错误(同时sfmpq也一样).很长时间内MPQ头的加密没有新的发展,直到今年初,hackwaly公布了他的研究成果,新的killmpqmaster加密,实质上是修改块表大小为大于哈希表大小的数.这里简单讲一下原理:

最通俗的语言来说,MPQ就可以看成一本书,但他有两个目录,哈希表是第一个,当你要找书中的一页时需要先查哈希表,得到块表这个目录的位置,再从块表中查找到具体的页数,而MPQ这本书还有一个特殊之处是哈希表这个目录的大小是固定的,也就是说书里面最多能放的页数也是固定的(这就是MPQ中文件数有上限的原因),而如果我们的内容不能装满整个书的话,那么哈希表的一部分就是空的.而块表不同,他只存放有效的页,因此他的大小是不固定的,哈希表与块表是一一对应的,因此块表不可能比哈希表大.

再讲一下MPQMASTER的文件查找原理,大家就会明白为什么修改块表大小会造成这类工具不能读取地图的原因了. MPQMASTER准确说是mpqlib.dll是需要枚举MPQ包中的每一个文件的,而魔兽则只需要查找其需要的文件,也就是说,魔兽在翻书时直接查找目录找文件,而不必去管目录到底有多大,什么时候目录会结束.而MPQMASTER则需要知道这个,他要先知道目录的大小才能得知什么时候已经找到了所有文件,mpqlib是根据块表来查找的,因此如果修改了块表大小,就相当于让他去不存在的目录查找文件,这当然是错误的.

3.修改MPQ包大小(dwArchiveSize)为0,这是我个人最先发明的,原理实际上也和修改块表大小差不多, 但实际上还是由于mpqlib的严谨性,mpqlib在读取MPQ文件结构时会验证一些数据的准确性,虽然不一定有用,但是正是这项检查造成修改MPQ包大小后,mpqlib将地图识别为错误MPQ.

4.修改哈希表大小(dwHashTableSize),这种加密也和我有一定关系,不过没有流行起来,而且事实证明也并不是一种安全的加密

在killmpqmaster加密(工具为hackwaly的w3xmaster)流行后,mpqmaster的使用受到限制,当然也出现了不少手动破解方法,不过相对而言最好用的是winmpq和我的ShadowEditor,sfmpq是因为其在查表时是检查哈希表而不受块表错误的影响,同时也不检查MPQ包大小,因而可以正常打开w3xmaster加密的地图,不过从w3xmaster0.006开始采用了修改哈希表的技术而造成其显示错误文件而不那么好用了.同时期我就结合了sfmpq的优点做了ShadowEditor,自动修复所有的头文件错误,修复后可以用 mpqmaster打开.作为反ShadowEditor还原的第一例,就是55YOU的简单做的修改哈希表大小加密,理论上说哈希表大小会直接影响查表的过程,因而不能修改,但确实在一些特例中成功了,但并不是所有图都可以,再加上我第一时间修改了还原程序,这个加密貌似就只出现了那么片刻的时间- -...
这个是用UE打开暴雪自带的地图,
那么上面显示的MPQ包大小,版本,块大小,哈希表偏移位置,块表偏移位置,哈希表大小,块大小分别是多少呢??哪位好心人解答一下
用16进制回答吧,谢谢了,研究明白了可以自己加密一下地图哈
未命名.jpg

(2)BootyBay.w3m

123 KB, 下载次数: 78

评分

参与人数 1印象 +1 收起 理由
刀锋战士 + 1

查看全部评分

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-24 23:07 , Processed in 0.106811 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表