天天看點

Android APP反編譯之開篇與工具

背景

反編譯人家的程式并不是一件光彩的事情,我們也不推薦。這裡僅僅從技術角度來探讨這一技能目前主要的使用場景、所需掌握的工具和技能,以及對我們保護自己APP的啟發。這裡,我結合自己逆向工程的一些經驗,準備用以下一序列的博文來進行闡述:

  1. Android APP逆向工程之開篇與工具
  2. Android DEX之smali文法篇(TODO)
  3. Android DEX之寄存器篇(TODO)
  4. Android DEX之指令集篇(TODO)
  5. Android APP實戰一:篡改廣告ID(TODO)
  6. Android APP實戰二:添加插屏廣告(TODO)
  7. Android APP開發之如何保護(TODO)

Android APP逆向工程的使用場景

逆向工程這一技能在以下一些工作場合可能會有廣泛的應用,如:

  1. 競品分析

    在我們項目成立之初,市面上可能已經有競品存在了,這時候技術人員可能會對其進行逆向工程,以盡可能擷取其資料模型、接口、技術選型、協定等等方面的進行參考,為我所用或辯證優化。

  2. 竊取資源

    通過反編譯APK擷取人家的圖檔資源、布局檔案和自定義View等等。

  3. 功能修改

    這個主要在我們項目成立初期做産品原型的時候會用到。比如我前段時間做一個TV産品時候原型時候用到沙發管家,因其歡迎界面的Activity在AndroidManifest.xml并未配置FullScreen,導緻從Launcher啟動時候會有會顯示StatusBar,進而影響了DemoShow。這時候逆向工程就派上用場了,我們反編譯後給其歡迎界面的Activity添加FullScreen屬性再打包,問題圓滿解決。當然這是在項目的原型開發階段,到産品化時候是不能這麼做的。

  4. 惡意篡改

    這個和上述“功能修改”最大的差別是以損害原開發商或者原開發者的利益而達到自己不可告人的目的。這種惡意行為最常見于所謂的“打包黨”。打包黨主要有2種行為的人:

    • 通過竊取别人源碼,添加自己的廣告,進而獲利;
    • 反編譯别人的APP,篡改其廣告為自己的廣告并從中獲利;

      我們應該為這種人感到不恥。

工具篇

本文所說的逆向工程僅僅涉及資源檔案和DEX檔案,并不包含.so檔案的反編譯。通常情況下我們可以:

  • 通過ApkTool工具反編譯得到資源和smali檔案;也是通過ApkTool把反編譯編輯後的資源和smali再打包成Apk檔案;
  • 通過dex2jar把Apk或dex檔案反編譯成jar檔案
  • 利用jd-gui檢視dex2jar生成的jar檔案。

下面我們以Android Studio的Empty Activity模闆所對應的Apk重點介紹一下這3個工具:

ApkTool

截至目前,ApkTool的最新版本是2.2.2,我們可以從Apktool install下載下傳相應的版本安裝,注意jdk版本必須是Java 7+。Apktool的詳細使用說明在這:Apktool Documentation。這裡簡單說明下反編譯解包、再打包和簽名。

  • 反編譯解包

    指令是:apktool d apk檔案路徑,如

    Android APP反編譯之開篇與工具
    從截圖可以看出,我所使用的apktool版本是2.1.1。 解包結果如圖:
    Android APP反編譯之開篇與工具
    其中smali檔案夾存放dex檔案反編譯後所對應的smali檔案。這裡看下MainActivity.smali的内容:
.class public Lcom/baidusoso/decompilationdemo/MainActivity;
.super Landroid/support/v7/app/AppCompatActivity;
.source "MainActivity.java"


# direct methods
.method public constructor <init>()V
    .locals 0

    .prologue
    .line 6
    invoke-direct {p0}, Landroid/support/v7/app/AppCompatActivity;-><init>()V

    return-void
.end method


# virtual methods
.method protected onCreate(Landroid/os/Bundle;)V
    .locals 1
    .param p1, "savedInstanceState"    # Landroid/os/Bundle;

    .prologue
    .line 10
    invoke-super {p0, p1}, Landroid/support/v7/app/AppCompatActivity;->onCreate(Landroid/os/Bundle;)V

    .line 11
    const v0, 0x7f04001a

    invoke-virtual {p0, v0}, Lcom/baidusoso/decompilationdemo/MainActivity;->setContentView(I)V

    .line 12
    return-void
.end method
           
  • 再打包

    指令:apktool b 反編譯後的檔案夾,如:

    Android APP反編譯之開篇與工具
    這個指令生成的apk檔案在dist檔案夾下。當然你可以通過-o選項修改輸出apk的路徑和名稱。
  • 重簽名

    很不幸的是再打包後生成的apk是還沒簽名的,也就是說這樣的逆向工程會丢失原始的簽名資訊。這時候我們可以通過jarsigner工具重新簽名apk,前提是你有了一份keystore。jarsigner簽名指令如下:

jarsigner.exe -digestalg SHA1 -sigalg MD5withRSA -keystore cert.keystore -storepass yourstorepass -signedjar app_signed.apk app_unsigned.apk certalias           

如果您看不懂這段代碼沒關系,關于smali的文法,我會在下一個博文重點介紹,在這裡知道有smali檔案,對其有個印象就可以。

dex2jar

dex2jar主要是apk或dex檔案轉為jar檔案。目前最新版本是2.0,您可以從官網sourceforge dex2jar下載下傳到。下載下傳後解壓到如D:\program\dex2jar

Android APP反編譯之開篇與工具

我們可以使用d2j-dex2jar把apk反編譯為jar:

Android APP反編譯之開篇與工具

app-debug-dex2jar.jar就是生成的jar檔案。

jd-gui

jd-gui工具主要用于檢視.class檔案和jar檔案。jd-gui可以從官網jd-gui下載下傳到。用其打開上述的app-debug-dex2jar.jar,如

Android APP反編譯之開篇與工具

好了,工具篇就先介紹到這裡。如果您在反編譯過程中出錯,您可以試試把工具更新到最新版本,也許問題就解決了。

我下篇重點介紹smali的文法。