Android程式的反編譯的過程分析

來源:互聯網
上載者:User

 

一、前言

 

對抗反編譯是指讓apk檔案或者dex檔案無法正常通過反編譯工具,而且有可能導致工具異常或者崩潰,如apktool、baksmali、dex2jar、JEB等等工具,如下圖dex2jar無法正常工作。

 

 

二、Dex檔案格式解析

 

目前大多數android軟體的反編譯工具都是開源的,比如apktool、Dex2jar、baksamli,大家可以非常方便的從github下載並源閱讀代碼,然後找到可以利用的點,再在自己的軟體中加入幹擾代碼,讓反編譯工具出現異常或者無法正常閱讀代碼。

 

接下來讓我們先來熟悉一下dex檔案格式 ,一個dex檔案由以下幾個部份組成:

1.     Dex Header:    Dex結構頭它指定了dex檔案的一些基本屬性,並記錄了部份資料表在dex檔案中的物理位移。2.     String Table:  字串表,儲存字串的索引和個數3.     Type Table:   類型表,儲存類型的索引和個數4.     Proto Table:  函數元型表,儲存函數元型索引和個數5.     Field Table:  欄位表,儲存欄位索引和個數6.     Method Table:  方法表,儲存方法索引和個數7.     Class def Table:類定義表,儲存類定義索引和個數8.     Data Section:  儲存資料,由以上類型的索引尋找,

 

 

有興趣的可以直接翻看android的源碼或者參考以下連結:

http://www.netmite.com/android/mydroid/dalvik/docs/dex-format.html

 

既然要在代碼中添加幹擾指令,接下的DexClassDef結構,肯定是要瞭解的非常清楚。

 

結構中包含了類的類型位移、訪問標誌、父類類型索引、介面位移、注釋、靜態類型的位移資訊,整體結構圖定義如下:

 

struct DexClassDef{     u4 classIdx;       u4 accessFlags;   u4 superclassIdx;    u4 interfacesOff;     u4 sourcefileIdx;    u4 annotationsOff;     u4 classDataOff;       u4 staticValuesOff;}

 

classIdx    欄位是一個索引值,類的類型,做為下標索引在DexTypeID結構列表中尋找
accessFlags   欄位是類的訪問標誌,以ACC_開頭的枚舉值
superclassIdx  欄位是父類的類型,做為下標索引在DexTypeID結構列表中尋找
interfacesOff  欄位是介面類型,做為下標索引在DexTypeList結構列表中尋找
sourcefileIdx  欄位是源檔案名稱,做為下標索引在DexTypeList結構列表中尋找
annotationsOff 欄位是注釋資訊的位移,指向DexAnnotationsDirectoryItem結構
classdataOff  欄位是指向了DexClassData結構體的位移
staticValuesOff 欄位是指向DexEncodeArray結構體的位移,記錄待用資料的資訊
DexClassData結構說明:

