All Articles

移动应用逆向工程

0. 前言

最近也算是开始入坑玩起了移动游戏,同时对游戏的机制和技术也产生了很大兴趣。加上之前很早就想参与下移动应用的开发和移动游戏的开发,于是就想尝试下反向工程该游戏。下文的内容权作笔记。

1. 准备工作

下载游戏的apk和ipa,把后缀名改成zip解压,获得两个版本的文件夹。

1.1 Android文件夹

  • assets:游戏主体,基本上游戏内容都在这里
  • classes.dex:和平台相关的JAVA代码,反编译可以获得源代码
  • lib:都是so文件,游戏运行需要的一系列基本平台类库
  • res:应用程序的各种资源,主要是icon,各种尺寸

游戏代码位置:

assets/bin/Data/Managed

1.2 iOS文件夹

根目录 Payload 文件夹下只有一个文件夹 fatego.app,有用的东西都在 Data 下面,Managed 下面是代码,其他基本上都是资源。

2. JAVA反编译

反编译dex文件到jar文件,使用命令行工具:dex2jar 安装:

brew install dex2jar --verbose

安装完之后你找不到这个命令。。。 该软件命令都是以 d2j-* 开头的,这里我们要用的是:d2j-dex2jar

执行命令:

d2j-dex2jar classes.dex

会在同目录创建一个新文件:classes-dex2jar.jar

使用JD-GUI这个软件来打开并查看其中的JAVA代码,主页:链接

当然,因为Unity游戏项目的代码是跨平台的,因此Android平台的class文件内没有什么有价值的东西需要我们仔细阅读。

3. DLL反编译

Unity的游戏代码是放在上面所说的Managed文件夹下,游戏代码会被封装成一个DLL:Assembly-CSharp.dll 因此我们需要将这个DLL反编译成C#代码。这里使用的工具是ILSpy,但这款软件是没有MAC版的,在google上找到了MAC的替代品:aerror2/ILSpy-For-MacOSX

这款软件的安装和使用还有点意思,首先需要安装Xamarin Studio下载 装完了估计还得下载安装Mono套件,这东西不需要担心,在启动Xamarin Studio的时候会提示你没有runtime,需要下载。

接下来:

git clone [email protected]:aerror2/ILSpy-For-MacOSX.git

使用Xamarin Studio打开克隆下来的sln项目,构建Build完成,生成:ILSpyMac/bin/Debug 该文件夹下都是构建出来的可执行文件,我们需要使用的是:ILSpyMac.exe 接下来执行命令:

mono ILSpyMac.exe -n 随便输入点名字 DLL文件所在的文件夹

这个命令会扫描刚才输入的DLL文件所在的文件夹,为每个DLL文件创建同名的文件夹,文件夹内都是DLL内解析出来的C#代码文件

4. SO反编译

MAC下主要是使用工具:Hopper Disassembler 这是一个付费软件,自己找破解吧。

5. Unity资源解包

资源文件都放在Data文件夹下: iOS:Payload/fatego.app/Data/ Android:assets/bin/Data/assets为后缀名

这里我们需要工具来解包资源文件,解出我们可理解的图片、文本、模型、音频文件。找这个工具不算顺利,以引擎来看Unity版本更新不算慢,导致工具必须频繁,而不知道为什么,做工具的人也不多,这里我把我用过的踩过坑的历史都写下,以作笔记。 从结论上来说,现行可用的基本上只有5.4 python-unitypack

5.1 Unity Studio

主页:RaduMC/UnityStudio 介绍:Unity Studio is a tool for exploring, extracting and exporting assets from Unity games and apps.

下载下来是windows下的可执行文件,即exe,MAC和Linux不可用。尝试使用了下,打开assets包是可以,但解包就假死,错误信息没有仔细看,估计是资源包内的格式不支持之类的错误。

Update 2016-11-25: 找到了作者的博客,11.08刚更新到v0.6.4版本。不过这个版本下载下来也仍旧有报错。 最后用Windows机器clone了代码库,用VS自己编译了一个版本,这个倒是可以用。将assets整个导出后,Texture2D的文件都是pvr,后面要找工具看是否能转换pvr到png之类的。

Update 2016-11-27: 在我的WIN7机器上做实验,build出来的版本2D贴图解析肯定有问题,所有的图片不是黑的就是不显示,而使用0.6.4作者官方的最新版本,除了会报无法加载 DLL“PVRTexLibWrapper.dll”之外,非PVR格式的图片都是可以正常预览的。 在作者的博客上找到了一个提示

64位需要Visual C++ 2015

尝试到微软官方页面上下载然后安装了,结果仍旧没有解决问题。这块仍旧需要Debug。 但至少知道这个工具的贴图相关技术还是可用的,不过当前PVR的DLL链接有问题。

Update 2016-11-30: 两次Update里的作者是中国人,非标题下列的原库的作者,所述的库是一个fork库: Perfare/UnityStudio

5.2 Unity Assets Bundle Extractor

主页:DerPopo/UABE 论坛:Unity Assets Bundle Extractor 介绍:Unity .assets and AssetBundle editor

下载下来就只有一个exe文件,打开就报错说一个DLL不存在,也是不知道怎么用。

Update 2016-11-25: 之前下的2.0b版本有问题,只有一个可执行文件,前面的几个版本(2.0b之前,含2.0)都是完整的包,可以使用。不过这个软件的导出功能不是很好用,也没有批量操作。

5.3 DisUnity

主页:ata4/disunity 介绍:An experimental command-line toolset for Unity asset and asset bundle files written in Java, mostly designed for extraction.

0.3、0.4、0.5每个版本貌似都是跟进Unity的版本。当前最流行的是 Unity5,但该工具的0.5版本只是一个半成品,可以读assets,但无法解包,是一个废品。 之前最主流的解包工具就是这款,不知道为什么现在完全不行。该工具使用java编写,支持多平台。

5.4 python-unitypack

主页:HearthSim/UnityPack 介绍:A library to deserialize Unity3D Assets and AssetBundles files (*.unity3d).

Python的命令行工具,也可以作为python的代码包来使用在代码中。该工具使用python3编写,使用需要先安装python3:

brew install python3 --verbose

然后安装工具:

git clone [email protected]:HearthSim/UnityPack.git
cd UnityPack
./setup.py install

接下来就可以使用命令进行解包了:

unityextract --all -o 资源导出路径 ASSETS文件路径

使用后发现贴图Texture的解包需要额外安装东西:

Texture2D objects will be converted to png files. Not all Texture2D formats are supported. Pillow version >= 3.4 is required for this.

该类库的页面在:Pillow (PIL Fork)

安装完毕后,解包脚本即可解包贴图Texture了。

后续又发现了新问题,Android和iOS的贴图压缩算法在解包工具的当前版本中没有被处理,解包会报错:

Android:
NotImplementedError: Unimplemented format <TextureFormat.ETC_RGB4: 34>
iOS:
NotImplementedError: Unimplemented format <TextureFormat.PVRTC_RGB4: 32>

待解决

6. 读代码

在代码反编译完成后,可以使用Xamarin Studio载入代码,方便进行代码阅读。

UPDATE 20161130: 暂停该工作,优先级较低,进度有问题。任务先转到别的工作。

EOF

Published 2016/11/22

Some tech & personal blog posts