`

反编译android部署程序

阅读更多

反编译android部署程序

 

 

key words:反编译.apk,反编译android程序

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

 

方法一: apk—>dexàjaràjava (推荐)

1.下载dex2jar,下载地址(见附件):

http://code.google.com/p/dex2jar/downloads/list 

2.下载class反编译工具jad,

下载地址(见附件):

http://www.119.xdowns.com/uploadFile/2010-8/jd-gui-0.3.3.osx.i686.zip 3.使用winrar解压缩.apk文件.我们可以看到classes.dex文件。这个就是Android虚拟机Dalvik支持的字节码文件。 

4.cmd下进入dex2jar.bat所在路径,输入dex2jar.bat D:\project\classes.dex 回车。其中D:\project\classes.dex就是你的classes.dex所在的目录。 

5.然后classes.dex同级目录下会生成一个classes.dex.dex2jar.jar文件 

6jad工具将打开这个jar文件,你就可以看到这个jar文件里面的代码了。而且可以直接保存为java文件。 

 

 

方法二:(推荐)

Apk->加密的XML->解密的XML

apk—>dexàsmali

 此外,上面操作只能得到java代码但是我们可能还需要一些XML文件,APK文件解压缩后,发现其中的XML文件都是经过处理过的,看不到源码。

下面利用Google提供的apktool来获取xml文件 

1. 下载apktool,可以去Google的官方下载(见附件),

地址:http://code.google.com/p/android-apktool/

apktool-1.0.0.tar.bz2apktool-install-windows-2.1_r01-1.zip两个包都要下。

2.解压这两个下载到的文件某个文件夹(例如E盘根目录)。 确保解压缩后得到的aapt.exe,apktool.bat,apktool.jar在同一个文件夹下。

3.将要破解的.apk文件也放入到这个文件夹中来。

4.运行CMD,用cd命令转到这几个文件所在文件夹,输入apktool,假如列出一些帮助的话就成功了(解释d为加压 第一个路径为你的apk所在的位置。第二个是要输出的位置) 
apktool d XXX.apk ABC 反编译XXX.apk到文件夹ABC (必须确保当前目录下没有ABC这个文件夹,否则会报错)

5解压后的文件夹中可以得到apkxml配置文件。是不是很熟悉呢。呵呵。

其实用这个方法会得到一个smali文件夹,进去看,用记事本打开其中的一个.smali文件,通过解读里面的信息,就可以一窥代码的全貌,就是有点费力。下面我们通过一个实例来对比一下.smali.java源代码的对照吧:

ApkInstaller.smali文件:


.class public Lcom/tutor/apkinstaller/ApkInstaller;  

.super Landroid/app/Activity;  

.source "ApkInstaller.java"  

# instance fields  

.field private apkWeb:Landroid/webkit/WebView;  

# direct methods  

.method public constructor <init>()V  

    .registers 1  

    .prologue  

    .line 8  

    invoke-direct {p0}, Landroid/app/Activity;-><init>()V  

    return-void  

.end method  

# virtual methods  

.method public onCreate(Landroid/os/Bundle;)V  

    .registers 5  

    .parameter "savedInstanceState"  

    .prologue  

    .line 13  

    invoke-super {p0, p1}, Landroid/app/Activity;->onCreate(Landroid/os/Bundle;)V  

    .line 14  

    const/high16 v2, 0x7f03  

    invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->setContentView(I)V  

    .line 15  

    const/high16 v2, 0x7f05  

    invoke-virtual {p0, v2}, Lcom/tutor/apkinstaller/ApkInstaller;->findViewById(I)Landroid/view/View;  

    move-result-object v2  

    check-cast v2, Landroid/webkit/WebView;  

    iput-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;  

    .line 16  

    iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;  

    invoke-virtual {v2}, Landroid/webkit/WebView;->getSettings()Landroid/webkit/WebSettings;  

    move-result-object v1  

    .line 17  

    .local v1, webSettings:Landroid/webkit/WebSettings;  

    const/4 v2, 0x1  

    invoke-virtual {v1, v2}, Landroid/webkit/WebSettings;->setJavaScriptEnabled(Z)V  

    .line 19  

    const-string v0, "http://frankiewei.net/apk/demos/main/index.html#home"  

    .line 20  

    .local v0, apkUrl:Ljava/lang/String;  

    iget-object v2, p0, Lcom/tutor/apkinstaller/ApkInstaller;->apkWeb:Landroid/webkit/WebView;  

    invoke-virtual {v2, v0}, Landroid/webkit/WebView;->loadUrl(Ljava/lang/String;)V  

    .line 21  

    return-void  

.end method  

 

ApkInstaller.java的源代码如下

 

package com.tutor.apkinstaller;  

import android.app.Activity;  

import android.os.Bundle;  

import android.webkit.WebSettings;  

import android.webkit.WebView;  

public class ApkInstaller extends Activity {  

     

    private WebView apkWeb;  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

       apkWeb = (WebView)findViewById(R.id.apk_web);  

       WebSettings webSettings = apkWeb.getSettings();  

       webSettings.setJavaScriptEnabled(true);  

        

       String apkUrl = "http://frankiewei.net/apk/demos/main/index.html#home";  

       apkWeb.loadUrl(apkUrl);  

    }  

}  

 

呵呵,通过两者的对比是不是有所感悟呢。的确有点麻烦。所以推荐大家采用方法一来得到java代码,用方法二来获取xml文件。这样就可以获取整个工程的代码了。

但有的时候方法一可能会出错,笔者就曾经遇到过这种情况,这个时候只能用方法二了。

此外介绍另外一种方式,这个方式得到的代码还不如方法二清晰,但是还是介绍一下吧。

 

方法三:apk—>dex->ddx 

ddx文件虽然不能看到源代码,但是可以看出类的结构。有的时候用第一种方法可能不一定能得到源代码,这个时候就用第二种方法来补救吧...

Dedexer 项目主页(见附件): http://dedexer.sourceforge.net/ 

下载地址也在这个网站上。下载后的文件为ddx1.11.jar(目前最新版本为1.11) 

1. 运行CMD 进入ddx1.11.jar的目录,输入如下命令: D:\WINDOWS\system32>java -jar ddx1.11.jar 

2. 出现如下提示 

Usage: java -jar ddx.jar -o -D -r -d <destination> <source> 

<destination> :指定生成的文件放置的目录 

<source> :dex源文件

-D - 指定生成错误信息

-o - 指定生成日志文件(dex.log). 

3.仔细阅读上面的信息,根据:

java -jar ddx1.11.jar -o -D -r -d <destination> <source> 

按此提示,输入: java -jar ddx1.11.jar -o -D -r -d c:\dex\gen c:\dex\classes.dex 4.运行成功,gen 目录生成了ddx 文件.用文本编辑器打开,可看到类大致结构.

 

 

附件一:是目前最新版的java反编译工具,超好用;

  昵称:狂飞

                                                    QQ:18670340

                                                    MSN:zhaojun1717@hotmail.com

                                                    注意事项:本文均为作者个人编写如果纰漏

                                                    请给予指出,转载请标明出处;

<!--EndFragment-->

分享到:
评论

相关推荐

    JSMF-Android::robot:+ @ JS-MF组件间通信的可视化以及带有@ JS-MF的Android应用程序的源代码-Android application source code

    这些模型是根据PEG.js语法定义的,并使用来自反编译的Android应用程序的数据实例化。 该原型最初是作为的用例开始的。 安装 在您的服务器上部署 $ git clone --recursive ...

    sec-tools:一组与安全性相关的工具

    包括以下工具的安装程序: 类别 工具 描述 二进制的 分解,检查和重新打包Android APK 二进制的 固件(和任意文件)分析工具。 二进制的 检查二进制强化设置。 二进制的 使用android .dex文件的工具 二进制...

    Java虚拟机

    5.2.1 高性能硬件上的程序部署策略 5.2.2 集群间同步导致的内存溢出 5.2.3 堆外内存导致的溢出错误 5.2.4 外部命令导致系统缓慢 5.2.5 服务器JVM进程崩溃 5.2.6 不恰当数据结构导致内存占用过大 5.2.7 由...

    JAVA上百实例源码以及开源项目源代码

    2个目标文件,FTP的目标是:(1)提高文件的共享性(计算机程序和/或数据),(2)鼓励间接地(通过程序)使用远程计算机,(3)保护用户因主机之间的文件存储系统导致的变化,(4)为了可靠和高效地传输,虽然用户...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    java开源包1

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包11

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包2

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包3

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包6

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包5

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包10

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包4

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包8

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包7

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包9

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    java开源包101

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

    Java资源包01

    它以 jar 的形式发布,部署容易,使用也较为便捷。 Java邮箱地址验证 jaev jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器...

Global site tag (gtag.js) - Google Analytics