struct DexClassData{   DexClassDataHeader header;   DexField*  staticFields;     //靜態欄位,DexField結構   DexField*  instanceFields;   //執行個體欄位,DexField結構   DexMethod* directMethods;    //直接方法,DexMethod結構   DexMethod* virtualMethods;   //虛方法,  DexMethod結構}


DexClassData結構中的DexMethod類型描述了:方法的原型、名稱、訪問標誌以及代碼資料區塊,codeOff欄位指向了一個DexCode結構,它描述了方法更詳細的資訊以及方法中指令的內容。

DexMethod結構聲明如下

struct DexMethod{  u4 methodIdx;  //指向DexMethodId的索引   u4 accessFlags;//訪問標誌u4 codeOff;    //指向dexCode的結構位移}struct DexCode{  ushort  registerSsize;//使用的寄存器的數目  ushort  insSize;      //傳入參數的數目  unshort outsSize;     //調用其他方法時使用的寄存器個數  unshort triesSize;    //try/catch異常塊個數  uint    debugInfoOff; //調試資訊的位移  uint    insnsSize;    //指令集個數  ushort  insns[1];     //指令集數組,變長數組}


DexClassData樹型結構圖:

 

 

三、調試dex2jar工程

 

1. 將dex2jar源碼匯入IntelliJ IDEA,匯入後IntelliJ IDEA會自動尋找對應 Grable並下載,需要比較長的時間等待

 

源碼地址: https://github.com/pxb1988/dex2jar

 

2.  選中Grable中的dex2jar/dex2jar/Tasks/other/antlr2java進行編譯

 

 

3. 點擊工具列的 Project Structure, 然後選擇Modules -> d2j-smali -> build,然後點擊Excluded

 

 

4. 選擇 build/generated-sources/antlr, 然後點擊 Sources

 

 

5. 最後開啟Excluded Gradle Task彈出對話方塊,運行clean distZip 命令

 

 

執行完Gradl clean distZip命令後會在\dex2jar-2.x\dex-tools\build\distributions目錄下產生 dex-tools-2.1-SNAPSHOT.zip,壓縮包內是編譯完後產生的jar檔案和一些配置資訊檔。大家請參考dex2jar.sh檔案,它向我們說明需要使用lib目錄下的所有jar檔案和入口函數com.googlecode.dex2jar.tools.Dex2jarCmd 才能將dex檔案轉換成jar檔案

 

 

6.將dex檔案轉換成jar檔案需要執行轉換命令

 

格式如下:

java -Xms512m -Xmx1024m -classpath  .\lib\*.jar “com.googlecode.dex2jar.tools.Dex2jarCmd” classdex.dex

 

根據以上的命令,來配置調試參數,設定如下:

 

 

7.設定完成後,就可以開始調試

 

 

四、dex2jar反編譯失敗原因分析

 

1.首先我們從解包失敗的錯誤異常入手,定位崩潰處的代碼。

 

 

通過錯誤提示可以定位到dex2jar崩潰處的代碼,源碼位置如下:

dex-ir\src\main\java\com\googlecode\dex2jar\ir\TypeClass.java

 

2. 在崩潰的函數處下斷點,開始調試。

 

 

a)通過拋出的異常的說明“cant not merge I and Z”,以及整個呼叫堆疊。

 

我們可以看出造成這個異常的原因是函數調用時,實參的類型和形參類型不符引起的。因為在Java文法中,將實參是布爾類型傳遞給形參是int類型。這樣是不合法的,所以導致dex2jar在檢查的參數類型的時候失敗。

 

b)知道了崩潰的原因,那我們就需要確定它具體是使用怎樣的方法做到的,通過dex2jar產生的error異常資訊詳細說明檔案得知該dex檔案中的每一個函數頭部都加了一句這樣的代碼Exit.b(Exit.a())請看Ida,現在大致能猜到混淆者所做的工作:

 

1.首先解析dex檔案格式,定位到DexCode結構中的insns成員

 

2.向代碼中添加一個類成員對象名字叫Exit,然後添加代碼Exit.b(Exit.a())

 

 

3.明白了怎麼添加幹擾代碼,接下來分析一下dex2jar的工作流程,dex2jar轉換成jar檔案這個過程中會驗證,函數調用時的形參和實參的合法性,請看下圖,解析到INVOKE_開頭的指令時,會開始解析傳回值,供給參數,和實參等資訊,具體邏輯和代碼大家有興趣可以詳細地研究一下dex2jar源碼。

 

 

4.merge負責的工作是參數類型的驗證,如果兩個類型相同,返回形參的類型,形參為UNKONW返回實參,實參為UNKONW返回形參,兩個類型都不相同,則匹配異常

 

 

5.最後在dex2jar裡添加代碼,使dex檔案能正確的被反編譯成功。這裡給出一段可以成功讓dex2jar反編譯的出jar檔案的代碼(其實方法有很多)

 

 

下圖是成功反編譯的jar檔案

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.