android 反编译方法、工具介绍

网上有很多的反编译文章,个人认为写的比较好的文章有  https://www.cnblogs.com/hayha/p/6848474.html 。我也是参考其文章来的,本人写此文章目的、以及反编译运用场景 主要有以下几方面:

  • 记录反编译的方法,方便自己用的时候比较方便,起到记录的作用;
  • 运用场景:排查混淆问题,反编译apk,看类是否被混淆;
  • 运用场景:查看jar的代码,以及是否被打入apk中;
  • 运用场景:其他需要反编译的时候;
  • 运用场景:某个技术点想参考别的app,或者研究竞争对手的app等等;(注意:不要用于非法事情)

反编译步骤

工具准备

apktool —— 官方下载 ,其作用是拿到apk 中的dex文件;(可选工具,非必须)

dex2jar——  官方下载,见名知意,就是把dex转化为jar文件,这是最关键的一步;

gui ——  官方下载,这是一个图形化工具,查看jar里面的代码。(非必需,有其他可替代工具)

 

总结:大致就三步,第一:从apk文件中拿到dex文件;第二:把dex文件转化为jar包文件;第三:查看jar文件中代码;

一:从apk到dex文件

从apk到dex,可以利用jartool ,当然有替代方法:就是解压软件直接解压,这种方式最快,最省事,和jartool 没有区别。

上面两图介绍了解压软件解压apk后的解压产物,可以拿到dex文件。

通过jartool 方式

基本命令: java -jar apktool.jar  d  待解压的apk 

// 注意`apktool.jar`是刚才下载后的jar的名称,`d`参数表示decode
// 在这个命令后面还可以添加像`-o -s`之类的参数,例如
// java -jar apktool.jar d yourApkFile.apk -o destiantionDir -s 
// 几个主要的参数设置方法及其含义:
-f 如果目标文件夹已存在,强制删除现有文件夹
-o 指定反编译的目标文件夹的名称(默认会将文件输出到以Apk文件名命名的文件夹中)
-s 保留classes.dex文件(默认会将dex文件解码成smali文件)
-r 保留resources.arsc文件(默认会将resources.arsc解码成具体的资源文件)

示例:

apktool.jar 和 apk放在同一个目录下

 

最后,我们可以看到解压后文件为:

 dos命令行截图中一共运行了两个jar命令,第二个命令是 解压app-debug.apk 文件到app-debug-1文件夹,并保持dex文件 。另外,现在app为了突破最大方法数量限制,用了多dex 方式,所以这里apk内部可能会有多个dex文件。

这里,后续还可以研究下,apk文件由什么组成,各部分代表什么。这里,参考一下其他的博主介绍

我们已经得到一个可以用文本编辑器打开的阅读的AndroidManifest.xml文件、assets文件夹、res文件夹、smali文件夹等等。original文件夹是原始的AndroidManifest.xml文件,res文件夹是反编译出来的所有资源,smali文件夹是反编译出来的代码。注意,smali文件夹下面,结构和我们的源代码的package一模一样,只不过换成了smali语言。它有点类似于汇编的语法,是Android虚拟机所使用的寄存器语言。

这时,我们已经可以文本编辑器打开AndroidManifest.xml文件和res下面的layout文件了。这样,我们就可以查看到这个Apk文件的package包名、Activity组件、程序所需要的权限、xml布局、图标等等信息。其实我们把Apk上传到应用市场时,应用市场也会通过类似的方式解析我们的apk。

note1:其实还有一种方法,可以省去每次解包时,都要输入java -jar apktool.jar xxx这行命令,官网也有说明,就是将这个命令包装成shell脚本,方法见:https://ibotpeaches.github.io/Apktool/install/ 。而这个shell的脚本在有些博客里介绍是 jartool.bat 文件,其实其作用就是上面的说的。

二、 从dex到jar 

这一步是最重要的,需要dex2jar工具,

接下来,我们把第一步获取的dex文件放到 刚刚解压的文件中,然后运行命令:

d2j-dex2jar classes.dex classes2.dex 

 

会得到jar 文件,见上面的截图中红色框框。

第三步:用gui 图形化工具查看代码

 下载好工具后,双击exe文件,然后把jar文件拖入其中即可。

 

最后,我把这三个工具统一压缩上传一下,方便其他人吧(资源还在审核中...过了加上链接地址)。

其他想说的

还有其他的反编译工具,比如之前说的博客里也有介绍,试过一些,不太好用;还有一些python写的脚本之类的,没有试过,有兴趣的可以看看。另外,这种方式的反编译对混淆过的apk还是无能为力,因为没有解析过mapping文件,所以混淆过的反编译对于这种方式反编译不够完美。后续谁有比较好的方式针对混淆过的apk文件,欢迎指出,谢谢。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章