【破解手记】普利尼,破解手记[1]
普利尼这个游戏的汉化快接近尾声了,现在有空在这里做一个破解的记录,方便自己和其他感兴趣的人参考。
这个游戏是个横版过关动作游戏,是我在psp上喜欢玩的游戏类型,所以下载下来后拿来研究一下。
用UMDGen打开iso后可以在USRDIR目录下看到只有6个文件,可以判断这些文件肯定都是打包文件,先要开苞。。咳咳。。是拆包,我们找个文件来拆一拆。看着这些文件的文件名基本就可以猜到都是派什么用处的,所以先把目标定在SYSTEM.DAT上,我们要的字库什么的应该就在这个里面。
前面的破解前戏部分结束下面正式进入破解主题。
先把这个文件单独提取出来,看看它到底是什么样子的。用你觉得任何用的顺手的16进制编辑器打开这个文件,可以看到他有很完整的文件头和子文件索引信息,其开头是“NISPACK”的文件签名,我暂且把该种文件叫做NISPACK文件。下面我贴出NISPACK文件详细解释:
NISPACK:
offset | size | meaning |
0x00 | 7byte | 文件签名“NISPACK” |
0x07 | 5byte | 无用均为00 |
0x0c | dword | 该打包文件内包含的子文件数量 |
0x10 | 32byte | 子文件名 |
0x30 | dword | 该子文件的偏移地址 |
0x34 | dword | 该子文件大小 |
0x38 | dword | 未知数据 |
以上从0x10开始是每个子文件的索引信息,其余子文件依次重复这种结构。
这里插入一句题外话,我一开始本来以为0x38里的未知数据是用来校验文件的校验值字段,兜了一圈去找文件校验算法未果,后经清文试验,该dword字段并非是用于文件校验的,无视该字段也没什么大问题,这里要感谢清文的试验结果。
有了这些信息后就可以提取你想要的文件了,当然你写程序提取也可以,因为这种文件结构比较简单我是手工提取的。SYSTEM.DAT里除了几个png图标外就只剩一个replay.dat和一个start.lzs文件了,前者才也知道是游戏重放用的数据文件和我们汉化无关,重点就在start.lzs这个文件上了。(大家屏住呼吸,高潮就要来了。。。)
把他单独提取出来以便研究,通过该文件的后缀名可以猜到他是用LZSS系列压缩算法压缩的,用16进制编辑器打开该文件后观察。数据比较杂乱且重复数据很少,应该是被压缩过的(通用压缩、图片压缩、音频压缩、视频压缩都有可能)。为了证实是否真的是LZSS压缩的,要看看该文件被载入内存后的样子是什么样的。
看该文件的文件名应该是在游戏启动时用的,所以我们dump下游戏启动后的内存。LZSS压缩算法的特点之一就是压缩后的文件开头一小部分是明文,所以我们在内存里查找start.lzs文件头的几个字节,果然找到了一处相符的。可以基本证实是用的LZSS压缩的了。我们把内存里该部分文件也单独拿出来(这里再插一句,PSP用户内存的结构大概是这样的:一个内存文件基本是三部分组成:指向前一个文件的指针,指向后一个文件的指针,文件本身数据。可能还会有文件长度这个不定),通过深入对比分析内存里的明文和ISO里提取出来的压缩后的密文可以得到以下普利尼lzss变种压缩算法:
start.lzs:
offset | size | meaning |
0x00 | 1dword | 文件签名(dat) |
0x04 | 1dword | 源文件大小 |
0x08 | 1dword | 压缩后数据文件大小,即当前文件大小减去“文件签名”大小 |
0x0c | 1dword |
压缩编码标识,即紧跟该标识后的两个字节为压缩编码,用来替代重复数据 压缩编码格式为:位置指针,重复长度 位置指针:从当前字节处向前的偏移量,从该位置处开始出现重复数据 重复长度:重复的字节数 若出现连续重复两个压缩编码标识,即表示原数据就是该标识表示的数据 若“位置指针”值大于“压缩编码标识”值,则实际的“位置指针”值须减一, 这是为了避免与“出现连续重复两个压缩编码标识”这种情况相冲突 |
0x10 | 实际的压缩文件数据 |
我们可以看到该LZSS变种算法的压缩原理和标准的LZSS是一样的,但是最终压缩编码输出格式却是和RLE比较类似。该格式有利于提高解压效率,但是其环形滑动窗口和前向缓冲区的长度是一样长的可能会对压缩率造成影响,而且“压缩编码标识”要选择一个不太被用到的字节,否则的话可能会出现负压缩,我的压缩程序直接就用了他原来的0xD5。
知道了压缩算法后就可以写解压压缩程序了,用任何你觉得顺手的语言都可以,不过还是推荐用效率高一点的语言来写压缩程序。因为LZSS压缩算法另一个特点就是压缩慢解压快。压缩解压工具及其源码我稍后会放出。
这里再说一点题外话,原版的LZSS压缩算法是用256棵静态二叉排序树来加快匹配串的搜索速度。改变种要求输出离前向缓冲区最近的那个匹配串的位置,而原版算法只要求输出在二叉树上找到的第一个匹配串,是不是最近的没有要求。这样就出现了一个问题——就是我无法用二叉排序树这个结构用在该变种算法上。我最终采用把二叉树退化成线性链表来组织数据,每次搜做的时候都要遍历到当前链表的结尾才能找到离前向缓冲区最近的那个匹配串,所以压缩效率上比原版要低,如果你们有更好的方法欢迎与我联系。
好了把start.lzs解压后,就可以看到里面的内容了,文本字库什么的都在里面。
今天先写到这里,下次继续讲字库破解部分。
【破解手记】普利尼,破解手记[1]相关推荐
- 【破解手记】普利尼,破解手记[3]
趁上班间隙偷懒再上来更新一下.上回书把文本破解方面基本都介绍过了,本回就来扯一下图片方面. 该游戏用到的图片格式有三种txp,dat,GM3.txp格式上回书已经说过了,本回主要介绍dat和GM3. ...
- 如何面对高水平的破解组织 谈暴力破解应对
如何面对高水平的破解组织 谈暴力破解应对 2005-05-09, 11:18 sanit 共享软件是目前世界上软件业比较热门的话题,国内更是如此.成千上万的中国程序员以极大的热情投入到这个领域来,都憧 ...
- 默克推进下一代抗体药物偶联物疗法;美国FDA受理君实生物特瑞普利单抗治疗鼻咽癌的上市申请 | 医药健闻...
| 行业焦点 由武田中国引进的用于遗传性血管性水肿(HAE)急性发作的治疗药物飞泽优(醋酸艾替班特注射液)正式惠及中国HAE患者.截止至2021年10月,飞泽优(醋酸艾替班特注射液)是中国首个且目前唯 ...
- 数据显示强生新冠疫苗对德尔塔变异病毒有效;康方生物派安普利提交第三个上市申请 | 医药健闻...
| 行业焦点 最新数据显示强生单剂量新型冠状病毒疫苗对德尔塔变异病毒有效并可提供持久保护效力.强生7月1日公布了最新的研究数据,证明其单剂量新型冠状病毒疫苗对迅速传播的德尔塔变异病毒和其他流行率较高的 ...
- 随手记安全吗?随手记手把手教你分析理财平台安全性
我们在选择一个理财平台进行投资时,往往首先会去查看一个平台的信息.除了通过平台官网了解相关信息外,我们还可以在国家企业信息公示系统或天眼查.启信宝等专门网站上对平台的信息进行查询.下面,小编就以随手记 ...
- 2020年普利兹克建筑奖:女性建筑师的野性魅力!
作者:活力网 北京时间3月3日晚23点,爱尔兰建筑事务所Grafton Architects 的两位女性建筑师法雷尔(Yvonne Farrell)和麦克纳马拉(Shelley Mcnamara)荣获 ...
- [算法]最小生成树-普利姆算法
2019独角兽企业重金招聘Python工程师标准>>> 目前正在看<大话数据结构>,其中介绍了普利姆算法,自己对算法理解能力太差,能够手写求出最小生成树,但是写出算法代码 ...
- 【数据结构】图的应用(普利姆算法、克鲁斯卡尔算法、迪杰斯特拉算法、弗洛伊德算法、拓扑排序)
最小生成树 什么是最小生成树 是一棵树 - 无回路 - |V|个顶点一定有|V|-1条边 是生成树 - 包含全部顶点 - |V|-1条边全在图里 贪心算法 什么是"贪":每一步都要 ...
- (王道408考研数据结构)第六章图-第四节1:最小生成树之普利姆算法(思想、代码、演示、答题规范)
文章目录 一:普利姆(Prim)算法算法思想 二:普利姆(Prim)算法注意点 三:普利姆(Prim)算法代码实现 四:普利姆(Prim)算法代码视频演示 五:普利姆(Prim)算法动画演示 六:普利 ...
- 最小生成树-普利姆和克鲁斯卡尔算法
目录 最小生成树 普利姆算法 算法介绍 代码 克鲁斯卡尔算法 算法介绍 步骤解析 回路 代码实现 最小生成树主要是用于解决修路问题等类似问题,要将所有顶点连通,并且权值之和最小. 最小生成树 给定一个 ...
最新文章
- 『参考』使用.net CF自带库判断设备的连接状态
- java之上三角矩阵_7.2.4 编程题《判断是否为上三角矩阵》
- Matlab:Matlab中常用的函数、案例详细攻略
- Android插件化技术调研
- make: *** 没有规则可以创建“default”需要的目标“build”
- 微软project服务器搭建,Project Professional 版本(Project Server 2010 设置)
- linux raid autodetect,软raid的建立
- 【英语学习】【Level 08】U02 Movie Time L2 In black and white
- 媒体转码切片_cVideo云转码系统
- 如何开发神经网络来预测汽车保险支出
- U盘被写保护不能重新格式化
- 转:我用了18年,才可以和你一起喝咖啡
- 详解显式intent和隐式intent
- mac上利用openssl命令进行软件安装包的哈希校验
- Storm中的Window机制
- 学会map、reduce、filter这三个函数,让你Python代码看起来更有逼格!
- 速卖通平台发布2017年考核标准 类目考核改为三个月一次
- 老韩思考:为什么毕业后3年,同学之间相差如此大?
- 微信小程序自定义图片上传组件
- 记录一次nextcloud的优化