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

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

转载于:https://www.cnblogs.com/huhu0013/p/4056406.html

浅谈LZSS与游戏图片破解相关推荐

  1. 浅谈即时战略游戏在 J2ME 上的实现

     浅谈即时战略游戏在 J2ME 上的实现 <星际>.<魔兽>.<文明>......这些都是PC游戏玩家们耳熟能详的名字,可以说以这些游戏为代表的战略游戏是PC游戏的 ...

  2. 浅谈性能优化之图片压缩、加载和格式选择

    原文链接:浅谈性能优化之图片压缩.加载和格式选择 在认识图片优化前,我们先了解下 [二进制位数]与[色彩呈现]的关系. 二进制位数与色彩 在计算机中,一般用二进制数来表示像素.在不同的图片格式中,像素 ...

  3. 浅谈一下DNF游戏小晶块,这个神秘的道具

    DNF的小晶块可以说是跟随版本时间最长的道具之一了,一代一代版本更新而来,有些材料.道具跟随着游戏的版本更新不断的进行更替,神话一般的炉岩碳也在时间的长河中消失了踪影,而小晶块却在版本的长河中不断流淌 ...

  4. 浅谈人工智能与游戏思维

          如何找到一种可产生意向性的形式化手段是通往人机有效融合的关键,目前的数学.物理手段还不具备完全承担这个重任的能力,因为这仅是智能--这个复杂性系统问题的两个方面而已.       下文首先 ...

  5. Himi浅谈4年游戏开发de自学历程!(牛人是如何学习的)

    http://www.himigame.com/himistudy/382.html 上班之前: 学习J2me的时候,每天除了饿了去吃饭之外,全部用来学习,基本上是3天里有一天通宵: 写了四款基于Kj ...

  6. 浅谈明日方舟游戏系统

    主要玩法:敌方阵营从敌方初始点进入战斗并且沿着怪物前进路线行驶到己方保护目标.玩家可以通过部署干员守护己方保护目标,防止敌方阵营进入:当保护目标的生命值为0时,则战斗失败,任务结束. 1 干员系统 1 ...

  7. 浅谈 翻硬币游戏【Nim博弈】

    ACM博客_kuangbin 博弈-翻硬币游戏 hihoCoder 1172 : 博弈游戏·Nim游戏·二 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 Alice和B ...

  8. mysql数据库合并游戏合服_浅谈滚服游戏如果实现一键合服

    背景 近几年的游戏行业中,出现了各种各样的滚服游戏,包括页游,手游,H5游戏等等.滚服游戏和大服游戏的区别在于同时游戏人数,大服游戏是有很多用户在一起玩,甚至几十上百万玩家.而滚服游戏则一般会设计游戏 ...

  9. 浅谈IC卡密码的破解方法

    IC(MIFARE 1)卡密码的破解本人总结有两种方式: 一.软破 条件是熟悉任意一种编程语言,读写卡器一个,IC卡若干张即可开始破密之路,采用软破的方法,一般只要3-5分钟即可算出IC卡的A.B密码 ...

最新文章

  1. ++实现 kill_如何设计并实现一个秒杀系统?(含完整代码)
  2. C++中函数重载分析
  3. 表格隔行变色_CSS实现鼠标悬停高亮
  4. 昆仑通态9针通讯口定义_昆仑通态触摸屏与常见PLC的连接方法(3)——OmronHostLink...
  5. python tkinter输入框_python tkinter-按钮.标签.文本框、输入框
  6. 学python心得体会800字-python 学习心得
  7. 请问python语言的语法特点_Python3笔记004- 2.1 python的语法特点
  8. 两年前端历程回顾的思考与总结
  9. Java 后端开发必读的 6 本书!
  10. ie8 升级页面html,ie7浏览器怎么升级到ie8?
  11. 什么是软件质量管理的底层逻辑?
  12. 开心网之开心餐厅游戏分析报告
  13. 照片webp格式怎么改成jpg?
  14. STM32Cube配置LCD1602液晶屏
  15. leetcode 714. 买卖股票的时机含手续费 python
  16. html页面内检索,如何用 javascript 实现html页面的关键字搜索?
  17. VMware的磁盘格式化
  18. 独家对话行癫:最详解密阿里云顶层设计和底层逻辑
  19. 如何将kindle上的书导出成epub格式
  20. 如何创建一个不确定长度的数组

热门文章

  1. 订餐系统之同步口碑外卖商家菜单与点点送订单
  2. 今日金融词汇---为什么股票前面会有个DR
  3. JavaScript 代码格式化及编写工具
  4. Vuforia SDK---- AR开发vuforia 问题总结
  5. python分苹果问题_分苹果问题的C++和Python实现
  6. 条件EK02在定价过程中丢失
  7. windows突破百度云上传限速
  8. 高中选科策略隐私政策
  9. Kindle电子书整理脚本
  10. 多线程 - 线程同步