ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用
转载请注明出处:http://blog.csdn.net/fightlei/article/details/52432161
最近在学习Android反编译的一些知识,虽然在网上搜到了很多相关的文章,但是大多都大同小异,或是未切中要害。整个过程下来,踩了很多坑,所以特地记录下来。
本文的所有操作都是在ubuntu下进行的,与其它系统下的操作会略有不同。
为了方便大家,我将本文所用到的工具打包上传到了csdn,http://download.csdn.net/detail/fightlei/9623177,需要的朋友可以自行前往下载。
我们都知道,Android的安装包是.apk文件,可以在手机等设备上直接安装使用,但其本质就是一种压缩文件,将要反编译的apk文件后缀名改为.zip后缀,然后就可以直接用解压工具打开了。
ubuntu下使用解压命令:
unzip app-release.zip
其中“app-release.zip”是待反编译的apk文件名,读者需要将其改为自己的apk文件名,后面不再赘述。
解压后将得到如下文件:
其中res文件夹下就存放着app的资源文件,我们可以点击进去随便打开一个文件,例如找到layout/activity_main.xml,打开,内容如下图
可以看到如果通过解压后直接打开这类资源文件,得到的将会是一堆乱码。同样,打开得到的AndroidManifest.xml文件也会是同样的效果。那么如何才能将其转换成我们看得懂的样子呢,这就需要apktool了。
反编译资源文件
apktool下载地址:http://ibotpeaches.github.io/Apktool/install/
我们需要的是这三个文件
将 app-release.apk文件与这三个文件置于同一目录下,打开终端,进入该目录,执行命令:
apktool d app-release.apk
这里的d就是decode解码的意思
若提示command not found 则改用命令:
./apktool d app-release.apk
如果遇到这样的错误:Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file,则可能是由于版本过低导致的,下个新版的apktool即可
使用命令apktool d app-release.apk -o <dir>, 可用于指定反编译后文件的存储位置,其中<dir>表示存储位置
如果遇到这样的错误:Destination directory (/home/cloudhua/temp) already exists. Use -f switch if you want to overwrite it.,表示你所指定的目录已存在,可以改用命令:
apktool d -f app-release.apk -o <dir>
其中-f代表强行覆盖
执行成功,如下图所示:
在该目录下会生成与apk文件名相同的文件夹,此时我们就已经成功还原出应用的资源文件。比如我们再次打开res/layout目录下的activity_main.xml文件,如下图所示
反编译代码
资源文件还原成功后,接下就该反编译代码了
反编译代码需要用到dex2jar和jd-gui
dex2jar下载地址:http://sourceforge.net/projects/dex2jar/files/
jd-gui下载地址:http://jd.benow.ca/
大家如果回过头去看apk文件的解压内容,会发现其中有一个classes.dex文件,该文件中存放的就是java代码了。此时需要用到dex2jar工具进行转换,首先需要解压该工具。
若后缀为.zip
则使用命令
unzip 文件名
若后缀名为.tar
则使用命令
tar -xvf 文件名
解压后如下图所示
其中我们主要用到的就是d2j-dex2jar.sh文件,接下来将classes.dex文件拷贝到d2j-dex2jar的解压目录下,执行命令
sh d2j-dex2jar.sh classes.dex
可能会出现如下提示信息:d2j-dex2jar.sh: 36: d2j-dex2jar.sh: ./d2j_invoke.sh: Permission denied
根据提示信息我们可以发现是 d2j_invoke.sh文件的权限不够,则使用命令:
chmod +x ./d2j_invoke.sh
没有任何回应,根据unix的哲学,没有消息就是好消息,直接进行下一步
再次输入命令sh d2j-dex2jar.sh classes.dex
如果得到提示信息:dex2jar classes.dex -> ./classes-dex2jar.jar,证明已经转化成功,打开目录,发现多了classes-dex2jar.jar文件,这就是 classes.dex转换成的jar文件,jar文件得到以后,我们仍然无法直观得看到程序的代码,此时就需要jd-gui工具的粉墨登场了。
jd-gui包是.tar.gz后缀,使用解压命令:
tar -zxvf jd-gui-0.3.5.linux.i686.tar.gz
若读者使用的不是我提供的工具包,或者文件名称与我的不同,则将jd-gui-0.3.5.linux.i686.tar.gz改成自己的文件名。
解压后得到以下三项:
其中jd-gui可以直接双击打开。
如果有读者无法打开该文件,可以右键该文件,选择properties→permissions勾选Allow executing file as program。
如果仍然无法打开,则可能是缺少对应的32位依赖库。执行安装命令:
sudo apt-get install libgtk2.0-0:i386 libxxf86vm1:i386 libsm6:i386 lib32stdc++6
若安装后双击仍然没有反应,重启电脑即可。
打开jd-gui,如下图所示
点击file→Open File,选择刚刚转换得到的classes-dex2jar.jar文件,打开就是我们需要的代码文件了,例如这里我选择demo中MainActivity类,代码如下:
OK,那么至此,我们在ubuntu下反编译apk就大功告成啦。
如有纰漏,敬请海涵。
ubuntu下Android反编译详细教程-apktool,dex2jar,jd-gui的使用的更多相关文章
- ubuntu下使用反编译apk,工具dex2jar和jd-gui
ubuntu下使用反编译apk, 工具 1:通过apk-tool反编译出资源文件: http://code.google.com/p/android-apktool/ 2.首先使用dex2jar反编译 ...
- mac 环境下Android 反编译源码
mac环境下Android 反编译 一.需要的工具 apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件. dex2jar:将反编译后的classes. ...
- 【转】mac环境下Android 反编译
一.需要的工具 apktool:反编译APK文件,得到classes.dex文件,同时也能获取到资源文件以及布局文件. dex2jar:将反编译后的classes.dex文件转化为.jar文件. jd ...
- mac环境下Android 反编译
连接地址: https://www.jianshu.com/p/3a305f32c4a3
- Android反编译教程
本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...
- Android 反编译(一,apktool+smail2java)
一:解压缩(获取图片等资源) 对于apk中丰富的资源,假设我们在练习的时候须要引用某些apk中的资源文件时,最简单的办法使用解压缩工具对apk进行解压缩,然后在对应的文件夹下查找须要的资源文件. 二: ...
- Android反编译三件套 apktool 、dex2jar、jd-gui
1.还是老话下载三件套(点击下载) 或者自己在百度搜索下载 2.使用apktool反编译apk cd到D:\TESTCODE\android\android反编译三件套目录下 输入java -jar ...
- Android反编译(三)之重签名
Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...
- 转 谈谈android反编译和防止反编译的方法
谈谈android反编译和防止反编译的方法 android基于java的,而java反编译工具很强悍,所以对正常apk应用程序基本上可以做到100%反编译还原. 因此开发人员如果不准备开源自己的项 ...
随机推荐
- Jedis连接Redis三种模式
这里说的三种工作模式是指: 1.单机模式 2.分片模式 3.集群模式(since 3.0) 说明图详见以下: 使用单机模式连接: private String addr="192.168.1 ...
- [Training Video - 4] [Groovy] Optional parameter in groovy
Employee.log=log Employee e1 = new Employee() log.info e1.add(1,2,3,4) // optional parameters in gro ...
- Dubbo的配置及启动
Tomcat+Dubbo安装 1.将tomcat的webapps目录下的所有文件清空,讲Dubbo管理控制台的程序dubbo-admin-2.5.3.war放 到webapps中,并且解压命名为ROO ...
- 15 输入三个整数x,y,z,请把这三个数由小到大输出。
题目:输入三个整数x,y,z,请把这三个数由小到大输出. public class _015ThreeNumberSort { public static void main(String[] arg ...
- C++11中的tuple应用:让函数返回多个值
在没有tuple之前,如果函数需要返回多个值,则必须定义一个结构体,有了C++11,可以基于tuple直接做了,下面是个示例: // 编译:g++ -std=c++11 -g -o x x.cpp # ...
- 编写高质量代码改善C#程序的157个建议——建议72:在线程同步中使用信号量
建议72:在线程同步中使用信号量 所谓线程同步,就是多个线程在某个对象上执行等待(也可理解为锁定该对象),直到该对象被解除锁定.C#中对象的类型分为引用类型和值类型.CLR在这两种类型上的等待是不一样 ...
- 简述各大 Linux 发行版,有主观,不完全,望见谅
只罗列当前热门的linux发行版 更多关于 Linux 以及 Linux 衍生版的内容可以参阅 中文wiki Debian 系 Debian:开源社区的代表性 linux 系统,每2年一次更新,现在的 ...
- Python 数据分析—第七章 数据归整:清理、转换、合并、重塑
一.数据库风格的Dataframe合并 import pandas as pd import numpy as np df1 = pd.DataFrame({'1key':['b','b','a',' ...
- ConcurrentDictionary 与 Dictionary
ASP.NET中ConcurrentDictionary是.Net4 增加的,与 Dictionary 最主要区别是, 前者是线程安全的集合,可以由多个线程同时并发读写Key-value. 那么 ...
- 7z文件格式及其源码的分析(五)
这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程.最近太忙了,好久没更新,都快忘了写到哪了.:) 这一篇就说说7z文件的尾头的生成方式吧. 上一篇已经讲了尾header的结构 ...