Android APK反编译(一)
apk是安卓工程打包的最终形式,将apk安装到手机或者模拟器上就可以使用APP。反编译apk则是将该安卓工程的源码、资源文件等内容破解出来进行分析。
一、APK反编译基本原理
1.APK分析
apk文件的本质是压缩文件,我们将apk文件修改后缀名为zip或者rar等,可以直接解压缩查看apk文件夹。下图即为一个基本的apk文件夹结构图。

我们简要看下每个文件夹和文件里都有什么内容:
- assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的图片、txt、css等资源文件。
- lib:存放应用需要的引用第三方SDK的so库。比如一些底层实现的图片处理、音视频处理、数据加密的库等。而该文件夹下有时会多一个层级,这是根据不同CPU 型号而划分的,如 ARM,ARM-v7a,x86等。
- META-INF:保存apk签名信息,保证apk的完整性和安全性。
- res:资源文件夹,其中的资源文件包括了布局(layout),常量值(values),颜色值(colors),尺寸值(dimens),字符串(strings),自定义样式(styles)等。
- AndroidManifest.xml文件:全局配置文件,里面包含了版本信息、activity、broadcasts等基本配置。不过这里的是二进制的xml文件,无法直接查看,需要反编译后才能查看。
- classes.dex文件:这是安卓代码的核心部分,,dex是在Dalvik虚拟机上可以执行的文件。这里有classes.dex和classes2.dex两个文件,说明工程的方法数较多,进行了dex拆分。
- resources.arsc文件:记录资源文件和资源id的映射关系。
直接查看apk压缩文件,只有assets可以直接查看,我们可以校验其中是否已加入必需的资源文件。但是对于版本的基本情况、所需的JAR包等都是无法直接查看的,需要进行apk反编译处理。了解apk的反编译原理,需要从apk打包原理讲起。
2.从APK打包讲起
使用IDE进行安卓开发,便捷的打包调试使得打包的很多细节都忽略了,安卓官网给出了apk打包的基本流程图,图中红框是我对打包流程几个主要模块的划分:

我们从中梳理出apk打包的基本流程模块如下:
- 资源处理
这一过程中主要使用appt工具进行资源文件的处理,分析AndroidManifest.xml中的资源文件,生成R.java和resources.arsc文件;aidl工具负责处理aidl文件,生成对应的java接口文件。
- 代码编译
将上一过程中产生的R.java、java接口文件以及工程源代码一起通过Java Compiler编译成.class文件,打成Jar包(这部分可以加入代码混淆),然后与第三方库的Jar包一起通过dx工具转换成.dex文件。
通过apkbuilder工具将aapt生成的resources.arsc、classes.dex(可能多个)、其他的资源一块打包生成未经签名的apk文件。
- 添加签名
通过Jarsigner对生成的未签名的apk进行签名。
再通过zipalign对签名后的apk进行对其处理,使apk中所有资源文件距离文件起始偏移为4字节的整数倍,从而在通过内存映射访问apk文件时会更快。
3.APK反编译原理
通过回顾apk的打包原理,反编译要做的事情也就明了了。反编译要做的,一是要将apk里的dex文件转换成Jar包,再通过工具查看编译前的java源文件。二是通过工具查看apk里对应的AndroidManifest.xml、resources.arsc、res各布局文件等二进制文件。反编译所需要的工具主要有以下几个:
- dex2jar:将dex文件转换成Jar包 Mac下载地址
- jd-gui:将Jar包文件反编译成java源文件 Mac下载地址
- apktool:查看二进制文件 Mac下载地址
Android APK反编译(一)的更多相关文章
- Android apk反编译基础(apktoos)图文教程
本文主要介绍了Android apk反编译基础,使用的工具是apktoos,我们将用图文的方式说明apktoos工具的使用方式,你可以参考这个方法反编译其它APK试试看了 很久有写过一个广工图书馆主页 ...
- 【转】Android APK反编译就这么简单 详解(附图)
转载地址:http://blog.csdn.net/vipzjyno1/article/details/21039349 在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂 ...
- Android APK反编译详解(附图)
转载自http://blog.csdn.net/sunboy_2050/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而 ...
- Android APK反编译easy 详解
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- Android APK反编译就这么简单 详解(附图)
在学习Android开发的过程你,你往往会去借鉴别人的应用是怎么开发的,那些漂亮的动画和精致的布局可能会让你爱不释手,作为一个开发者,你可能会很想知道这些效果界面是怎么去实现的,这时,你便可以对改应用 ...
- Android APK反编译详解(附图)(转)
这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧,google了一下,确实很简单,以下是我的实践过程. 在此郑重声明,贴出来的目的不是为了去破解人家的软件, ...
- (转)Android APK反编译详解
转载地址:http://blog.csdn.net/ithomer/article/details/6727581 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到 ...
- Android APK反编译具体解释(附图)
这段时间在学Android应用开发,在想既然是用Java开发的应该非常好反编译从而得到源码吧,google了一下,确实非常easy,下面是我的实践过程. 在此郑重声明,贴出来的目的不是为了去破解人家的 ...
- Android APK反编译详解(非常有用)
如何学习最快呢?无疑是通过研究别人的源代码? 但是,获取别人的源代码,比较困难.本文,仅限于用于学习开发. 这段时间在学Android应用开发,在想既然是用Java开发的应该很好反编译从而得到源代码吧 ...
- Android APK反编译就这么简单 详细解释(简介)
学习Android开发过程,你会向别人学习如何应用软件的开发,那些漂亮的动画和复杂的布局可能让你爱不释手,作为开发者.你可能真的想知道的是如何实现的界面效果.然后.您将能够更改应用程序APK反编译查看 ...
随机推荐
- letCode-2
letCode第二题题目如下: 给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则 ...
- bat中errorlevel与%errorlevel%的区别
bat中errorlevel与%errorlevel%的区别? 他们都是判断上个命令的返回值.当使用if errorlevel 值 cmmand 句式时,它的含义是:如果返回的错误码值大于或等于值 的 ...
- alias-unalias
一.用一条命令完成创建目录/data/test,即在/目录下创建/data目录,及其子目录/data/test 解答:mkdir -p /data/test 实践过程: 二.已知/tmp目录下已经存在 ...
- oracle累积求和分析函数sum over的使用
oracle sum()over函数的使用 over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()等一起使用. over函数的参数:over(partit ...
- Java通过URL 从web服务端获取数据
1.Java 通过HttpURLConnection Post方式提交json,并从服务端返回json数据 package Demo.Test; import java.io.ByteArrayOut ...
- leetcode题解 1.TwoSum
1. Two Sum Given an array of integers, return indices of the two numbers such that they add up to a ...
- 剑指Offer 47. 求1+2+3+...+n (其他)
题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 题目地址 https://www.nowcod ...
- SignalTap导致PCIe Read/Write卡死
/********************************************************************** * SignalTap导致PCIe Read/Write ...
- 作用域&&闭包
在了解闭包之前,先了解作用域一,作用域简单来说就是变量和函数可以访问的范围,在es5中变量作用域一般分为全局作用域和局部作用域,这个主要依据是全局变量还是局部变量 情景1: <script> ...
- macbook hive安装
1 原材料 1.1 已经安装好的伪分布式hadoop,版本2.8.3(参见链接https://www.cnblogs.com/wooluwalker/p/9128859.html) 1.2 apach ...