zoukankan      html  css  js  c++  java
  • apk反编译

    Android反编译技术总结

    一、Apk反编译工具及其使用方法

    1.原理

    学习反编译之前,建议先学习一下Apk打包的过程,明白打包完成后的Apk里面都有什么文件,各种文件都是怎么生成的。

    这里有两篇AndroidWeekly中推荐过的好文章:

    Apk技术也有非常多的技术可以学习,主要都是围绕着如何减小体积,如何提高打包速度展开,这里先不多说了。下面是一张基本的Apk文件结构图。

    APK文件结构

    Apk文件本质上其实是一个zip包。直接拿解压工具解压就可以看到其中包含了什么。下面简单介绍一下Apk文件的结构。

    • AndroidManifest.xml:应用的全局配置文件
    • assets文件夹:原始资源文件夹,对应着Android工程的assets文件夹,一般用于存放原始的网页、音频等等,与res文件夹的区别这里不再赘述,可以参考上面介绍的两篇文章。
    • classes.dex:源代码编译成class后,转成jar,再压缩成dex文件,dex是可以直接在Android虚拟机上运行的文件。
    • lib文件夹:引用的第三方sdk的so文件。
    • META-INF文件夹:Apk签名文件。
    • res文件夹:资源文件,包括了布局、图片等等。
    • resources.arsc:记录资源文件和资源id的映射关系。

    上面的截图中每个文件都是一个最基本的Apk 文件应该包含在内的。但是直接把Apk当做zip解压后的这些文件是没法直接阅读的,毕竟他们都是经过了build-tools打包工具处理过的。我们直接用文本编辑器打开这里面的Manifest文件看看。

    反编译前的Manifest文件

    反编译Apk的目的就是Apk拆成我们可以阅读的文件。通过反编译,我们一般想要得到里面的AndroidManifest.xml文件res文件java代码

    2.Apk反编译步骤

    (1) ApkTool拆包,得到AndroidManifest和res等资源文件

    工具下载地址:https://bitbucket.org/iBotPeaches/apktool/downloads

    功能:拆解Apk文件,反编译其中的资源文件,将它们反编译为可阅读的AndroidManifest.xml文件res文件。前面讲过,直接把Apk文件当做zip解压,得到的xml资源文件,都是无法直接用文本编辑器打开阅读的,因为它们在打包时经过了build-tools的处理。

    用法:官网https://ibotpeaches.github.io/Apktool/documentation/有介绍,最新版本是2.2.0,运行环境需要jre1.7

    这里,我演示一下用apktool来拆解Apk文件的基本方法,只需要在终端里面执行下面的命令。

    java -jar apktool.jar d yourApkFile.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解码成具体的资源文件)
    

    下面我们看一下java -jar apktool.jar d yourApkFile.apk拆解后的结果:

    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脚本,方法见:https://ibotpeaches.github.io/Apktool/install/

    note2:如果你在编译的时候,发现终端里面提示发生了brut.android.UndefinedResObject错误,说明你的apktool.jar版本太低了,需要去下载新版工具了。

    note3:如果想要自己实现一个解析Apk文件,提取版本、权限信息的java服务时,可以引用apktool.jar中的ApkDecoder,调用decode方法来实现。可以看下图中,apktool.jar里面有解析Apk文件的实现。

    apktool.jar

    (2) dex2jar反编译dex文件,得到java源代码

    上一步中,我们得到了反编译后的资源文件,这一步我们还想看java源代码。这里要用的工具就是dex2jar

    工具下载地址:https://sourceforge.net/projects/dex2jar/

    功能:将dex格式的文件,转换成jar文件。dex文件时Android虚拟机上面可以执行的文件,jar文件大家都是知道,其实就是java的class文件。在官网有详细介绍。

    用法:打开下载的dex2jar-2.0文件夹,里面有shell和bat脚本,进入终端,就可以在命令行使用了。

    d2j-dex2jar classes.dex
    // 获取classes.dex文件在最前面说过,只要把Apk当做zip解压出来,里面就有dex文件了
    // 或者用apktool反编译时带上 `-s` 参数
    

    运行后,可以看到classes.dex已经变成了classes-dex2jar.jar

    进入dex2jar文件夹

    note1:第一次下载下来后,在mac里运行的时候可能会提示需要管理员的权限,这里我给这些sh脚本chmod 777后,即可运行它。

    root执行dex2jar

    note2:写完这一节的时候,我发现把dex转换成jar已经有了更好的工具enjarifyhttps://github.com/google/enjarify这个工具是谷歌官方开源的用于反编译dex文件的。使用方法和dex2jar差不多,也是简单的命令行操作。这个工具的主页中也提到dex2jar已经是一个比较老的工具,在遇到混淆等等复杂的情况时,可能无法正常工作。所以这里推荐大家使用enjarify这个工具。

    (3) jd-gui查看java源代码

    工具下载地址:官网http://jd.benow.ca/上选择自己所需要的版本。

    功能:这个工具不用多说,写java的人都知道。有时候我们自己开发一个jar包给别人用,也会用它来查看class是不是都被正确的打入到了jar内,我以前介绍的gradle自定义打包jar的博客中也提到过它。

    用法:下载后双击既可以运行这个工具,直接把上一步得到的classes-dex2jar.jar拖到jd-gui程序的界面上即可打开了,效果如下图所示。

    classes-dex2jar.jar

    反编译Apk步骤小结

    反编译一个Apk,查看它的资源文件和java代码,我们需要用到3个工具。

    反编译就是用这3个工具得到AndroidManifest.xml、res、java代码等。但是我们可以看到,如果你要对一个Apk做尽可能彻底的反编译,把它扒得干干净净,这一步一步的基本操作还是稍显麻烦。另外加固过Apk的情况可能更复杂,需要我们勤动手尝试。为了能提高效率,下面我把自己见过的一些集成工具介绍给大家,尽可能实现可以一键反编译Apk。

    二、自动化工具汇总(一键反编译Apk)

    1.谷歌提供的工具:android-classyshark

    下载地址:https://github.com/google/android-classyshark/releases,下载下来之后是一个可执行的jar文件,win下或者mac下都只要双击即可运行。

    功能:带有界面,一键反编译Apk工具,直接打开Apk文件,就可以看到Apk中所有的文件结构,甚至还集成了dex文件查看,java代码查看,方法数分析、导入混淆mapping文件等一系列工具。谷歌推出这个工具的目的是为了让我们开发者更清楚的了解自己的Apk中都有什么文件、混淆前后有什么变化,并方便我们进一步优化自己的Apk打包实现。下面带上几张截图,真是帅气的一笔的好工具啊!

    dex文件查看

    方法数分析

    即将到来的Android Studio 2.2中集成了一个叫做APK Analyzer的功能,这个功能不知道是不是和这个工具有关系呢,本人还没有尝试过2.2版本,有兴趣的朋友可以体验一下preview版本

    2.Python实现的工具:AndroidGuard

    下载地址:https://github.com/androguard/androguard/releases

    功能:集成了反编译资源、代码等各种文件的工具包。需要安装Python环境来运行这个工具,这个工具按照不同的反编译需求,分别写成了不同的py功能模块,还有静态分析的功能。所以如果想要用Python开发一个解析Apk文件并进行静态扫描分析的服务,可以引用这个工具来实现。

    用法:具体用法比较多,这里也不再展开了。可以通过工具内置的-h帮助指令查看各个模块的功能。

    unclechendeiMac:androguard-2.0 unclechen$ python androaxml.py -h
    Usage: androaxml.py [options]
    
    Options:
      -h, --help            show this help message and exit
      -i INPUT, --input=INPUT
                            filename input (APK or android's binary xml)
      -o OUTPUT, --output=OUTPUT
                            filename output of the xml
      -v, --version         version of the API
    
    // androaxml.py这个模块是用来解析AndroidManifest文件的,`-i` 表示输入的apk文件,`-o` 表示输出xml文件。
    
    

    3.Mac专属工具:Android-Crack-Tool

    功能:这是网上一位名为Jermic的大神开发的、在Mac环境下使用的App,集成了Android开发中常见的一些编译/反编译工具,方便用户对Apk进行逆向分析,提供Apk信息查看功能。工具的截图如下所示,非常强大。

    Android-Crack-Tool.app

    4.手机上的反编译工具:ApkParser

    功能:在电脑上已经有了这么多的工具,在手机上的也有很方便的工具。APKParser是一款在查看手机上已经安装的Apk的信息的工具,他可以查看软件的AndroidManifest.xml文件、方法数、res资源文件,并在手机上直接展示出来。个人觉得这是一个非常实用的工具,作为开发者,手机里面必须要有它。

    ApkParser

    5.工具汇总

    以上几款工具都是我体验过、感觉不错的集成工具,推荐给大家。临近本文结束前,又发现了这么一个福利网站-http://www.androiddevtools.cn/,其中有一章专门总结了各种Apk反编译的工具。相信有了这么多的利器,大家应该有100种方法将一个App扒得干干净净了。

    Apk反编译工具汇总

  • 相关阅读:
    【SQL Server】数据库是单个用户的 无法顺利进行操作 怎么解决
    【java 断点续传】
    【SQL 触发器】
    【SQL 数据库】将一张数据表信息复制到另一张数据表
    【java 获取数据库信息】获取MySQL或其他数据库的详细信息
    【zTree】 zTree使用的 小例子
    【前台 ajax】web项目前台传递数组给后台 两种方式
    【POI xls Java map】使用POI处理xls 抽取出异常信息 --java1.8Group by ---map迭代 -- 设置单元格高度
    Linux 在VMware中搭建CentOS6.5虚拟机
    HTML5 Canvas实现360度全景图
  • 原文地址:https://www.cnblogs.com/cuiyubo/p/6721397.html
Copyright © 2011-2022 走看看