android apk包反編譯、破解心得

來源:互聯網
上載者:User

      研究Android近一個月了,總體上來說還是比較容易上手,而且相關的資源也還算豐富。然而一些覺得不錯的應用,沒有提供源碼,想深入研究一下實現原理就只有採用反編譯、破解的辦法了。網上講破解方法的文章很多,但大多是轉載的,大同小異,而且不怎麼完整,這裡總結三種方法,供學習研究,分享如下。首先,用WinRAR解壓apk包,會得到包目錄、classes.dex等檔案,之後按以下操作:

 

一、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包,解析出的檔案認真看還是能看懂,比如以下片段:

 

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

 

認真一看,就知道:

# 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://code.google.com上下載到。

 

 

 

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.