赞
踩
网上有很多的反编译文章,个人认为写的比较好的文章有 APK反编译得工具总结(转载) - hayhx - 博客园 。我也是参考其文章来的,本人写此文章目的、以及反编译运用场景 主要有以下几方面:
apktool —— 官方下载 ,其作用是拿到apk 中的dex文件;(可选工具,非必须)
dex2jar—— 官方下载,见名知意,就是把dex转化为jar文件,这是最关键的一步;
gui —— 官方下载,这是一个图形化工具,查看jar里面的代码。(非必需,有其他可替代工具)
总结:大致就三步,第一:从apk文件中拿到dex文件;第二:把dex文件转化为jar包文件;第三:查看jar文件中代码;
从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脚本,方法见:Apktool - How to Install 。而这个shell的脚本在有些博客里介绍是 jartool.bat 文件,其实其作用就是上面的说的。
这一步是最重要的,需要dex2jar工具,
接下来,我们把第一步获取的dex文件放到 刚刚解压的文件中,然后运行命令:
- Mac:sh d2j-dex2jar.sh classes.dex classes2.dex
- Windows: d2j-dex2jar.bat classes.dex
会得到jar 文件,见上面的截图中红色框框。
下载好工具后,双击exe文件,然后把jar文件拖入其中即可。
最后,我把这三个工具统一压缩上传一下,方便其他人吧(资源还在审核中...过了加上链接地址)。
还有其他的反编译工具,比如之前说的博客里也有介绍,试过一些,不太好用;还有一些python写的脚本之类的,没有试过,有兴趣的可以看看。另外,这种方式的反编译对混淆过的apk还是无能为力,因为没有解析过mapping文件,所以混淆过的反编译对于这种方式反编译不够完美。后续谁有比较好的方式针对混淆过的apk文件,欢迎指出,谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。