zoukankan      html  css  js  c++  java
  • Android APK反编译详解

    使用工具:

         CSDN上下载地址:

           apktool (资源文件获取  下载  

           dex2jar(源码文件获取) 下载

           jd-gui  (源码查看) 下载

           Android反编译整合工具包(最新) 下载

         官方最新版本下载地址:

           apktool(google code)

      dex2jar(google code)  

       jd-gui(google code)最新版请见官方


    工具介绍:

    apktool  

         作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看

    dex2jar

         作用:将apk反编译成java源码(classes.dex转化成jar文件)

    jd-gui

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


    1.     APK的内部结构

    APK的全称是AndroidPackage,它是Android安装包。APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解 压后,可以看到Dex文件,Dex是Dalvik VM executes的全称,即Android Dalvik执行程序,并非Java ME的字节码而是Dalvik字节码。

    下面以HelloWorld为例讲解Android应用程序的文件结构及打包过程。

    1.1    Android应用程序文件结构

    现在编写一个HelloWorld应用程序已经变得非常简单的,在eclipse集成开发环境中只需要点击下一步基本就可以完成此应用程序。图1.1即为由eclipse集成开发环境生成的HelloWorld应用程序的文件结构图。

    图1.1  HelloWorld文件结构图

    其中,

    Src  java源文件目录

    Gen  自动生成的目录,其中包括了著名的R.java

    Android 2.3.3  该应用程序依赖的android SDK包。

    Assets  存放原生文件,这个目录保存的文件可以打包在程序里。和res的不同点是,android不为assets下的文件生成ID,如果使用assets下的文件,需要指定文件的路径和文件名。

    Bin  Java编译输出的路径

    Res  存放程序所需要的资源文件,也就是非Java的文件。常见的目录有,

    (1)res/animator/ :XML文件,定义动画属性

    (2)res/anim/ :XML文件,它们被编译进逐帧动画(frame by frame animation)或补间动画(tweened animation)对象

    (3)res/color/:XML文件,定义颜色状态的列表

    (4)res/layout/:存放被编译为屏幕布局(或屏幕的一部分)的XML文件

    (5)res/menu/:XML文件,用来定义应用的菜单

    (6)res/drawable/:存放图片文件,如.png, .jpg, .gif等。放在这里的图像资源可能会被aapt(android assert packaging tool,android资源打包工具)自动地进行无损压缩优化。如果你不想图片被压缩改变,请把图像文件放在 res/raw/目录下,这样可以避免被自动优化。

    (7)res/raw/:直接复制到设备中的任意文件,它们无需编译

    (8)res/values/:存放可以被编译成很多种类型的资源文件, XML 格式的。常见的文件有:

    array.xml :定义数组

    colors.xml :定义color drawable和颜色的字符串值。

    dimens.xml : 定义尺寸值(dimension value)。

    strings.xml :定义字符串(string)值。

    styles.xml:定义样式(style)对象。

    (9)res/xml/:任意的XML文件,在运行时可通过调用Resources.getXML()读取。

    AndroidManifest.xml

    这个清单给Android系统提供了关于这个应用程序的基本信息,系统在运行任何程序代码之前必须知些信息。AndroidManifest.xml主要包含以下功能:

    (1)命名应用程序的 Java 包,这个包名用来唯一标识应用程序

    (2)描述应用程序的组件:活动,服务,广播接收者,以及组成应用程序的内容提供器;对实现每个组件和公布其能力(比如,能处理哪些意图消息)的类进行命名。这些声明使得 Android系统了解这些组件以及在什么条件下可以被启动;

    (3)决定应用程序组件运行在哪个进程里面

    (4)声明应用程序所必须具备的权限,用以访问受保护的部分 API,以及和其它应用程序交互;

    (5)声明应用程序其他的必备权限,用以组件之间的交互;

    (6)列举测试设备Instrumentation类,用来提供应用程序运行时所需的环境配置和其他信息,这些声明只是在开发和测试阶段存在,发布前将被删除

    (7) 声明应用程序所要求的Android API的最低版本级别;

    (8)列举application所需要链接的库

    Proguard-project.txt

    Android代码混淆器,用于加大反编译的难度。详细描述请见

    http://developer.android.com/tools/help/proguard.html

    Project.properties

    定义一些项目的基本属性。

    1.2    打包过程

    图1.2为Android应用程序打包流程图。从图中我们可以看到,

    a.       Java源文件通过javac编译成class, 然后class通过dx.bat生成虚拟机运行的二进制程序。

    b.      资源文件通过appt打包。

    c.       打包好的源文件及资源文件通过apkbuilder生成未签名的APK。

    d.      通过keytool生成key

    e.       Jarsigner为未签名的APK生成签名。

    至此,整个APK打包过程已经完成。

    2.     APK的反汇编流程

    想要探究APK内部结构,就不得不对其进行逆向工程了。图2.1为Android应用程序逆向工程流程图。正如本文开头所述,APK文件其实是 zip格式,因此可以直接通过unzip工具进行解压。解压后主要包含资源文件及dex,注意这些资源文件都是压缩过的,需要通过特殊工具解析才可使用。

    从图2.1我们可以看到,实际上可以通过apktool + dex2jar + xjad/JD-GUI实现对APK的逆向工程。下面我们就一一讲解各项工具的使用方法, 解开APK的今生之谜。

    图2.1 Android应用程序逆向工程流程图

    2.1    APK的内部结构

    APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以得到APK文件结构。

    2.2    APK的逆向工程

    下面我们就开始激动人心的APK逆向工程吧。

    1.2.1        资源文件

    如果直接解压APK文件,那么对应的资源文件都是经过某种格式压缩过的。因此我们需要一些工具来解析这些文件。Apktool是一个非常棒的解析资源文件的工具,实际上它还可以将dex文件转换成smoli格式的文件。

    Ø  Apktool

    官网: http://code.google.com/p/android-apktool/

    在apktool官网上,有两个包需要下载,如果在windows上反编译,下载apktool-install-windows-xx.tar.bz2apktoolxx.tar.bz2即可。如果在linux上反编译,则下载apktool-install-linux-xx.tar.bz2apktoolxx.tar.bz2

    apktool运行格式:

    apktool d xxx.apk output  反编译xxx.apl到文件夹output

    apktool b output  从文件夹output重构apk,输出到output/dist/out.apk

    反编译之后的文件如下所示。其中xml文件都已经成功反编译,而dex文件被反编译成smali格式。这种语法很难读懂,我们可以通过其他工具来反编译dex文件。在apktool的官网上,我们看到有如果通过smali来debug apk。看上去还有点意思。http://code.google.com/p/android-apktool/wiki/SmaliDebugging

    1.2.2        可执行文件

    经过unzip解压之后的APK会生成一个class.dex文件。

    Ø  dex2jar

    官网:https://code.google.com/p/dex2jar/

    运行 dex2jar.bat  classes.dex

    生成 classes_dex2jar.jar

    Ø  JD-GUI

    官网:http://java.decompiler.free.fr/?q=jdgui

    用JD-GUI打开dex2jar生成的classes_dex2jar.jar后,就可以看到java源文件啦。如下图所示。

    Ø  Apkdb

    官网:http://code.google.com/p/android-apkdb/

    Android APK+Dex文件反编译及回编译工具》简称:APKDB。是一款,针对Android OS系统APK程序,直接反编译修改的工具。APKDB集合了当今最强悍,最犀利的APKDex文件编译工具;正常安装后,它直接在【鼠标右键】创建快捷菜单;非常方便汉化工作者,对APKDex文件进行简易的反编译回编译操作。

    反编译流程:

    一、apk反编译得到程序的源代码、图片、XML配置、语言资源等文件

    下载上述工具中的apktool,解压得到3个文件:aapt.exeapktool.batapktool.jar ,将需要反编译的APK文件放到该目录下,

    打开命令行界面(运行-CMD) ,定位到apktool文件夹,输入以下命令:apktool.bat d -f  test.apk  test    


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

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

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


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

    build

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


    Apk反编译得到Java源代码

    下载上述工具中的dex2jar和jd-gui ,解压

    将要反编译的APK后缀名改为.rar或则 .zip,并解压,得到其中的额classes.dex文件(它就是java文件编译再通过dx工具打包而成的),将获取到的classes.dex放到之前解压出来的工具dex2jar-0.0.9.15 文件夹内,

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

    在改目录下会生成一个classes_dex2jar.jar的文件,然后打开工具jd-gui文件夹里的jd-gui.exe,之后用该工具打开之前生成的classes_dex2jar.jar文件,便可以看到源码了,效果如下:

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



    三、 图形化反编译apk(本人未使用过)

    上述步骤一、二讲述了命令行反编译apk,现在提供一种图形化反编译工具:Androidfby

    首先,下载上述反编译工具包,打开Androidfby目录,双击Android反编译工具.exe,就可以浏览打开要反编译的apk


    通过反编译,你可以获知该应用用到了什么第3方的库文件,它的代码是如何编写的等等。

    然而,如果该APK进行了混淆处理,那么你看到的类文件名称以及里面的方法名称都会以a,b,c....之类的样式命名,所以你可以想找到你所想得知的界面代码可能会十分费劲,找到了代码可能看起来也会很费劲,可是一个大体的思路会获得,有了这个思路,你就可以自己去尝试了。

    本人曾经想写一个类似唱吧的名人界面布局,可是当初第一次接触不知道如何去写,进进行了反编译,即使他的那个代码是混淆过的,我也看出来他是通过LISTVIEW的TYPE设定不同的ITEM布局实现了。可能好多引用都是采用重写VIEW来实现效果,你可以得到他的大体思路对你的开发有益无害。


    反编译失败报错:

    1 Exception in thread main brut.androlib.androlibexception multiple resources

    解决办法:下载最新的apktool,在google官网上。测试,如果未成功采取第二种方法

    2 Exception in thread main org.jf.dexlib.util.exceptionwithcontext index

    在cmd命令行,反编译的命令改为apktool.bat d -s即可。其他相同,-s代表只反编译xml文件。

  • 相关阅读:
    微信支付授权目录填写规则
    前后端分离之vue2.0+webpack2 实战项目 -- html模板拼接
    前后端分离之vue2.0+webpack2 实战项目 -- webpack介绍
    windows下nginx的安装及使用方法入门
    抛弃vue-resource拥抱axios
    Eslint检测出的问题如何自动修复
    用webpack2.0构建vue2.0单文件组件超级详细精简实例
    SQLAlchemy 教程 —— 基础入门篇
    Linux下python2.7安装pip
    python 创建虚拟环境(virtualenv)
  • 原文地址:https://www.cnblogs.com/jasonxcj/p/4775654.html
Copyright © 2011-2022 走看看