浅谈LZSS与游戏图片破解

 
  业余游戏制作者最头疼的就是没有美工的支持了。很多业余游戏制作所使用的图片都是来自于网上的很有限的一些图片资源,然而这些图片并不能完整配套,所以业余游戏的画面往往显得单调或者搭配不协调(使用多个不属于一系列的图片资源)。基于此,也有不少业余游戏采用“窃取”商业游戏图片于己用的方式(反正业余游戏一般都不用于商业目的),这种方法使用的就是一系列完整、配套的图片,画面就会显得专业、协调得多,但是,前提是能够破解商业游戏的图片格式。多数商业游戏并不会将图片资源以可以直接打开的常用格式存放,而是会做一定的压缩处理,这样做有两个好处:其一,图片不易被用户直接修改或用于其他用途;其二,减小游戏图片资源所占用的磁盘空间。

  最近,我为了获取图片资源,研究了一些游戏的图片压缩格式,发现有不少游戏采用了LZSS压缩,例如《天使音乐会》、《神奇传说系列》(只针对《时空道标》和《远征奥德赛》两作,因为没有其他的在手边)。于是,我在网上查阅了一些关于LZSS压缩的资料,实现了这些游戏的图片资源破解。

  LZSS压缩是LZ77压缩的改进方式,相对于LZ77减少了冗余度。LZSS在压缩比率上相对其它压缩并没有太大优势,然而它的压缩/解压缩速度却非常快,因此往往用在速度优先的场合(当然,游戏图片解压缩就是速度优先的)。基于这个优势,LZSS被大量采用,例如微软以前常使用的compress.exe/expand.exe就是采用LZSS实现的(这里顺便提一下,《神奇传说时空道标》的图片压缩完全就是用compress.exe的方式压缩的,连文件头都完整存在,因此可以直接用expand.exe来解压缩,就不用自己忙活了^_^)。

  在文章的末尾我给出了一个用LZSS压缩/解压缩的源程序,是Haruhiko
Okumura在1989年所写,后来被广泛使用。但是由于其源代码相当晦涩,所以我在这里先把LZSS压缩的原理大致介绍一下:

  LZSS采用了一个大小为N的滑动窗口用于在文件中滑动,其中后F大小作为一个前向缓冲,在窗口中前N-F字节内容是已处理部分,而后F字节也就是前向缓冲是待处理部分。如下图示:

  压缩过程就是用前向缓冲中的F字节长的串和前面的N-F个长F的串作比较,例如当F如上图为10的时候,将前向缓冲的qrstabcdfk串分别和前面的zqrstabcdf、yzqrstabcd、xyzqrstabc、wxyzqrstab……总共N-10个串进行比较,寻找最长匹配。在上例中,qrstabcdfk的最长匹配出现在qrstuvwxyz时(即箭头所指位置N-F-10),匹配长度为4即qrst。然后记录下二元组〈匹配位置,匹配长度〉(在上例中是〈N-20,
4〉),放入到输出缓冲区;如果匹配长度少于等于2个字节(例如上例中匹配f时,匹配长度为1),这时用上述二元组记录,反而会造成浪费,因此,直接把原字符放入输出缓冲区。当放入输出缓冲区以后,应该将滑动窗口向后滑动,后F字节中处理过了的字节滑入N-F字节区中,同时从文件中补充相应字节数至后F字节,重复上述处理,直至文件结束。解压缩的过程与此类似,在此不再赘述。

上面只是一个大概的LZSS实现原理,下面我针对所附的源代码中的部分问题做一个解释:

1.
大家知道,作字符串比较是比较耗时的,为了提高效率,程序中使用了256棵查找二叉树,每一棵表示一个字节值开头的串,以快速查找到所需要比较的串的所在地。

2.
程序中将滑动窗口做成了一个环状缓冲,以免造成滑动的不便。

3.
程序的输出格式如下:用一位表示一个单元的类型,该位为1表示字符未经处理直接输出(一个字节)、为0表示经过了处理,输出上面所说的〈匹配位置,匹配长度〉二元组(两个字节),把这样的8位合在一起(一个字节)表示后面输出的八组元素的类型,其后就是经过处理或未经处理的八组数据,每组一或二个字节,当八组数据满时,将输出缓冲区中的数据输出到文件。二元组的两个字节是这样安排的:第一个字节表示匹配位置的低八位,第二个字节的高四位表示匹配位置的高四位,第二个字节的第四位表示匹配长度(程序中定义N为4096,因此位置值占用12位,F值定义为18,除去匹配长度为1和2的两种情况,共16种情况占4位)。

4.
微软的compress.exe/expand.exe采用的是N=4096、F=16的定义,因此这个程序只要修改F值就可以解压缩compress.exe压缩的文件(事先需去除文件头)。

  有了这个程序,我们就可以解压不少游戏的图片或其他资源,用于自己的业余游戏开发。如何判断一个文件是否采用LZSS压缩呢?其实很简单,上面我们也说到,在匹配长度小于等于2的时候,LZSS是原样输出的,以BMP文件为例,其文件头前几个字节ASCII为“BM6>[1]”由于BM6等几个字符匹配长度为1,因此在压缩的文件中也肯定是明文出现的,如果其后有类似F3
F0的字节值,就和上面介绍的二元组格式一致了,那么多半就是LZSS压缩的了。

源程序:LZSS.C

时间: 2024-08-25 06:36:21

浅谈LZSS与游戏图片破解的相关文章

