最近为了支持下汉化游戏,加入了一个汉化组做技术,主要的工作就是解包游戏资源, 提取其中的资源文本交给翻译人员来翻译,因此我就将自己一次分析游戏资源包格式到写出解包程序的过程整理成文,与大家共享。 我们今天的目标是一款名为《夜神任务:同心同灵》的游戏,下载地址: http://www.verycd.com/topics/2854279/。游戏并不大,这样利于我们由浅入深地进行学习。 分析游戏用到的工具有: 1.查壳工具PEiD,同时还要用它来识别程序中使用的压缩算法; 2.调试器OD 1.10; 3.静态反汇编工具IDA; 4.16进制编辑器WinHex 1.最后要用一种编程语言写出自己的解包工具,为了锻炼自己的汇编语言编程能力,开发语言我选择了win32汇编,使用了汇编的IDE--Radasm和汇编的sdk——MASM32 v10。大家只要明白了资源文件的结构,可以选用自己所擅长的编程语言来写解包器。 静态分析 安装完游戏之后,在游戏的根目录我们能看到如图1所示几个文件和目录,从大小和名字来看,可以很容易的确定资源文件是放在DATApc文件夹中。 ![]() 在Datapc文件夹中有三个比较大的pak文件,这三个文件就是游戏的资源包了,也就是我们要解包的对象。在很多情况下?六<文件文件是可以用winrar、好压或者72解压的, 这类PAK文件用WinHex之类的16进制打开后可以发现开头的两个字母都是“PK”,而且右 键菜单中会有用winrar之类的压缩软件解压的选项。但是这个游戏的资源文件不属于这种类型(是的话就不会有这篇文章了)。我们用WinHex打开三个PAK文件,找一下三个文件 的共同特征,首先会发现文件开头部分格式比较相似,都是以“KCAP”四个字母开头,这 应该是这类文件的一个标志,后面是一个hex值为00 00 00 01的双字,用途未知,从偏移0x20开始到0x1f处都是0,只有0x8偏移处的一个双字有所不同,都在偏移0x20处开始有格式比较相同的数据,如图2。 ![]() 在这里,我们可以假定前面20h个字节的内容为固定的文件头大小,继续往下看,会发 现三个PAK文件都是些以HEX值为78 9C开头的数据块,这些数据块大多数都是长度不定,并以不定数量个0结尾。到了接近末尾的时候,才出现了一些不一样的数据。这些数据中还包括一些可读字符,看起来应该是文件名,而且每隔0\120字节就是下一个文件名,直到文件结束。文件名的后面是长串的0,应该是填充文件名缓冲区的。在从文件名开头往后0x100 字节处开始出现其他信息,但是目前还不知道这些信息是做什么的,最后的16字节也是全部是0。如图3 ![]() 根据上面的分析,可以大体的推断这种PAK文件由三部分组成:第一部分从偏移0到 0x1F处是文件头;第二部分是包含了大量以HEX值为78 9C开头的数据块的部分则是保存资源压缩后的数据的部分;最后的部分因该是每一个文件的信息,应该根据这些信息将压缩后 的数据解压。当然这些都是猜测,只有实践后才会知道猜测的是否正确。 通过这些分析,我们可以先简单的定义出表示这些部分的结构体,暂时作用未知的部分 就叫做UnKnown: 文件头部分 HEAD STRUCT dwFlag DWORD ? dwUnKnownl DWORD ? dwUnKnown2 DWORD ? dwZero DWORD 5 dup(?) HEAD ENDS 文件信息部分 FILEI0F0 STRUCT szFileName BYTE 100h dup(?) dwUnKnownl DWORD ? dwUnKnown2 DWORD ? dwUnKnown3 DWORD ? dwUnKnown4 DWORD ? dwZero DWORD 4 dup(?) FILEI0F0 ENDS 好,初步静态分析过程已经完成,但是还有很多地方没搞明白,这就需要我们动态跟踪下游戏程序了。 动态跟踪 跟踪前,先用PEID查一下壳,显示microsoft visual c++,应该没加壳,前面分析道有很多数据块,并且开头都是78 9c,说明文件是被压缩了,我们可以用peid的插件krypto ANALyzer插件看一下程序中都使用了哪些加密或者压缩算法,结果找到了这些算法: ADLER32 ::00233292 ::00633E92 ADLER32 ::00233446 ::00634046 CRC32 :: 0028CD58 :: 0068E158 CRC32b : :0027DCE8 :0067F0E8 |