【Android】Android如何对APK反编译

本文笔者粗略的介绍如何利用一些工具,对Android进行反编译,从而得到源码,希望对你有所帮助,笔者的android环境为4.4.2。

如果笔者的apk被加过壳的话,那么可能不适合这篇文章,可以用加壳工具查看要反编译的apk是否加过壳。

1.准备资源.

在开始之前,需要准备三项工具:
apktool 
     作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看,读者可以到https://ibotpeaches.github.io/Apktool/install网址下下载最新版本的apktools,如果出现Exception in thread "main" brut.androlib.AndrolibException:这样的异常,那么就是apktools的办版本太老的原因。


dex2jar
     作用:将apk反编译成java源码(classes.dex转化成jar文件),最新版本的dex2jar可以到SOURCEFORGE下载

jd-gui
     作用:查看APK中classes.dex转化成出的jar文件,即源码文件

2.获取资源文件

使用apktool这个工具获取资源文件,下载apktool 会获得三个文件:aapt.exe、apktool.bat、apktool.jar 、

接下来将需要反编译的APK文件放到该目录下,
打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令: apktool.bat d -f test.apk test   

(命令中test.apk指的是要反编译的APK文件全名,test为反编译后资源文件存放的目录名称,即为:apktool.bat   d  -f    [apk文件 ]   [输出文件夹])

说明获取成功,之后发现在文件夹下多了个test文件,点击便可以查看该应用的所有资源文件了。

打开资源文件后,可以看到里面有res和smali文件夹,res文件夹中放的是图片和XML等一些文件资源,smali里面放的是代码,文件都是.smali格式的,不方便阅读。

如果这里报错的话,可以观察错误信息,然后可以通过输入 apktool.bat 查看帮助信息,笔者在jdk8和jdk6上测试发现,在jdk8中必须使用 -o 输出文件,应该在jdk8中应该使用如下的格式:

apktool.bat   d  -f    [apk文件 ]  -o  [输出文件夹]


如果你想将反编译完的文件重新打包成apk,那你可以:输入 apktool.bat b test(你编译出来文件夹) 便可,效果如下:

之后在之前的test文件下便可以发现多了2个文件夹:

dist(里面存放着打包出来的APK文件)

3.获取Java源码文件

第二步获得的smali文件不方便阅读,接下来获取源码。

下载好dex2jar和jd-gui后 ,解压

将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),

将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,


在命令行下定位到dex2jar.bat所在目录,输入 dex2jar.bat classes.dex ,效果如下:


被混淆过的效果图(类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名):

这种方式可以反编译,但是经过笔者的测试,发现反编译后的源码文件,或多或少都有一些错误。

原文链接:Android APK反编译

原文地址:https://www.cnblogs.com/HDK2016/p/7986201.html