吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 26762|回复: 27
收起左侧

[Android 原创] 破解一个国外游戏对OBB数据包的验证

  [复制链接]
Tears丶残阳 发表于 2017-12-27 14:41
本帖最后由 Tears丶残阳 于 2017-12-27 20:38 编辑

        在爱吾潜伏好一段时间了,没事的时候就爱逛一逛爱吾,只在论坛里面发过一些问题的帖子,一直也在想回馈给大家一点什么呢?
        随着年龄的增长,我喜欢的游戏越来越少,只有一款手机上的《YU-GI-OH! Duel Generation》玩得比较久。看到这里应该有人明白了,这款游戏是英文的,并没有中文的版本,也不在中国发布,只在Google Play上提供下载。凭借着对《游戏王》卡牌游戏的喜爱,我决定对这款游戏进行汉化和修改,使其他同样喜欢游戏王的玩家们,可以较为方便的玩上这款游戏。在这个过程中,我也积累了一些知识,当初在网上翻各种资料,过程很艰难,觉得很有必要把这个过程中的知识都记录下来,方便以后的玩家们查阅。
        而这篇帖子将讲述如何破解游戏对OBB数据包的限制。因为要汉化的文件都在OBB数据包中,修改OBB后,APK并不能识别到OBB,所以破解APK对OBB的验证便是第一道题。
        在开始之前,我先自我介绍一下:我的昵称是【Tears丶残阳】,在各个交流平台都是用的这个昵称,之前曾用过【唤龙】这个昵称。在Android手机还没有普及之前的非智能手机的年代,研究过一段时间的jar手机软件,当初我也还是一个19岁、脸上还白白净净的蓝孩纸。今天我已经27岁了,也在今年开始学习编程语言,开始了我的Android程序猿的生涯。





一、工具和材料:
1.游戏的安装包和数据包:链接: https://pan.baidu.com/s/1qYFoE52 密码: th9c
2.修改smali代码的APKIDE:https://www.52pojie.cn/thread-399571-1-1.html
3.分析java代码的JadX:https://github.com/Qrilee/jadx/releases/download/v0.6.2/jadx-0.6.2.zip
PS:1.必需的环境配置就不再多说了。2.可以先把游戏安装到手机或者模拟器上运行一次,数据包应该放在内存卡/Android/obb/com.konami.ygodgtest文件夹内,APK安装之后即可启动游戏了。





二、修改OBB文件
        这篇帖子并不讲如何汉化OBB,但是我们必需先修改OBB数据包,让OBB文件产生差异,这是我们破解APK对OBB的验证的前提条件。
        先将数据包复制一份到别处(这是一个好习惯,保护原文件,免去操作多次后,却还原不回去的尴尬),因为OBB数据包其实就是一个压缩文件,所以我们可以直接使用压缩软件打开OBB数据包,比如WinRAR等都是可以的。在桌面上新建一个txt文件,名字任意,随意输入文字后保存、关闭,然后把TXT拖进OBB里面,这样一来,OBB就被我们修改了一遍,虽然这种修改并没有什么卵用,但是我们把它放回内存卡/Android/obb/com.konami.ygodgtest文件夹内,发现游戏已经无法运行了。





三、运行游戏查看变化
        此时,我们运行游戏,会弹出如下界面:

1.jpg

        左上角的英文大意:下载失败,因为找不到资源。
        刚才就说过了,这个游戏发布在Google Play上的,而数据包虽然可以通过网络下载,但是因为大家都懂的不可抗力,下载失败了。





四、开始分析
        如果是有经验的网友,应该已经想到要去搜索那一段英文来找突破口了。但是我从一个Android程序猿的角度来考虑的话,我的想法是找这个程序的入口Activity。
        运行JadX,打开APK文件,稍等片刻,我们就能看到它的结构了:

2.png

        然后我们点开Resources下的AndroidManifest.xml文件:

3.png

知识点1:Android程序的每一个完整的界面都可以理解为一个Activity,一个程序可以有多个Activity。每一个Activity都会在AndroidManifest.xml文件内写清楚,但是一般只会有1个Activity会在程序的图标被点击的时候启动,而这个Activity会有一个重要的属性:
[XML] 纯文本查看 复制代码
<intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

        所以我们只要找到了这4行代码,我们就找到了第一个启动的Activity。那么我们快看看它是属于哪个Activity:

4.png
知识点2:一个Activity在AndroidManifest.xml中配置的时候,必需要有一个属性,告诉系统它是属于哪一个类,这个属性就是:android:name="包名.类名" 。

        由此,可以得知:这个Activity的目标就是com.secret6.Yugioh包下的YGODownloaderActivity这个类了。
        那么我们找到它打开看一下吧:

5.png

