7.4 LZO编码的识别
近年来很多游戏开始使用LZO压缩资源文件。LZO是一种高压缩比和解压速度极快的编码。LZO有多个版本,从总体上可以分为免费版和专业版。专业版除了包含免费版所有功能外,还包含了官方最新的压缩技术,一般目前所见的游戏中大多使用LZO免费版,少数游戏使用专业版的LZO,毕竟专业版的LZO要收取一定的使用费。
7.4.1 LZO和MiniLZO编码介绍
LZO是使用ANSI C编写的一套压缩/解压缩库,对于游戏开发人员来说LZO有以下优点。
(1)解压缩速度非常快。
(2)不需要额外的内存解压缩。
(3)能设置不同的压缩参数改变压缩率,但设置这些压缩参数不会降低解压速度。
(4)LZO是无损压缩,压缩后的数据能准确还原。
(5)LZO的发布是遵从GNU General Public License(GPL)的。
游戏资源的压缩率和解压速度往往是游戏编程人员所关注的,一般对资源文件压缩率越高,解压速度就越慢,而LZO很好地解决了压缩率和解压速度之间的矛盾问题,所以LZO非常适合压缩游戏的资源文件。
LZO有以下不同的版本,这些不同LZO版本的压缩率和压缩/解压缩速度也不尽相同:
LZO1;
LZO1A;
LZO1B;
LZO1C;
LZO1F;
LZO1X;
LZO1Y;
LZO1Z;
LZO2A。
LZO有多个版本,每个版本的LZO支持1~999的压缩等级,通常1~9通常是标准快速压缩,压缩时只需使用64KB内存。10~99通常是更高压缩率的压缩等级,压缩时只需使用256KB内存,这个等级的压缩速度还算比较快。100~999通常是接近最优压缩率的压缩等级,但此时压缩速度很慢,而且需要很多内存。
由于LZO有多个版本,而且支持1~999级压缩,每一级别的压缩率生成的压缩文件数据都不同。如果一些游戏使用了LZO压缩资源文件,那么即使破解者能通过LZO解压程序解压游戏资源,但要想将游戏资源重新压缩回游戏主程序并能正确读取是非常困难的,因为破解者不知道游戏开发人员使用了哪个版本的LZO,即使知道使用了哪个版本的LZO也不知道使用了哪种级别的压缩等级。
目前只能使用穷举法尝试将从游戏中解压出来的资源文件使用不同版本的LZO设置不同的压缩等级压缩,然后重新进入游戏看是否能正确读取资源文件来判断游戏开发人员使用了哪个版本和使用了哪种压缩级别的LZO压缩资源文件。
最后要提一下的是MiniLZO编码,不少游戏除了使用上面介绍的LZO压缩资源文件外还使用MiniLZO。
MiniLZO是一个轻量级的压缩/解压缩库,设计MiniLZO的目的是为了某些只需包含一个小型的压缩/解压缩功能,而不想包含LZO全部代码的程序而设计的。编译后的MiniLZO库少于5KB,非常适合内嵌在主程序中。
MiniLZO使用LZO1X-1的压缩和解压缩,也就是说使用LZO1X-1的代码同样可以解压缩使用MiniLZO压缩的资源文件。
7.4.2 如何识别LZO编码
从数据和程序上都有识别LZO的方法,但由于LZO有多个版本,不同的版本压缩后的数据特征不尽相同,在某些极端的情况下没有可识别的数据特征。
下面给出3组使用LZO压缩的数据,观察这3组数据之间有什么规律:
第一组LZO压缩的数据
第二组LZO压缩的数据
第三组LZO压缩的数据
上面已经将可识别的数据和3组LZO压缩文件数据之间相同的部分用不同的背景颜色和其他杂乱的不可识别的数据区别开来。
经过分析可以从上面的3组数据中归纳出如下3点特征。
(1)开头部分的数据好像都是文明数据。
(2)越往后的数据看上去越凌乱甚至不可识别。
(3)每组数据的结尾都是0x11、0x00和0x00。
识别数据是否使用了LZO可以对照上面3点特征来分析。接下来讲解如何从程序中识别LZO。
从程序上识别LZO的方法是搜索主程序包含的字符串信息,下面列出了LZO在程序中保留的版权和出错信息:
"LZO real-time data compression library.","Copyright (C) 1996, 1997, 1998 Markus Franz Xaver Johannes Oberhumer",LF,"<markus.oberhumer@jk.uni-linz.ac.at>", "http://wildsau.idv.uni-linz.ac.at/mfx/lzo.html","LZO version:" "LZO data compression library.$Copyright: LZO (C) 1996, 1997, 1998, "lzo error" |