`
George_ghc
  • 浏览: 93815 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

反编译APK文件的三种方法

阅读更多
【转】http://android.tgbus.com/Android/tutorial/201103/346338.shtml

因为学习Android编程的需要,有时我们需要对网络上发布的应用项目进行学习,可是Android项目一般是通过APK文件进行发布的,我们看不到源代码,嘿嘿,办法总会有的,而且不止一个...

   ps:对于软件开发人员来说,保护代码安全也是比较重要的因素之一,不过目前来说Google Android平台选择了Java Dalvik VM的方式使其程序很容易破解和被修改,首先APK文件其实就是一个MIME为ZIP的压缩包,我们修改ZIP后缀名方式可以看到内部的文件结构,类似Sun JavaMe的Jar压缩格式一样,不过比较去别的是Android上的二进制代码被编译成为Dex的字节码,所有的Java文件最终会编译进该文件中去,作为托管代码既然虚拟机可以识别,那么我们就可以很轻松的反编译。所有的类调用、涉及到的方法都在里面体现到,至于逻辑的执行可以通过实时调试的方法来查看,当然这需要借助一些我们自己编写的跟踪程序。Google最然在Android Market上设置了权限保护app-private文件夹的安全,但是最终我们使用修改定值的系统仍然可以获取到需要的文件。

一、dexdump方法

      dexdump是emulator自带提供的查看dex文件的工具,可使用类似这样的命令将dex文件dump到txt文件中:

      D:\Program Files\android-sdk-windows-1.6_r1\platforms\android-1.6\tools>dexdump.exe -d classes.dex > spk.dump.txt

     得到的文件内容,描述了类的信息,但实在是不好读啊~~~~

二、dex2jar + XJad 方法

     该方法是使用dex2jar.jar包,将classes.dex文件解包成jar,在通过XJad(或者其他class反编译工具)进行java反编译。如:

     1、dex2jar.bat d:\play\classes.dex

          默认的输出路径同classes.dex,生成的文件名为classes.dex.dex2jar.jar

     2、使用XJad反编译该jar包

          之后的使用方法,大家都懂的:)

     该方法的好处在于,通过XJad反编译后,大家可直接开到java源文件,缺点在于只能反编译出开发时的java文件,而开发时使用的lib包不能反编译出来。

三、AXMLPrinter2.jar + baksmali.jar + smali.jar 方法

      这个方法就强大了,AXMLPrinter2是还原AndroidManifest.xml和main.xml的工具,直接打开这两个xml文件是乱码,而通过还原之后,可以很明白的看到里面的内容(我猜测还是使用了字节异或的方式加的密)。

      baksmali.jar是反解析dex的工具,smali.jar则是再还原成dex的工具

      操作方式如下:

     1、java -jar AXMLPrinter2.jar D:\play\AndroidManifest.xml > AndroidManifest.txt

     2、java -jar AXMLPrinter2.jar D:\play\res\layout\main.xml > main.txt

     3、java -jar baksmali-1.2.5.jar -o classout/ d:\play\classes.dex

      baksmali可解析(注意,是解析,不是反编译)原java包以及引用的lib包,解析出的文件认真看还是能看懂,比如以下片段:

view plaincopy to clipboardprint?
.class Lcom/paul/test/a;  
.super Landroid/view/View;  
 
# static fields  
.field private static final a:Landroid/graphics/Typeface;  
 
# instance fields  
.field private b:I  
.field private c:I  
.field private d:Z  
.field private e:J  
.field private f:I  
.field private l:[Ljava/lang/String;  
 
# direct methods  
.method static constructor <clinit>()V  
    .registers 2 
    sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;  
    const/4 v1, 0x0 
    invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;  
    move-result-object v0  
    sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;  
    return-void 
.end method  
#  
# other methods ..........  
#  
# virtual methods  
.method public onKeyUp(ILandroid/view/KeyEvent;)Z  
    .registers 4 
    const/16 v0, 0x42 
    if-eq p1, v0, :cond_8  
    const/16 v0, 0x17 
    if-ne p1, v0, :cond_b  
    :cond_8  
    invoke-direct {p0}, Lcom/paul/test/a;->d()V  
    :cond_b  
    const/4 v0, 0x0 
    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V  
    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z  
    move-result v0  
    return v0  
.end method 
.class Lcom/paul/test/a;
.super Landroid/view/View;

# static fields
.field private static final a:Landroid/graphics/Typeface;

# instance fields
.field private b:I
.field private c:I
.field private d:Z
.field private e:J
.field private f:I
.field private l:[Ljava/lang/String;

# direct methods
.method static constructor <clinit>()V
    .registers 2
    sget-object v0, Landroid/graphics/Typeface;->SANS_SERIF:Landroid/graphics/Typeface;
    const/4 v1, 0x0
    invoke-static {v0, v1}, Landroid/graphics/Typeface;->create(Landroid/graphics/Typeface;I)Landroid/graphics/Typeface;
    move-result-object v0
    sput-object v0, Lcom/wiyun/ad/a;->a:Landroid/graphics/Typeface;
    return-void
.end method
#
# other methods ..........
#
# virtual methods
.method public onKeyUp(ILandroid/view/KeyEvent;)Z
    .registers 4
    const/16 v0, 0x42
    if-eq p1, v0, :cond_8
    const/16 v0, 0x17
    if-ne p1, v0, :cond_b
    :cond_8
    invoke-direct {p0}, Lcom/paul/test/a;->d()V
    :cond_b
    const/4 v0, 0x0
    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V
    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z
    move-result v0
    return v0
.end method


认真一看,就知道:

# static fields             定义静态变量的标记

# instance fields        定义实例变量的标记

# direct methods       定义静态方法的标记

# virtual methods      定义非静态方法的标记



以onKeyUp方法为例,其中定义了处理逻辑,if-eq p1, v0, :cond_8 表示如果p1和v0相等,则执行cond_8的流程:

    :cond_8
    invoke-direct {p0}, Lcom/paul/test/a;->d()V

调用com.paul.test.a的d()方法

不相等: if-ne p1, v0, :cond_b 则执行cond_b的流程:

    :cond_b
    const/4 v0, 0x0

    invoke-virtual {p0, v0}, Lcom/paul/test/a;->setPressed(Z)V

    invoke-super {p0, p1, p2}, Landroid/view/View;->onKeyUp(ILandroid/view/KeyEvent;)Z

    move-result v0



大概意思就是调用com.paul.test.a的setPressed方法,然后再调用父类View的onKeyUp方法

最后 return v0

      该方法,能把外部引用的lib包类也解析出来,能开到包的全貌。缺点在于,解析出的smali文件并不是反编译出的java文件,可读性降低了,但仔细研究也能看出大概。

对应工具下载地址:
http://download.csdn.net/detail/hcgeng/6811069
分享到:
评论

相关推荐

    一键反编译apk文件

    标题中的“一键反编译apk文件”指的是使用特定的工具或程序来快速、简便地对Android应用程序(APK)进行反编译。APK文件是Android系统中用于分发和安装应用的打包格式,通常包含Java字节码、资源文件(如XML布局、...

    Android反编译apk到java源码的方法[收集].pdf

    Android反编译apk到java源码的方法可以分为两大类:第一类是使用apktool工具反编译apk文件,获取xml文件信息和资源图片;第二类是使用dex2jar和JD-GUI工具反编译dex文件,获取java源代码。 一、使用apktool工具反...

    反编译google android apk文件的方法

    反编译Google Android APK文件的方法 Android APK 文件是 Android 操作系统中的一种应用程序安装包格式,它包含了应用程序的代码、资源和配置文件等。反编译 APK 文件可以获取应用程序的源代码、图片、XML 配置、...

    反编译apk文件工具及使用方法

    反编译Apk得到Java源代码 转载自:http://hi.baidu.com/%CB%BF%D4%B5%CC%EC%CF%C2/blog/item/2284e2debafc541e495403ec.html 工具下载:需用到dex2jar和JD-GUI这2个工具 dex2jar下载地址:...

    一键反编译APK文件

    总的来说,"一键反编译APK文件"是一种强大的技术,它揭示了Android应用的内部运作,帮助我们理解、改进甚至保护这些应用。然而,使用这类工具时必须尊重版权法和道德规范,避免非法入侵或滥用。

    反编译APK文件

    总结,反编译APK文件是一种深入了解应用程序内部工作原理的技术,通常用于学习、调试和安全分析。使用dex2jar和JD-GUI能帮助我们从二进制DEX文件中获取Java源代码的近似表示,尽管可能不如原始代码清晰,但对于理解...

    批量反编译apk

    "批量反编译apk"是一项技术,允许开发者或安全研究人员分析已有的APK文件,以理解其工作原理、提取资源或查找潜在的安全漏洞。这个过程涉及到将APK文件解构为源代码和其他组件,以便于研究或修改。 批量反编译APK的...

    反编译Apk得到Java源代码

    2. 打开命令窗口,输入apktool d C:\*.apk C:\*文件夹,反编译apk文件。 3. 打开C:\*文件夹,就可以得到我们学院的各种资源了。 在这个过程中,apktool工具将apk文件反编译成各种资源,包括源代码、图片、XML配置、...

    反编译apk(一键反编译)

    2. 将apk文件放到onekey-decompile-apk目录下 3. 将apk文件拖拽到_onekey-decompile-apk.bat上 4. 执行完成后 会在onekey-decompile-apk目录下生成和apk同名的目录(放置了apktools反编译出来的东西) 会在onekey-...

    反编译apk tool

    在Android应用开发领域,反编译技术是一种常用的方法,用于理解、分析或修改APK文件中的代码和资源。本文将详细介绍使用"apktool"、"dex2jar"和"jd-gui.exe"这三个工具进行反编译的过程。 首先,我们要了解的是APK...

    一键反编译apk工具

    "一键反编译apk工具"就是这样一种实用工具,它简化了通常繁琐的反编译过程,通过bat命令行脚本实现自动化操作。下面将详细介绍这个工具及其相关知识点。 1. APK 文件结构:APK是Android应用的打包格式,包含.dex...

    反编译apk神器

    "反编译apk神器"是一个工具,用于解析和提取APK文件中的内容,帮助开发者或者逆向工程师理解应用的工作原理,或者进行二次开发。下面我们将详细探讨反编译APK的相关知识点。 首先,我们要知道什么是反编译。反编译...

    u3d_apk反编译文件展示

    反编译APK是为了查看或修改其中的内容,例如检查Unity项目中的资源、解密代码或者调试。通常,我们可以使用工具如Apktool、dex2jar和JD-GUI来完成这个过程。 1. **Apktool**:这个工具用于拆解APK,还原资源文件和...

    linux下反编译apk

    看到网上apk反编译文档很多,但很零散,本人将其一起打包,方便大家。 apk反编译说明 1. 将aapt,apktool,apktool.jar拷贝到/usr/...第三步: 使用jd-linux下的jd-gui浏览反编译的*_dex2jar.jar包(里面是*.class文件)

    apktools反编译apk文件的利器,

    APKTools是一款强大的工具,专门用于反编译APK文件,使开发者和研究人员能够查看并修改应用的原始资源和代码。本文将深入探讨apktools及其在APK反编译过程中的作用。 首先,我们要明确什么是APK文件。APK是Android...

    apk文件反编译工具

    APK文件反编译工具是Android开发者在进行应用安全性和隐私保护时不可或缺的工具。APK是Android应用程序的包文件格式,包含了应用的所有资源、代码和元数据。当开发完成并准备发布时,通常会进行代码混淆,目的是使得...

    反编译apk文件

    反编译apk文件,可直接选择apk文件打开,查看源码。 反编译apk文件,可直接选择apk文件打开,查看源码。

    apk反编译xml文件工具

    1. apktool1.3.2.tar.bz2:这是Apktool的一个旧版本,Apktool是一个流行的开源工具,用于反编译APK文件。它能够解码Dalvik字节码(DEX文件)到人类可读的Smali代码,并且可以重构和重新打包APK,包括其XML资源。...

    反编译apk工具

    反编译apk所需要的工具: apktool:获取资源文件,提取图片文件,布局文件,还有一些XML的资源文件 dex2jar:将APK反编译成Java源码(将classes.dex转化为jar文件) jd-gui:查看2中转换后的jar文件,即查看Java文件

Global site tag (gtag.js) - Google Analytics