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

  最近,我为了获取图片资源,研究了一些游戏的图片压缩格式,发现有不少游戏采用了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

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

  1. 浅谈公平组合游戏IGC

    浅谈公平组合游戏IGC IGC简介 一个游戏满足以下条件时被叫做IGC游戏 (前面三个字是自己YY的,不必在意) 竞争性:两名玩家交替行动. 公平性:游戏进程的任意时刻,可以执行的操作和操作者本人无关 ...

  2. 【博弈论】浅谈泛Nim游戏

    Nim游戏在ACM中碰到了,就拎出来写写. 一般Nim游戏:有n堆石子,每堆石子有$a_i$个,每次可以取每堆石子中$[0,a_i-1]$,问先手是否有必胜策略. 泛Nim游戏:每堆石子有$a_i$个 ...

  3. 今日文摘:浅谈 HTML5 的游戏化之路

    如今商业网站中用于广泛的HTML5无限下拉效果已经越来越受到游戏网站的喜爱.各个品牌为了打造专属自己的游戏特色,纷纷推出了模拟HTML5效果的品牌 站,且都起到了相当好的效果.可是从很多方面来说我们对 ...

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

    浅谈游戏开发之2D手游工具 来源:http://www.gameres.com/459713.html 游戏程序 平台类型: iOS Android  程序设计: 其它  编程语言:   引擎/SDK ...

  5. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  6. 【Unity游戏开发】浅谈 NGUI 中的 UIRoot、UIPanel、UICamera 组件

    简介 马三最近换到了一家新的公司撸码,新的公司 UI 部分采用的是 NGUI 插件,而之前的公司用的一直是 Unity 自带的 UGUI,因此马三利用业余时间学习了一下 NGUI 插件的使用,并把知识 ...

  7. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  8. 浅谈Android应用保护(一):Android应用逆向的基本方法

    对于未进行保护的Android应用,有很多方法和思路对其进行逆向分析和攻击.使用一些基本的方法,就可以打破对应用安全非常重要的机密性和完整性,实现获取其内部代码.数据,修改其代码逻辑和机制等操作.这篇 ...

  9. Android应用安全开发之浅谈加密算法的坑

      <Android应用安全开发之浅谈加密算法的坑> 作者:阿里移动安全@伊樵,@舟海 阿里聚安全,一站式解决应用开发安全问题     Android开发中,难免会遇到需要加解密一些数据内 ...

随机推荐

  1. Control an LM317T with a PWM signal

    http://www.edn.com/design/analog/4363990/Control-an-LM317T-with-a-PWM-signal The LM317T from Nationa ...

  2. JavaScript如何获取/计算页面元素的offset?

    问题  通过点击一控件,在控件的下面显示一个浮动层,通常的做法是:获取此控件的offset值,再计算出浮动层的top,left等css属性的值,赋值即可. 那么下面就看一下如何获取控件的offset值 ...

  3. XmlnsDefinitionAttribute Is Pretty Nifty

    When we want to declaratively use our custom controls or reference the types we defined in XAML, we ...

  4. Visual Studio 2013 新增web项目IIS Express的64位版

    使用Visual Studio 2012开发SharePoint的应该都遇到过下面的错误“SharePoint 在32位进程中不受支持”,而怎么修改目标平台都不好使,因为VS 2012所配备的IIS ...

  5. JSP如何导入ckeditor

    <textarea rows="3" cols="100" id="editor1"></textarea> < ...

  6. (转)SqlServer里DateTime转字符串

    原文:http://www.cnblogs.com/kimbosung/p/4515670.html ), )::: ), ): :::953PM ), ): ), ): ), ): ), ): :: ...

  7. 数学图形(2.23)Cylindric sine wave柱面正弦曲线

    柱面正弦曲线 #http://www.mathcurve.com/courbes3d/couronnetangentoidale/couronnetangentoidale.shtml vertice ...

  8. 多种非接触卡 ATQA 字节说明

      原文地址 13.56 MHz RFID Software An Open Source implementation of an NFC stack, and various related ut ...

  9. ActiveX 控件漏洞挖掘之方法

    ActiveX是微软公司提出,并在1996年被正式命名的组件技术.该技术提供了一种通用的开放程序接口,使用这种技术开发的ActiveX控件可以直接集成到IE浏览器或第三方应用程序中,但由于第三方编程等 ...

  10. TensorFlow进阶(六)---模型保存与恢复、自定义命令行参数

    模型保存与恢复.自定义命令行参数. 在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用.模型的保存和恢复也是通过tf.train.Saver类去实现,它主 ...