知识点3:Activity默认情况下是不会显示内容的,只有在调用了setContentView()方法后,才会根据传入的参数加载内容。

        所以我们需要做的,就是把setContentView当作关键字进行搜索:

6.png

        结果只有一条,在initializeDownloadUI方法内,看一看附近的代码,发现都是一些初始化的赋值操作,那么我们再找这个方法的调用处,因为这个方法没有参数,所以将这个方法的名称加括号和分号作为关键字进行搜索:

7.png

        结果有两处,但是都在OnPermoissionCheckDne方法内,再联合附近的代码就发现有意思的东西了:
[Java] 纯文本查看 复制代码
if (expansionFilesDelivered()) {
    startGameActivity();
    return;
}

知识点4:if语句的括号内,只能是true和false值,可以是boolean类型的表达式,也可以是返回值为boolean类型的方法。
        所以如果expansionFilesDelivered方法返回true,就执行startGameActivity方法,然后结束OnPermoissionCheckDne方法;如果返回false就继续往下执行。有意思的地方就在于startGameActivity的方法名,字面意思就是启用游戏的Activity。那我们直接看一眼startGameActivity方法,按住Ctrl键,然后鼠标点击startGameActivity();,就会跳转至该方法了:

8.png

知识点5:Activity之间的跳转,就是使用startActivity方法来操作的,startActivity方法接收一个Intent对象,用于启用Activity的Intent对象中会有一个class参数,这个class就是要启动的Activity。(PS:Intent的作用并不局限于启动Activity)

        只有一行,就是启动另一个Activity。那我们就只要让上面的代码执行到这里。
        我们回到OnPermoissionCheckDne方法中,按住Ctrl键,点击expansionFilesDelivered(),跳转至该方法:
9.png
        此处没有知识点。因为我们要修改的目标已经找到了。
        我们要做的事情,就是让这个方法原本要返回的false变为true。
        目标已经找到了,这里可以有很多种修改方法,比如使用Xposed也一样可以达到目的。但是Xposed的破解方式涉及到了编程相关的专业知识,并不是所有要玩游戏的人都安装过Xposed。所以我们这里采用修改smali代码的方法。





五、使用APKIDE破解        
        运行APKIDE,打开APK文件,依次展开smali/包名/类名:
10.png

        打开.smali文件,搜索.method expansionFilesDelivered:

11.png

知识点6:smali代码中,方法都会用【.method】开头,所以只要用这个关键字+空格+修饰符+空格+方法名,可以很容易的定位到要找的地方。
知识点7:在smali代码中,true用1表示,false用0表示,并且是用16进制表示的,而16进制必需由0x开头,所以true是0x1,而false是0x0。
        那么我们在这个方法这个方法找0x1和0x0,很容易的在第571行发现了由const开头的0x0,而在623行发现了由const开头的0x1:

12.png 13.png

        我们把571行的0x0改为0x1,然后保存,编译,打包,安装,运行。
        然后我们就顺利的进入到游戏界面中了:

14.jpg

        因为我的手机上并没有安装Google组件,所以弹出了一个这样的对话框来提醒我安装,这个对话框只需要点一下框体以外的地方,就会自动消失了。而且就算我们不安装Google组件,游戏也是可以运行的,所以忽略它就好。





六、扩展知识
        至此,这个APK对OBB数据包的验证就被我们破解了,如果再深究下去,就会发现,其核心原理就是在APK中写死OBB数据包的大小,然后对本地的数据包进行验证。
        在expansionFilesDelivered方法中,核心判断机制是调用了Helpers类中这样的一个方法:

14.png

        解释一下核心代码:
[Java] 纯文本查看 复制代码
if (fileForNewFile.exists()) {
    if (fileForNewFile.length() == fileSize) {
        return true;
    }
    ......
}

        如果文件已存在,获取文件的大小,判断是否与fileSize相等,如果相等,则返回true。
        可以发现,最终的fileSize的值就是在APK中写死的数值,而它是来自该方法中第3个参数,所以它的值是由调用者传递进来的,那么我们返回调用它的地方:

15.png

        第三个参数是 xf.mFileSize,这是一个来自xf中的值,而xf是一个XAPKFile对象,而这个对象,来自xAPKS这个数组,我们按住Ctrl键,用鼠标点击xAPKS,会跳转到这里:

16.png

        这个数组是静态初始化的(没有学习编程知识应该还不理解静态和动态),里面只包含一个XAPKFile对象,我们再点XAPKFile,会跳转至这里:

17.png

        这是一个内部类,可以理解为一些数据的容器,而这个类中有3个字段,分别是mFileSize、文件mFileVersion、mIsMain。这三个值在创建XAPKFile对象的时候,会被赋值。
        根据构造方法中参数的顺序,我们可以知道,第三个传入的数值就是数据包的大小。所以我们还是要回到创建对象的地方,也就是往上数的第二张图。
        第3个参数:YGOConstants.EXPANSION_FILE_SIZE,就是我们要找的代码了。我们按住Ctrl点它,会跳转到这里:

