三、APK分析 – UNI'S ON AIR资源提取逆向全记录

  看到SNS上一堆人都通过各种各样的方法获取了Live视频,我也下决心一定要把这些视频成功提取出来。为此,我仔细读了Headcrabbed大佬的博客『CGSS 核心反向过程实录』,它对我的帮助很大,不过也有一些不完美的地方,在后面的文章中会详细提到。另外基于我在『【ムービー・画像】吸い出そう 5【音声・BGM】』中找到的.usm转换工具,我极怀疑需要做的仅仅只是在软件包中找到这个密钥,然后剩下的直接扔给现成的工具转换就好。说不定这也不是一件难事,那么就先反编译试一试。

0x01 获取软件包

  我们可能获得的软件包有两种,一种是Android系统下的apk包,另一种是iOS系统下的ipa包。

  众所周知苹果公司出于安全的考虑iTunes 12.7版本以上已经无法下载ipa包了,这使得iOS系统的包获取起来更加困难。

  对于Android系统而言,日本的手游一般只会上架Google Play,因此也没有直接的apk包可以获取,不过大部分的Android手机都可以方便地root,因此即使无法直接获得.apk包文件,也可以直接从安装好APP的手机中拷贝出软件。

  不过还面临着一个问题,Google Play可以选择上架的国家,这个游戏仅在日本提供,这意味着想要获取软件还需要事先准备一个日区的Google账号,而现在Google新注册的账号都要求手机短信认证,不然的话会被当作异常账号无法正常使用,因此通过这种途径获取软件包也是相当麻烦的。

  幸运的是网上可以找到许多提供Google Play上软件apk安装包直接下载的第三方网站,比如APKPure,在这里我找到了游戏最新的安装包,不过它的格式是.xapk并不是.apk,要想安装到Android手机上只能通过APKPure来安装。

0x02 文件名分析

  其实不管是.xapk还是.apk,本质上都是zip格式的压缩包,因此直接把文件后缀名改成.zip后用解压缩软件解压就可以了,把.xapk文件解压后可以看到两个.apk文件config.armeabi_v7a.apkjp.aktsk.unisonair.apk,xapk文件其实是多个apk的安装包。

  把jp.aktsk.unisonair.apk解压缩就可以看到熟悉的Android应用目录结构,这应该是应用的主程序,并且我在assets文件夹中发现了title_intro.usme以及opening.usme,根据名字很容易猜到这是标题和开场的视频,这就说明在安装包里一定能找到解密视频的方法,因为在初次安装从未打开网络的情况下,开场视频也是可以播放的,这就缩小了寻找范围。

  而config.armeabi_v7a.apk解压后只有一个lib文件夹,里面有一些.so文件,so文件是Linux系统下的动态链接库,所以这应该是主程序所调用的一些原生类库。

config.armeabi_v7a.apk\lib\arm64-v8a目录中的文件。libcri_ware_unity.so是CRIWARE Unity插件,包含了它的File System以及音频处理方案ADX2;libcri_mana_vpx.so是CRIWARE Unity插件的视频处理部分Sofdec2,它的运行依赖于libcri_ware_unity.solibil2cpp.so后面的文章中会具体讲述。

  看到这些又在网上搜索了一下libcri_mana_vpx.so以及libcri_ware_unity.so,我突然明白了一件事情,UNI'S ON AIR其实是用的CRIWARE的Unity3d插件进行的音视频开发的,而CRIWARE是日本CRI Middleware公司所研发的游戏音视频解决方案,这家公司大概从九十年代就开始做游戏音视频中间件,从官网可以看到已经有五千多款游戏采用了CRIWARE,可以说这是一件非常成熟的产品了。那就可以先研究下它的文档,另外他们现在还有了中文的网站文档,日文官网上也可以找到Unity3d插件的开发文档,通过阅读文档,可以得到这样一些信息:

  • CRIWARE有自己的一套流编码格式,但是同时也支持H264视频格式,视频封装后的文件后缀为.usm;
  • .cpk为CRIWARE的File System文件,它负责将封装后的视频文件及音频文件等打包,以方便网络传输;
  • 文档中并没有任何关于加解密的说明,在文档中.usm是直接可以使用它提供的视频预览器播放的;
  • 视频在客户端的播放最终是依靠CriMana.Player这个类,这个类有几个方法可以用于传入视频数据。
CriMana.Player涉及传入视频数据的方法

基于上述猜测有两种可能情况:

  1. 密钥其实位于CRIWARE SDK内部,他的密钥并不是使用它的用户设置的而是自带的;
  2. usme文件是UNI'S ON AIR的开发者自己对.usm的再加密,播放时先将.usme解密成.usm,然后再将数据传递给CriMana.Player

如果是第二种的话只需要反编译后跟踪包含".usme"的字符串,应该会很容易发现解密的函数。

0x03 Java反编译

  前面说过在安装包中一定存在着解密的密钥或方法,那接下来就是反编译找到它。

  先用常规的Android反编译方法看看能不能找到,由于Google使用Dalvik虚拟机作为Android平台的Java虚拟机,因此Android SDK会将Java源代码编译出的.class标准Java字节码转换成可以直接在Dalvik虚拟机上运行的.dex字节码,也就是一般apk包里都会有的classes.dex文件。利用dex2jar这个软件就可以将classes.dex转为.jar文件,然后用JD-GUI打开就可以看到反编译出的java代码,然而看来看去,并没有发现任何游戏逻辑的代码,这其实是不了解Unity3d的开发过程所导致的。对于Unity开发的游戏,Java代码中并不会有实际上的游戏逻辑代码。

利用JD-GUI打开转换后的.jar文件,可以看到这些class并不像是开发者写的,而像是软件生成的

  其实这也是逆向过程中的一个普遍的问题,正向过程和逆向过程对同一事物所看到的面是完全不同的,在开发的过程中,开发人员是基于正向思维去进行开发的,而在逆向的过程中,如果完全不了解正向开发思维的话,就会容易走非常多的弯路甚至是进入死胡同,而如果逆向人员本身熟悉正向软件开发的话,很多时候就可以想到如果我是开发的话这里会怎么写,顺着这个思路下去就很容易找到突破口。

  因此这里需要自己去试着写写Unity项目,看看Unity如何进行开发以及编译后的具体逻辑代码在什么位置,不过已经有人帮我们做过这样的事情了,吾爱破解上的这个帖子『unity游戏生成与修改so文件教程』帮了我大忙,参照这个教程,我成功地进行了Unity游戏逆向,限于篇幅具体过程后面的文章中再讲。

发表评论

电子邮件地址不会被公开。 必填项已用*标注