(Mac)反编译Android APK详细操作指南[ApkTool,dex2jar,JD-GUI]

早在4年前我曾发表过一篇关于《Android开发之反编译与防止反编译》的文章,在该文章中我对如何在Windows平台反编译APK做了讲解,如今用Mac系统的同学越来越多,也有很多朋友问我能否出一篇关于如何在Mac平台上反编译APK的文章,今天呢我就抽时间来写一下在Mac平台上如何反编译APK,希望对感兴趣的同学能有学帮助。

在开始讲解反编译之前呢,我们先来扫个盲:

什么是APK?

APK的全程是Android application package,是Android的应用程序包,平时我们安装Android应用的时候需要将APK文件下载到本地然后安装,Android系统会将其识别为Android应用包。另外,需要指出的是APK 其实是一个基于 ZIP 文件格式的文件,所以支持你用解压软件将其解压,当你将APK文件解压之后你会看到如下文件:

APK文件结构
  • .dex代码文件:它是classes文件通过DEX编译后的文件格式,用于在Dalvik虚拟机上运行的主要代码部分;
  • resources 资源文件:以resources以及res目录为代表的Android程序中所需要的一些资源,如图片资源,颜色资源,字符串,布局等;
  • assets文件:assets目录下存放的是原生资源文件,比如在里面存放字体,铃声等;
  • manifest清单文件:以AndroidManifest.xml为代表的Android清单文件,清单文件向 Android 系统提供应用的必要信息,系统必须具有这些信息方可运行应用的任何代码。

了解过,APK的之后,接下来就给大家介绍反编译一个APK所需要那些工具:

反编译一个APK需要那些工具?

无论是在Windows平台还是在Mac平台,反编译APK都离不了ApkTool、dex2jar、JD-GUI 这三种工具,那么这三种工具都是做什么用的呢?

  • ApkTool:是一款应用在Apk上的逆向工程的工具,它有编译、反编译、签名等功能,在这篇文章中会讲解如何利用ApkTool查看apk的xml文件、AndroidManifest.xml和图片等。
  • dex2jar:顾名思义,这款工具的作用主要是将dex文件转换成jar文件,转换成jar后我们才好借助JD-GUI来查看反编译dex后的代码;
  • JD-GUI:一款Java反编译器GUI,通过它我们能查看到反编译后的dex的代码,通常需要配合dex2jar使用;

准备工作(安装ApkTool、dex2jar、JD-GUI的具体流程)

介绍过ApkTool、dex2jar、JD-GUI 的作用后,接下来我们做一些反编译前的准备工作,首先呢我们需要安装ApkTool。

ApkTool

下载ApkTool

大家可以从https://ibotpeaches.github.io/Apktool/install/上下载ApkTool,也可以下载我为大家准备好的ApkTool、dex2jar、JD-GUI

安装ApkTool

  1. 将下载好的apktool文件与apktool_2.3.1.jar文件准备好,并将apktool_2.3.1.jar更名为apktool.jar
  2. apktool.jarapktool移动到/usr/local/bin目录下(可以通过在终端中输出命令open /usr/local/bin来打开这个目录);
  3. 为上述两个文件增加可执行权限,即在终端中输入并执行:
    chmod +x apktool.jar
    chmod +x apktool
    
  4. 在终端输入apktool看是否可以运行,如果不可以需要在系统偏好设置中打开安全与隐私中点击仍要运行apktool.jar;

至此ApkTool的安装便完成了,在终端运行apktool命令会看到如下输出:

apktool

dex2jar

下载dex2jar

大家可以从https://sourceforge.net/projects/dex2jar/files/上下载dex2jar,也可以下载我为大家准备好的ApkTool、dex2jar、JD-GUI
下载后直接解压即可。

JD-GUI

下载JD-GUI

大家可以从http://jd.benow.ca/上下载JD-GUI,也可以下载我为大家准备好的ApkTool、dex2jar、JD-GUI

使用ApkTool反编译APK得到xml文件、AndroidManifest.xml和图片

cd /你存放apk的目录或在下面命令中使用xxx.apk文件的绝对路径
apktool d xxx.apk //该命令执行后会在同级目录下生成一个与你编译的apk同名的目录

通过上述命令就可以反编译apk了。

apktool d

然后在反编译后生成的目录中你会看到相关的资源文件:

apktool反编译

由于APkTool只能将资源文件提取处理,对于.dex类型的文件是无法查看的,这里就需要用到dex2jar了。

dex2jar将dex反编译成jar

第一步,解压apk获得dex文件

使用解压软件将apk进行解压:


unzip-apk.png

也可将apk文件的后缀改为.rar然后双击进行快速解压。

使用解压软件打开apk 和使用apktool反编译出的apk不同

  • 直接解压apk和使用apktool反编译apk都能获得AndroidManifest.xml,但直接解压获得的AndroidManifest.xml是乱码的,无法直接查看;
  • 直接解压apk获得res资源文件是不包含resources.arsc部分的,而使用apktool反编译出来的res是包含的;
apktool-unzip.png

从上图中可以看到有2个classes.dex文件(这是因为应用了MultiDex所致)这就是项目的源码 将这个两个文件拷贝到下载解压的dex2jar目录下:

classes.dex.png

然后执行如下代码进行反编译:

cd /你的dex2jar解压目录 也就是上面图中存放class.dex文件的目录
sh d2j-dex2jar.sh classes.dex
sh d2j-dex2jar.sh classes2.dex

通过上述命令会得到两个.jar文件:


classes-dex2jar.jar

使用JD-GUI查看反编译后的程序源码

将dex转换成jar之后接下来我们就可以使用JD-GUI来查看反编译后的程序源码了:

操作步骤很简单,只需双击运行jd-gui-1.4.0.jar,然后将classes-dex2jar.jar拖拽到JD-GUI界面上即可:

jd-gui

FAQ

Permission denied d2j_invoke.sh

为d2j_invoke.sh增加权限:

sudo chmod +x d2j_invoke.sh //sudo chmod +取消权限

Exception in thread "main" brut.androlib.AndrolibException: Could not decode arsc file

Apktool的bug使用其他版本的Apktool,我在使用apktool_2.3.3.jar中遇到了这个问题,使用如apktool_2.3.1.jar是好的,如果你也遇到了这个问题不妨换个Apktool版本试一下。

Exception in thread "main"

参考

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容