18.png

        看到了那一串数字了吗?我们找到之前备份的未修改过的OBB数据包,右键点击,查看属性:

         19.png
        大小为513 MB (538,929,088 字节),括号里面的数字和代码中的数字完全吻合。也就是这个数字,决定了数据包是否可以被识别。
        所以,如果换一种破解方法,只修改这个数值,就可以达到破解的目的。只不过,我们在未来的汉化过程中,OBB的大小一直在变化,如果修改这个值,每次改完OBB,都要再改一次APK,将是一件非常痛苦的事情,不如原来的方法来得一劳永逸。
七、本章结语
        我自己的smali代码的阅读能力也不强,只能勉强读一些java代码。只要善于寻找smali代码和java代码之间的关系,相信对于逆向也是很有帮助的。
        我在本文中零零散散的、自以为是的介绍了一些Android的基础知识,希望能对大家有所帮助。
        本文可以说是非常基础了,代码可以直接被反编译,甚至都没有被混淆,不得不说这对我们的分析和修改是非常有利的,愚蠢的外国佬。(此处应有滑稽)
        相信网友们读到这里能感觉到,还会有下一篇。没错,那个惹人厌的Google Play的对话框在每次启动游戏的时候,都会弹出来。下一次,我们来干掉它!2017-12-27

免费评分

参与人数 14威望 +1 吾爱币 +24 热心值 +14 收起 理由
茶叶ˇ蛋℡ + 1 + 1 记笔记 记笔记
lfd118 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
ebookread + 1 谢谢@Thanks!
大法官 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
草民 + 1 + 1 那个....兄弟..是吾爱。。吾爱。。。哈哈哈
wisoft + 1 + 1 谢谢@Thanks!
diaoxingyu + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
?﹏從此沉默 + 1 + 1 我很赞同!
Tim-52Pojie + 1 + 1 用心讨论,共获提升!
jyjjf + 2 + 1 写得不错
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
rrrkkkooo + 1 + 1 虽说游戏已经过时了,不过感谢楼主交流技术。
MXWXZ + 3 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
core + 1 + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

rrrkkkooo 发表于 2018-1-1 07:29 来自手机
本帖最后由 rrrkkkooo 于 2018-1-1 07:31 编辑
jixun66 发表于 2017-12-31 19:20
对了 dual links 有中文卡和说明什么的 说不定能直接移植过去

DL有些卡改过效果了,不通用(论文本来说,何况k社的汉化2333)
技术上能不能直接引用难说…
何况现成卡片汉化一大堆,ourocg啥的,或者直接用ygocore的数据库(不过有些卡改效果了,毕竟环境不一样)
 楼主| Tears丶残阳 发表于 2017-12-31 10:31
jixun66 发表于 2017-12-28 10:16
我倒是觉得 OBB 大小校验是为了防止下到坏包/简单的版本更新检查。
如果真的汉化的话,建议做个开发版(忽 ...

当然是真汉化。后期还会有BIN文件的分析以及汉化工具的编写。发布版肯定也会重新开启校验的。
 楼主| Tears丶残阳 发表于 2017-12-27 14:54
本帖最后由 Tears丶残阳 于 2017-12-27 15:06 编辑

这排版我是真的不会。。。。
如果有需要,可以下载看:链接: https://pan.baidu.com/s/1jIAbvca 密码: ksb2

960 发表于 2017-12-27 15:34
赞赞一个
rrrkkkooo 发表于 2017-12-27 16:14 来自手机
虽然有ygocore,ygomobile这类开源,卡池规则同步,更新快的软件(科乐美的游戏王电子游戏就是个笑话,除了决斗链接),不过感谢楼主交流技术
rrrkkkooo 发表于 2017-12-27 16:16 来自手机
何况这游戏已经过时了(现在都新大师规则了),不过拿来技术交流啥的就无所谓了(虽然拿那个ygomobile来练手会更好,毕竟开源啥的)
no123sos 发表于 2017-12-27 16:26
手机需要root吧。。。小白
 楼主| Tears丶残阳 发表于 2017-12-27 16:44
rrrkkkooo 发表于 2017-12-27 16:16
何况这游戏已经过时了(现在都新大师规则了),不过拿来技术交流啥的就无所谓了(虽然拿那个ygomobile来练手会 ...

大师4无爱
rrrkkkooo 发表于 2017-12-27 17:03

可以考虑破解duel link决斗链接啊,毕竟官方村规
lmeiz888 发表于 2017-12-27 17:42
很厉害 学习了
?﹏從此沉默 发表于 2017-12-27 19:13
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-24 19:58

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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