文章中的工具:
Obb文件的修改
一般拿到一个游戏的obb文件后,我们可以直接使用解压工具对其解压即可,obb文件都是zip格式的压缩问题,当我们对obb解压后的文件进行修改后,我们需要重新对其压缩打包成obb文件。这里压缩有一点要注意,就是要使用winrar的存储格式进行压缩,如下图所示
但是在实际过程中,可能会遇到一个游戏的obb文件夹内有两个obb数据包的情况,出现这种obb时使用winrar存储格式压缩会出现游戏无法识别的问题,这时就需要使用特殊的工具来解决了,下图是我制作的工具,专门用来修改这样的obb数据包
使用方式也相当简单:
1、需在某个盘的根目录下创建相同的obb解压目录,比如要替换obb包里面TWD\Content\Paks\pakchunk0-Android_ASTC.pak这个文件,那么就要在D盘(其他盘也可)创建这样的路径D:\TWD\Content\Paks,然后将修改好的pakchunk0-Android_ASTC.pak放入这个目录下。
2、打开程序选择要修改的obb文件(注: 会直接会在obb文件上进行修改,所以请提前备份),然后点导入文件选择要替换的导入文件即可。
APK校验的去除
当修改好obb导入到设备中后,你可能会悲催的发现游戏出现了闪退无法运行等情况,而且导入的obb也被自动删除了,这其实是apk程序中加入了对obb文件的校验,我们使用jadx对apk进行反编译就能找到相应的校验代码,我们找到com.google.android.vending.expansion.downloader.d类,就会发现如下代码
而实际上文件的长度来自于游戏包名下的某个类里(这里使用了混淆),很容易找到,我们和实际的obb文件大小一对比就会发现
一般对obb的校验基本都是只验证obb文件的大小(别的情况暂时没有遇到过),这时想去除校验,就只能反编译apk修改代码来实现了,而jadx是无法修改代码的,所以要使用别的工具,首先我们先打开ApkToolAid
选择apk文件后,点击反编译
反编译后找到smali文件夹,里面的smali文件就是我们需要修改的代码,有两种修改方式,首先最简单的就是直接修改文件的校验大小值,我们查看一下修改好的obb文件大小,并将其转成16进制填入其中即可
然后找到刚才jadx中看到的相同目录下的smali文件
修改这个大小后保存即可。但是这种方式只是改了当前对obb文件校验的大小值,如果后面有修改了obb文件,那么还需要继续修改这里,比较麻烦。
第二种方式就是一劳永逸了,首先将上图的大小改成0x0,如下所示
然后修改对文件大小校验的地方,就是上面的com.google.android.vending.expansion.downloader.d类对应的smali文件,然后根据方法参数(下图绿色部分)找到对应的方法
将如下代码进行替换
替换代码:
invoke-virtual {p1}, Ljava/io/File;->exists()Z move-result p0 if-eqz p0, :cond_2 const-wide/16 v0, 0x0 cmp-long p0, p2, v0 if-eqz p0, :cond_1 invoke-virtual {p1}, Ljava/io/File;->length()J move-result-wide v0 cmp-long p0, v0, p2 if-nez p0, :cond_0 goto :goto_0 :cond_0 if-eqz p4, :cond_2 invoke-virtual {p1}, Ljava/io/File;->delete()Z goto :goto_1 :cond_1 :goto_0 const/4 p0, 0x1 return p0 :cond_2 :goto_1 const/4 p0, 0x0 return p0
修改完成保存,然后在使用ApkToolAid进行回编译生成apk即可。
有个疑问,,这段代码应该就是比较大小的代码吧,是不是换成始终为真就可以了?
要的应该就是这个结果吧
.method public static a(Landroid/content/Context;Ljava/io/File;JZ)Z
const/4 p0, 0x1
return p0
.end method
始终让p0位0x1
是的