反編譯Android部署程序
方法一: 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虛擬機(jī)Dalvik支持的字節(jié)碼文件。
4.在cmd下進(jìn)入dex2jar.bat所在路徑,輸入dex2jar.bat D:\project\classes.dex 回車。其中D:\project\classes.dex就是你的classes.dex所在的目錄。
5.然后在classes.dex同級目錄下會生成一個classes.dex.dex2jar.jar文件
6.用jad工具將打開這個jar文件,你就可以看到這個jar文件里面的代碼了。而且可以直接保存為java文件。
方法二:(推薦)
Apk->加密的XML->解密的XML
apk—>dexàsmali
此外,上面操作只能得到j(luò)ava代碼,但是我們可能還需要一些XML文件,APK文件解壓縮后,發(fā)現(xiàn)其中的XML文件都是經(jīng)過處理過的,看不到源碼。
下面利用Google提供的apktool來獲取xml文件
1. 下載apktool,可以去Google的官方下載(見附件),
地址:http://code.google.com/p/android-apktool/
apktool-1.0.0.tar.bz2和apktool-install-windows-2.1_r01-1.zip兩個包都要下。
2.解壓這兩個下載到的文件到某個文件夾(例如E盤根目錄)。 確保解壓縮后得到的aapt.exe,apktool.bat,apktool.jar在同一個文件夾下。
3.將要破解的.apk文件也放入到這個文件夾中來。
4.運(yùn)行CMD,用cd命令轉(zhuǎn)到這幾個文件所在文件夾,輸入apktool,假如列出一些幫助的話就成功了(解釋d為加壓 ***個路徑為你的apk所在的位置。第二個是要輸出的位置) 
apktool d XXX.apk ABC 反編譯XXX.apk到文件夾ABC (必須確保當(dāng)前目錄下沒有ABC這個文件夾,否則會報錯)
5. 解壓后的文件夾中可以得到apk中的xml配置文件。
其實用這個方法會得到一個smali文件夾,進(jìn)去看,用記事本打開其中的一個.smali文件,通過解讀里面的信息,就可以一窺代碼的全貌,就是有點費(fèi)力。下面我們通過一個實例來對比一下.smali和.java源代碼的對照吧:
#p#
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);
 - }
 - }
 
通過兩者的對比是不是有所感悟呢,的確有點麻煩。所以推薦大家采用方法一來得到j(luò)ava代碼,用方法二來獲取xml文件。這樣就可以獲取整個工程的代碼了。
但有的時候方法一可能會出錯,筆者就曾經(jīng)遇到過這種情況,這個時候只能用方法二了。
此外介紹另外一種方式,這個方式得到的代碼還不如方法二清晰,但是還是介紹一下吧。
方法三:apk—>dex->ddx 
ddx文件雖然不能看到源代碼,但是可以看出類的結(jié)構(gòu)。有的時候用***種方法可能不一定能得到源代碼,這個時候就用第二種方法來補(bǔ)救吧...
Dedexer 項目主頁(見附件): http://dedexer.sourceforge.net/
下載地址也在這個網(wǎng)站上。下載后的文件為ddx1.11.jar(目前***版本為1.11)
1. 運(yùn)行CMD 進(jìn)入ddx1.11.jar的目錄,輸入如下命令: D:\WINDOWS\system32>java -jar ddx1.11.jar
2. 出現(xiàn)如下提示
Usage: java -jar ddx.jar -o -D -r -d <destination> <source>
<destination> :指定生成的文件放置的目錄
<source> :dex源文件.
-D - 指定生成錯誤信息.
-o - 指定生成日志文件(dex.log).
3.仔細(xì)閱讀上面的信息,根據(jù):
- 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.
 
運(yùn)行成功,在gen 目錄生成了ddx 文件.用文本編輯器打開,可看到類大致結(jié)構(gòu).
原作者的blog中還有相關(guān)工具可供下載.原地址:http://zhaojun1717.javaeye.com/blog/953281















 
 
 







 
 
 
 