1.dex反编译成jar工具
1.1 enjarify
点击下载:enjarify.zip
Enjarify 是一个将Dalvik字节码转化为等价的Java字节码,然后可以用一系列的Java分析工具去分析Android应用。之前我们一直使用Dex2jar来完成这个工作,不过Dex2jar已经算是一个非常老的工具咯。Dex2jar在绝大部分情况下都挺不错的,但是如果碰到了些模糊的特性或者特殊案例就会出错或者默默地吐出一些错误的结果。相比之下,Enjarify在设计的时候就考虑到了尽可能多的情况,特别是对于那些Dex2jar不起作用的情况下。另外,Enjarify能够有效地处理Unicode编码的类名、常量,隐式类型转换、正常处理流程中的移除处理啊等等。
Usage and installation
Enjarify是一个普通的Python 3的应用程序,你可以直接Git Clone然后运行。下载好了之后直接进到对应的目录下:
python3 -O -m enjarify.main yourapp.apk
Linux
有时候为了方便调用,可以将该脚本做一层封装,尽可能的使用Pypy,这货会比CPython速度快一点。另外,如果你希望能够像调用命令一样直接调用Enjarify,你可以将它作为链接放到你的环境变量中,譬如:
ln -s "$PWD/enjarify.sh" ~/bin/enjarify
Windows
我们提供了一个可执行的脚本enjarify.bat,同样地把这个脚本放到环境变量中就可以了。
Usage
可以直接用以下命令调用:
enjarify yourapp.apk
最简单的用法就是可以将一个apk文件或者一个dex文件作为命令行的输入,如果你使用的是一个多dex的apk,那么Enjarify会自动将这些dex打包到一个单一的jar文件中。而如果你选定了一个dex文件,那么只有这个dex文件会被解析。
enjarify classes2.dex
默认的输出是会在当前目录下创建一个[inputname]-enjarify.jar文件。可以通过-o参数来指定输出文件的名称:
enjarify yourapp.apk -o yourapp.jar
默认情况下,Enjarify不会覆盖已经存在的文件,不过可以使用-f或者--force参数来强制指定覆盖。
Limitations
Enjarify 目前还不能狗完整解析一些可选的信息,譬如源文件的属性、行数以及注解。Enjarify已经尽可能地去解析所有的类,不过因为Android或者Java的限制,有些隐藏类并不能很好地解析,不过往往只有在有很多人为混淆的情况下才会出现。
Performance tips
PyPy可是比CPython快很多,可以在这里http://pypy.org/.下载,注意要使用PyPy3,而不是普通的PyPy。Linux下默认会使用pypy3,Windows下面则需要你自己去编辑了。另外,Enjarify默认会使用一些优化算法使得整个反编译之后的代码的可读性增加,比如移除未使用的变量等。如果你不需要这些,可以使用--fast参数来加快速度。
1.2 dex2jar
点击下载:dex2jar
从apk中抽取classex.dex文件
虽说dex2jar可以直接从apk抽取出jar文件,但是会经常遇到一些问题,所以常用的方法是将.apk文件,重命名为.zip,解压缩后,找到classes.dex文件
运行dex2jar生成.jar文件
在Mac系统,打开终端,定位到dex2jar所在的目录,执行以下命令:
./dex2jar.sh absolute_path_classes.dex
在win系统,打开命令行,定位到dex2jar所在的目录,执行以下命令:
.\dex2jar.bat absolute_path_classes.dex
生成文件:classes_dex2jar.jar
2.apk反编译工具
2.1 apktool
点击下载:apktool.jar
2.2 classyshark
点击下载:ClassyShark
2.2.1.官方下载地址
2.2.2.运行命令
java -jar ClassyShark.jar
弹出如下界面:

ClassyShark界面
2.2.3.打开淘宝apk,如图:

淘宝apk结构
分析上图,左边目录栏中主要显示了三部分内容,manifest文件,classes.dex文件集(为什么说是文件集,因为当apk开发采用Mutidex时会产生多个dex文件,不知淘宝为何没有采用Mutidex)和so引用集。
2.2.4.查看淘宝manifest文件,如下图:

