发新帖

PC端游戏数据提取

[复制链接]
4768 0
PC端数据提取过程
[url=]1[/url]准备用到的软件和工具
(1)Eclispe
   (2)Java Bytecode Editor
   (3)jd-gui
   (4) VMware Workstation 8 V8.0.4.744019汉化精简绿色版
   (5)CentOS6.5系统镜像
   (6)putty
   (7)WinSCP
   (8)沃土客户端
  
2.初步分析客户端文件
   在把游戏客户端解压完后,可以看到在game下有一个”core.jar”,这个文件就是游戏的最核心文件,所有破解工作也都是在这里完成。目录game/contents里存放了游戏所有的资源,其中:
game/contents/bdata目录里有1-131.jar,解压后是bin文件,这些bin文件分别存储了物品,技能,装备,怪物等等这些信息;
game/contents/gui_jar里存放的则是游戏图片资源;
game/contents/i18n里则存放着游戏程序所有的文字字符对应信息,其中文件game/contents/i18ni18n_ch.jar!/ texts_ch.properties里存放了游戏需要需要显示的字段对应的汉字内容。
3.寻找突破点
   突破点在破解过程是至关重要的,由于我以前没有接触过java,开始把精力放在了那些bin文件了,尝试直接从这些二进制文件分析出数据,可惜找到的数据时被密的,这是也多亏曹哥给了提示从core.jar里下手,采用在打log的方法,逐层跟踪分析。
   (1)使用Jd-gui反编译工具对core.jar进行反编译,来到以下这个目录:
com\ankamagames\wakfu\client\binaryStorage
在这里可以看没有被混淆的文件名
图3.1 ItemBinaryData类的定义
图中的ItemBinaryData,顾名思义就是物品了,在右边可以看到有许多的变量,这也是就是物品的各项属性了,类的最底部有这样一个函数:
图3.2 ItemBinaryData类的实例化函数
(2)很显然物品类ItemBinaryData是通过一个bYP类来进行实例化对各个属性进行赋值的。为了能够看看这个函数到底传递了那些数值,就需要使用打log的方法来确认了,打log也就是需要在这个实例化函数a里面插入一段自己的代码,这段代码的功能就是把我们想要查看的数值以文本的形式输入出来。
(2.1)首先打开eclipse,构建如下函数:
图3.3 构造的Hook函数
这里个函数的输入变量和返回值得的数据类型一定要与图3.2中的函数一样,当然为能调试通过,在eclipse里需要实现定义一个bYP 类和ItemBinaryData类,具体功能则无需实现。
(2.2)使用Java Bytecode Editor,打开上面已经包含了K函数的class文件,这是就可以找到K函数里包含的所有JVM指令,把这些指令复制下来,然后打开游戏里原有ItemBinaryData.class文件,并在里面的a函数的尾部把粘贴进去那些JVM指令,然后保存。把这个修改的class替换掉原来的那个文件。然后启动游戏,这样只要游戏客户端一旦加载物品类的资源就会调用这个实例化函数a,也就自然会执行上面插入的代码。于是就可以在D盘得到一个1.txt文档,打开后就可以看到部分物品信息了。
图3.4 拦截ItemBinaryData类的实例化函数得到的数据
4.寻找遍历游戏数据的过程
   现在已经可以确定物品的实例化是和这个bYP类是有关系的,那么现在要做的就是分析这个bYP类是从哪里来的,这里使用了一个比较笨的方法就是搜索core.jar里所有包含”new bYP”的文件。这里需要一些操作:
   使用jd-gui把core.jar所有文件进行反编译,得到一个core.src.zip文件。但是这个不能在windows下解压缩,因为这里的文件名是在UNIX平台下命名的,由于windows下是不区分大小写的。所以只能回到UNIX上去。
   
图4.1 core.jar反编译后的压缩包中文件
   这里搭建一个CentOS虚拟机环境。由于这里的CentOS镜像是精简版的,在虚拟机上安装好系统后,还需要使用如下命令分别安装zip和unzip两个命令,这里需要保证系统能够上网。
图4.1 使用yum命令安装zip命令
接着解压core.src.zip
图4.2 解压缩core.src.zip文件
然后使用Find命令查找包含”new bYP”的文件,并把结果保存到/root/1.txt里
图4.5 查找包含”new bYP”的文件
通过对结果分析排查,可以找到eak.java这个文件,在这个类的初始化函数里可以看到这里有一个读文件的操作,通过一系列的操作最后得到的一个bYP:
图4.6 eak类的构造函数
使用上面Hook的方法,对初始化函数的2个参数进行拦截,可以得到:
图4.7 拦截到的eak构造函数的输入参数
在eak的构造函数里,是可以看到这个对这个数组进行的赋值操作的,这样一来整个读取游戏资源的过程的就清晰了:
(1)使用构造函数初始化一个bYP对象,和一个dcz数组。
(2)通过dcz数组的不同值来使得bYP读取不同段的文件数据
(3)使用这个bYP对象去实例化这个最终游戏资源类,这个类可以是MonsterBinaryData或者ItemBinaryData类。
显然这里就是读取客户端里资源文件了,在这个eak里还有这么一个函数
图4.9 eak类里实例化资源类函数
图4.10 eak类里实例化资源类函数的使用
由于游戏里的所有二进制存储的类都是使用了dxu接口,所以这个eak类是可以提取游戏里所有资源。再来分析下这个eak类是怎么通过a函数来读取数据的,于是找到一条这样的语句:
5.编程实现批量导出游戏资源数据
   在进行编程之前,还需要解决一个问题:怎样执行写好的导出游戏函数?这里需要找到一个主动触发执行Hook函数的方法。
在账号或密码输入有空的时候,点击登录会出现这样的提示:
图5.1 游戏登陆出错提示
在texts_ch.properties里可以找到:
图5.2 游戏出错信息对应的标示符
通过查找对应的英文标示符,可以找到fe类里的一个函数里包含这个提示符,在这个函数里插入Hook函数,就可以在登录出错时,主动错发执行自定义的导出游戏资源函数。
图5.3 游戏出错弹窗代码段
在修改好fe.class后,是不能在windows下进行替换的,需要在linux环境里替换,由于安装CentOS是精简版的,只有命令行模式了,需要把core.jar解压后,然后把修改好的文件,复制替换掉原来的文件,再使用zip命令,把所有文件打包成core.jar。
以读取ItemBinaryData类为例子,在使用eak读取文件之前,还需要确定这个类对应的是哪个bin文件。从图4.6里,可以看到需要跟踪的是函数输入函数,通过对图4.7结果分析,可以看出图4.6的第二个整型参数paramInt就是要跟踪的变量,可以看出这个整数在bYP初始化的第二个参数,来到bYP的构造函数:
图5.4 bYP类的构造函数
这里通过super函数调用了父类的初始化函数,bYP的父类就是bVO类,bVO的初始化函数是:
图5.5 bVO构造函数
所以需要在ItemBinaryData类的a函数里下一个Hook来跟踪bYP类的hoA成员变量的值,这里由于父类bVO类里定义是private,为了读取方便,直接把它改成了public
图5.6 bVO类成员变量修改为public
通过用上面的Hook方法就可以拦截到,ItemBinaryData对应的文件就是35.bin,对应文件一旦找到,下面就可以开始编写程序了
图5.7 读取游戏资源类实现过程
资源对象初始化完毕后,安装当前资源类里的函数逐个读取出当前对象的各个属性,并把它写入电子表格里即可,这样就把游戏资源可以全部导出。

举报 使用道具

回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表