unity3D游戏开发之浅谈如何提高游戏生命力

游戏中某些时候,玩家会处于"空闲"状态,即处于无事可干的状态.那么为什么会造成这种情况呢?又如何避免让玩家处于"空闲状态"呢?我试着分析下,可能有以下几个原因: 1.节奏控制不合理 节奏的控制不合理.让玩家在游戏某一阶段"紧张"时间过长,或者松弛太久都是不好的.松紧张弛有度,才能造成玩家不至于太空闲. 例如玩家在野外打怪,或者下FB,这个过程就是"紧"的过程.当玩家背包满了,这个时候肯定要回城清包.交任务.存放东西.去拍卖行.

【转载】浅谈游戏开发之2D手游工具

浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK: 其它  全球手游行业规模将突破250亿美元,越来越多的开发者开始进入手游研发领域,而作为一名菜鸟,很多时候,如果没有其他开发者的建议,会走很多弯.独立工作室Sheado.net公司的Chad Ata在博客中分享了他们从一开始进入手游研发到如今四年多以来积累的经验,希望可以给新入行者提供一些帮助.

浅谈图片服务器的架构演进

浅谈图片服务器的架构演进 现在几乎任何一个网站.Web App以及移动APP等应用都需要有图片展示的功能,对于图片功能从下至上都是很重要的.必须要具有前瞻性的规划好图片服务器,图片的上传和下载速度至关重要,当然这并不是说一上来就搞很NB的架构,至少具备一定扩展性和稳定性.虽然各种架构设计都有,在这里我只是谈谈我的一些个人想法. 对于图片服务器来说IO无疑是消耗资源最为严重的,对于web应用来说需要将图片服务器做一定的分离,否则很可能因为图片服务器的IO负载导致应用 崩溃.因此尤其对于大型网站和应

浅谈游戏开发中碰撞检测

原创整理不易,转载请注明出处:使用Memcached.Spring AOP构建数据库前端缓存框架 代码下载地址:http://www.zuidaima.com/share/1781569917635584.htm 数 据库访问可能是很多网站的瓶颈.动不动就连接池耗尽.内存溢出等.前面已经讲到如果我们的网站是一个分布式的大型站点,那么使用memcached实现数 据库的前端缓存是个很不错的选择:但如果网站本身足够小只有一个服务器,甚至是vps的那种,不推荐使用memcached,使用Hiberna

浅谈DevExpress<三>:在GridView中加载动态图片

今天的演示效果如下:在GridView中的下拉框中选中一种颜色,则后面的加载相应的图片,如下图: 1. 2. 3. 下面说下实现方法:首先在项目中拉一个GirdControl,在里面创建4列:ID,Name,Color,Image,并将Color和Image分别创建repositoryItemComboBox和repositoryItemPictureEdit控件,如下图: 将一个图片文件夹放到程序的启动目录中: 文件夹中包含如下图片: 接下来进行创建数据模板,先创建一个Datetable,添加

【浅谈社工】U盘游戏(上)

凡人是没有资格讨论社会工程学的,2333333333,接下来的浅谈也不过是为了研究下setoolkit平台的使用罢了,这个社工利用平台由parrot预装,其中大量模块调用msf平台,什么?又是msf??? 今天我们的标题是初识U盘游戏,因为笔者选购的装备还没到货,但先来一起探索一下U盘游戏在社会工程学中是如何运用的,更多花样敬请期待. 首先我们来看一下今天需要用到的工具——setoolkit. 需要root权限启动,不然会报错权限不足. 在每次启动的时候,/root/.set目录会自动清空并初始

浅谈android中图片处理之图形变换特效Matrix(四)

今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的.改变它的颜色主要通过ColorMatrix类来实现. 现在今天所讲的图片变形的特效主要就是通过Matrix类来实现,我们通过上篇博客知道,改变色彩特效,主要是通过ColorMatrxi矩阵的系数,以及每个像素点上所对应的颜色偏移量.而今天的图形变换与那个也是非常的类似.它是一个3*3矩阵,而颜色矩阵则是一个4*5的矩阵.在这个3*3矩阵中则表述出了每个像素点的XY坐标信息.然后通过修

浅谈:APP有哪些常被黑客利用的安全漏洞

首先,说到APP的安全漏洞,身为程序猿的大家应该不陌生:如果抛开安卓自身开源的问题的话,其主要产生的原因就是开发过程中疏忽或者代码不严谨引起的.但这些责任也不能怪在程序猿头上,有时会因为BOSS时间催得紧等很多可观原因.所以本文会对 Android 系统的开源设计以及生态环境做一些浅谈. 1. 应用反编译漏洞:APK 包非常容易被反编译成可读文件,稍加修改就能重新打包成新的 APK.利用:软件破解,内购破解,软件逻辑修改,插入恶意代码,替换广告商 ID.建议:使用 ProGuard 等工具混淆代

浅谈流形学习(转)

http://blog.pluskid.org/?p=533 总觉得即使是“浅谈”两个字,还是让这个标题有些过大了,更何况我自己也才刚刚接触这么一个领域.不过懒得想其他标题了,想起来要扯一下这个话题,也是因为和朋友聊起我自己最近在做的方向.Manifold Learning 或者仅仅 Manifold 本身通常就听起来颇有些深奥的感觉,不过如果并不是想要进行严格的理论推导的话,也可以从许多直观的例子得到一些感性的认识,正好我也就借这个机会来简单地谈一下这个话题吧,或者说至少是我到目前为止对这它的