淘宝manifest文件
在决定采用那种第三方支持,例如推送时,我们常常会参考别的一些成熟公司,上图红框中可以明显看出是小米推送的相关权限声明,从这可以了解淘宝也是引入了小米推送的。
2.2.5.查看class文件的源码

AllsparkLoader类源码
上图可以看出ClassyShark工具将类的相关方法和变量声明进行了结构调整,分为三部分显示fields,constructors,methods。结构会更清晰,但是也不难发现源码基本都是省略号(看来只能看类基本的组成而已- -)。另外有个小技巧,双击对应的变量对象可以快速跳转至该对象class文件。
2.2.6.图形化查看整个apk的构成(这也是我最喜欢的功能)
将右边的目录栏tab切换成Methods count,如下图:

apk的构成饼图
有时候我们可能只想了解别人的架构,相关组成部分的占比权重,上图能很清晰的表现出来。如果我们想了解占比最高的taobao api部分的组成时,只需在图上点击相应部分。

我们看到了其中有阿里最近开源出来的react库weex(声称比rn好用)。当然如果你想更详细的查看就在右边目录中挨个找,图形只是一个总体浏览。
2.2.7.使用总结
总的来说ClassyShark的使用非常便捷,只需一个命令行,然后打开对应的apk即可,而且显示的内容非常有条理,非常适合在对别人apk整体架构借鉴时使用。
3.jd-jui
点击下载:jd-jui
4.多功能工具
4.1 Android-Crack-Tool For Mac
mac10-11:
点击下载:Android-Crack-Tool For Mac
mac9-10:
点击下载:Android-Crack-Tool For Mac
4.2 Android逆向助手
点击下载:Android逆向助手
4.3 jadx
点击下载:jadx
4.3.1.安装
依次运行以下命令:
git clone https://github.com/skylot/jadx.git
cd jadx
./gradlew dist
主要是拉下来jadx的git主工程,然后跑对应的gradle task。之后会生成运行脚本,大概就是多出了这个目录
4.3.2.运行
cd build/jadx/
bin/jadx -d out lib/jadx-core-*.jar
#or
bin/jadx-gui lib/jadx-core-*.jar
以上命令是git给出的运行示例,主要就是反编译jadx源码的一个jar包。
由于之前文章对比classyShark 和apktool时用的是淘宝apk,那么这里继续用淘宝apk,便于三者的横向比较。
bin/jadx-gui taobao.apk
当然如果你不喜欢使用命令行外加找文件路径,你可以直接双击下图脚本文件即可

jadx-gui脚本文件
会弹出以下界面,对应选中你想反编译的.dex, .apk, .jar or .class即可(可以看到支持的格式还是很丰富的,赞)。

选中taobao.apk
选中淘宝apk,并且反编译完成后,结果如下:

反编译taobao.apk结果
可以看到结果中即反编译了资源文件和源码,这个效果对比,apktool+dex2jar+jd-gui这三个工具集来说操作简便了太多。
4.3.3结果横向对比(classyshark,apktool+dex2jar+jd-gui)
主要就是来对比下反编译后源码的可读性。同样选用com.taobao.allspark包下的AllsparkLoader来进行对比,用jadx反编译后的结果为:

AllsparkLoader反编译结果
我们可以看到可读性非常高,要是去掉混淆的影响,已经很接近源码了!!!(细心的读者可以发现该gui还包含了一部分编译器的功能,很实用)
4.3.4另外几个很赞的功能介绍
1).支持全局class查询

2).支持全局text查询

3).支持导出gradle工程(你可以用as直接看反编译的工程了)

那么我们最终看看在as中打开导出工程后的结果:

很赞对不对
4.3.5总结
看了以上之后,我们就来说下jadx对比classyshark和(apktool+dex2jar+jd-gui工具集)的优劣势吧。
优点:
1.操作方便快捷,一步到位
2.有较为完善的gui界面,带有较多实用功能
3.反编译代码可读性高
缺点:
1.没有classyshark类似的方法总数统计以及图形化分布界面
2.对比apktool直接反编译出来的资源文件有相应的缺失(这个有心的童鞋可以自己尝试下,这里就不给截图了)
总体来说jadx还是你反编译工具的最佳选择,当然有些时候可能还是需要你去配合使用,毕竟现在看来三者还是各有优劣的。
资源汇总下载:汇总下载
网友评论