最近想如何解包游戏两个RPG游戏,但有加密算法搞不定

最近为了支持下汉化游戏加入叻一个汉化组做技术,主要的工作就是如何解包游戏游戏资源 提取其中的资源文本交给翻译人员来翻译,因此我就将自己一次分析游戏資源包格式到写出如何解包游戏程序的过程整理成文与大家共享。

我们今天的目标是一款名为《夜神任务:同心同灵》的游戏下载地址: 。游戏并不大这样利于我们由浅入深地进行学习。

分析游戏用到的工具有:

1.查壳工具PEiD同时还要用它来识别程序中使用的压缩算法;

3.静态反汇编工具IDA;

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:

好初步静态分析过程已经完成,但是还有很多地方没搞明白这就需要我们动态跟踪下遊戏程序了。

跟踪前先用PEID查一下壳,显示microsoft visual c++应该没加壳,前面分析道有很多数据块并且开头都是78 9c,说明文件是被压缩了我们可以用peid嘚插件krypto ANALyzer插件看一下程序中都使用了哪些加密或者压缩算法,结果找到了这些算法:

ADLER32和CRC32应该是用来校验文件的我们先不管。ZLIB这个是游戏资源包压缩很 常用的压缩算法而且压缩后的文件开头的标志就是78 90,所以可以确定这个游戏是先用zlib算法将文件压缩然后放到一个大文件(PAK)中嘚。

Ctrl+F9返回到ida中看一下这个地方做了些啥,结果发现这个地方很复杂

查看下函数名发现这里是c的库函数,_tsopen_nolock,既然如此就不在这里浪 费力气叻继续ctrl+F9 N次,并在ida中观察函数的名字发现程序其实调用的是fopen, 并且还发现下面有fseek、ftell、rewind,但是并没有发现fread,所以继续F9,然后会

这个函数是返回当湔文件指针的位置的ctrl+F9发现返回值是013DD0C0h,用Winhex打开datapc/DataCommon.pak,发现指向的是文件末尾这里应该就是确定下前面的fseek,是不是把指针设置到了文件的末尾沒有什么用,继续F9中断到了rewind,参数是:

这个函数又将文件的指针设置回了文件开头(有意思么 ?) 继续F9,在Fread上断下来了参数如下:

Ctrl+F9,然后在00的内存窗口看下0012FAA4位置到底读了些什么,结果发现就是我们定义为HEAD结构体的部分继续F9,又中断到了fseek参数如下:

在winhex里面看看这个0x013d4f60位置是什么,结果发现是第一个文件名的开头那么这个值是如何来的呢?我们在IDA中逆着向上看发现这个值有可能从两个地方来,用 OD在0x這个跳转处下断点重新载入,看一下到底是执行了哪个分支结果发 5见跳转并没有执行,所以这个值是 . E8 C40A0000 CALL 这条指令调用的函数的返回值嘫后在下面经过多次传递后又乘以12011所得到的。这个函数是有 一个参数从od中看这个参数是一个指针,指向读取到内存中的pak文件的偏移018处的┅个DWORD,也就是head中的第三个dword而这个函数的作用就是将这个值每个字节从后往前排,并把得到的值返回(感觉好乱啊)举个例子,比如DataCommon.pak的HEAD中嘚第三个双字在WinHex中看是00 00 00 73经过转换之后就是73 00 00 00 (这个转换是 在01

继续F9,中断到了fread上参数如下:

可以看出来这里把所有的文件信息部分都读取到叻内存。

分析到了这里我们已经可以不用在分析了,已经完全可以凭猜测加测试搞定根据分析结 果HEDA结构体可以冲洗定义成这样:

再看DataPC.PAK攵件的文件信息部分的第一个FILEIOFO结构体,最开始的的100h字节 是文件名往后的有数据的双字则是重点,它们应该包含文件名所指的这个文件在這个pak包中的大小偏移等信息,经过试验发现第二个双字经过反转(同上面方法一样)之后(不用乘以120h)是这个文件压缩后的数据的大小洇为zlib解压的时候要求输入解压完的文 件大小,这个大小一般都是在压缩之前保存好的而正好第一个双字的数值大小经过反转(不乘以120h)后大尛比较合适,就假设他是文件的大小第三个双字反转后则是这个文件pak中的偏移,但是这个偏移没有什么太大用处因为每个文件之间都昰没有空隙的,读取 完了一个直接读取下一个就可以了由于剩下的部分都是一样的,可以不用在乎这样我么 可以把FILEIORD重新修改成这样

文件数据结构的分析就到这里了,对于完整了解这个pak还需要很多工作要做,不过对于编写一个如何解包游戏器以上的分析就足够了。

根據分析所得的这些信息写一个如何解包游戏程序就不难了,大体流程如下:

1.读取文件的HEAD检查HEAD.dwFlag是否为5041434Bh,不是则说明不是我们分析的格式的pak攵件,不在往下执行

2.读取HEAD.dwFilelnfoSize,然后按照前面说的方法计算出文件信息部分的大小 相关的代码在WM_COMMAND消息处理逻辑中

3.用一个大的循环读取文件嘚信息,根据信息用zlib的解压函数解压数据并将数据写到文件中。 y^-

mov hCreateFile, eax ;保存创建的文件的句柄 ;;;;;;;;计算导出后文件(实际文件)嘚大小 * * ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

限于篇幅就不将其它代码贴出来了 希望本文能为想自己修改汉化游戏的朋友带来一点帮助,这方面的技术我也是初学有所疏漏在所难免,希朢大家不吝赐教

仅供学习请勿拿破解来的资源盈利。

【cofface】adb基于最新安卓源码编译修改兼容其它助手,增加参数支持识别所有机型

所有有些团队为了避免别人提取所以对资源进行了加密,最近又发现了一个神器基于硬件层面查看内存贴图这样就直接无视对方加密了

1. 通过wifi, 利用adb来连接手机。在pc的cmd中输入命令: adb connect 192.168.1.100 如果电脑連不上安卓手机可以试试这个【cofface】adb基于最新安卓源码编译修改兼容其它助手,增加参数支持识别所有机型

重新***adb 驱动。

Adreno Profiler分析任意安卓游戏特效抓取资源可以用来分析安卓手机上OpenGL ES绘制过程。这个东西牛的地方在于可以抓取任何可以运行的App而且使用起来非常方便、没囿额外限制。这个工具本质上是一个OpenGL ES Draw Call Replay;如果你用过PIX或者GPA就会感到很非常熟悉了。

由于这个工具是高通提供的所以只能运行在高通芯片嘚安卓机上。为什么要强调这一点呢其实其他厂商也有类似工具,但是从使用限制、方便程度上来说差太多了: iOS可以用XCode自带的Frame Capture但是这貨用起来很不顺手,而且没法抓取第三方应用其他安卓厂商也有类似的工具,例如Mali Graphics Debugger但是使用起来比较麻烦,譬如需要越狱、上传so到系統目录之类的下面将具体介绍其使用

最近发现了一个非常好用的工具Adreno Profiler,可以用来分析安卓手机上OpenGL ES绘制过程这个东西牛的地方在于可以抓取任何可以运行的App,而且使用起来非常方便、没有额外限制这个工具本质上是一个OpenGL ES Draw Call Replay;如果你用过PIX或者GPA,就会感到很非常熟悉了下图昰贵易的魔天记,挂起来毫无压力233

由于这个工具是高通提供的所以只能运行在高通芯片的安卓机上。为什么要强调这一点呢其实其他廠商也有类似工具,但是从使用限制、方便程度上来说差太多了:

  • iOS可以用XCode自带的但是这货用起来很不顺手,而且没法抓取第三方应用
  • 其他安卓厂商也有类似的工具,例如但是使用起来比较麻烦,譬如需要越狱、上传so到系统目录之类的

下面将具体介绍其使用,然后用兩个例子来讲解一个是抓取分析聚爆Implosion的特效绘制,另一个是用来做cocos2d-x图形性能优化

下载并***,需要注意以下几点:

  • Adreno SDK不是必须的可以無视;
  • 虽然Adreno Profiler提供了跨平台版本,但这货貌似是c#的我尝试在OSX下用Mono跑但是折腾不出来,所以最好还是Windows;
  • 需要将adb添加到系统路径可以直接下載一个,但是我国国情导致你不一定能很方便的下载下来;还有一种取巧的办法是所谓的xx手机助手、豌豆荚等工具目录下一般都会自带指向adb.exe所在目录即可。

需要一个有高通芯片的手机我这里强烈推荐G家亲儿子Nexus系列!如果手头没有的话,可以去淘宝买个Nexus 4虽然是几年前的機器、不过一点都不卡,而且一千块钱都不到

注意目前Android 5.1上可能出现连接不稳定的情况,见我这边测试5.0倒是一直能用~所以如果遇到这个問题,建议降低系统版本再说

再注意需要打开手机的开发者模式,并把电脑设为信任偷懒的方法是用豌豆荚连一次,跟着指示做就行驱动都自己装好了。

首先手机上打开游戏运行到需要抓取的界面。然后在电脑打开Adreno Profiler点左上角的Connect。这里有两种连接方式:手机直接插箌电脑上或者在同一个局域网内使用IP连接。准备好了之后点击Refresh直至刷出对应的设备和应用:

这样其实就完成了抓取工作,是不是感觉so easy! 丅面将从例子出发介绍具体的使用。

小技巧:抓取完成之后可以点击上方的Save将帧数据保存成apr文件,这样可以之后Open省的每次分析都需偠连接手机、打开游戏。

这个工具使用非常简单核心是左下角的Render Calls。它其实是抓取了一帧中所有GL部分的调用及相关数据然后按照绘制命囹组织。当选中不同的Render Call时工具会显示从一开始到这一个命令的绘制结果,方便看到每一个中间过程此外,在API Calls中还可以看到每一个Render Call之湔的其他命令,包括各种对GL状态机的修改:

从图中可以看到在这个绘制动作前,对模板状态进行了设置然后传了一些Uniform,并修改了顶点屬性~更方便的是具体的顶点数据什么也能直接看到!

就纹理来说,在右边可以看到所有显存里的纹理资源点开可以看到具体的纹理参數和缩略图。在上面有一个小的按钮可以将所有纹理都保存成一个个文件:

就Shader来说,同样也是可以看到所有Program工具还会贴心的标出所有利用了该Shader的Render Call,下面可以看到反汇编出来的指令:

就模型来说选中一个Render Call然后Save Vertex Data就可以导出obj,但是生成的文件还需要稍微修改下才能导入具體打开看看就懂了~

我曾经把驯龙高手的地形导出之后放到Unity,毫无压力--

之前zhiwei写过,下面我从图形性能为例来介绍需要注意的几个点~

首先需要看一下每一个Render Call干了什么,是否有意义根据不同游戏类型,对Draw Call个数应该有个大概掌握这个当然是越少越好啦~

  • 是否有无效Render Call,我曾经见過一个全屏绘制“无效果”也就是屏幕内容在绘制前后结果完全一致,不知道到底干啥了...
  • 是否有绘制到屏幕外的Render Call也就是模型在屏幕外嘚情况;这个其实应该是引擎自动优化掉相机范围外的物体,不过有的引擎不具有这个能力_(:

参考资料

 

随机推荐