頂象App加固技術解析:DEX檔案格式的詳解
Android應用的原始碼主要分為java與C/C++兩部分,其中java編譯後的檔案是DEX檔案,也是Android Dalvik虛擬機器執行的程式,因此也是基於Android平臺的虛機應用很難繞過的一種檔案格式,重要性不言而喻。

在頂象技術的 Android 加固解決方案中,有著DEX 殼保護、指令虛擬化(將DEX檔案執行在自實現的虛擬機器環境下)等技術。要想了解頂象技術的Android 加固解決方案如何幫助 Android 應用對抗逆向和破解,首先需要了解DEX檔案到底是什麼樣的。
檔案結構展示

DEX檔案格式

DEX檔案在010中的表現
檔案結構詳解

結構體定義
檔案頭( dex_header )。
- magic[8]:dex版本標識。這類位元組必須出現在 .dex 檔案的開頭,以便系統將其原樣識別。該值會特意包含一個換行符("\n" 或 0x0a)和空位元組("\0" 或 0x00),以便協助檢測某些形式的損壞問題。該值還可以將格式版本號編碼為 3 個十進位制數字;隨著格式的演變,預計該值會單調遞增。
- checksum:可以用於檔案剩餘內容(除 magic 和此欄位之外的所有內容)的 adler32 校驗和。另外,還可以用於檢測檔案損壞情況。
- signature[kSha1DigestSize]:檔案剩餘內容(除 magic、checksum 和此欄位之外的所有內容)的 SHA-1 簽名(雜湊);用於對檔案進行唯一標識。
- file_size:整個檔案(包括標頭)的大小,以位元組為單位。
- header_size:標頭(整個區段)的大小,以位元組為單位。這一項允許至少一定程度的向後/向前相容性,而不必讓格式失效。
- endian_tag:位元組序標記。ENDIAN_CONSTANT ,表示小端位元組序。
- REVERSE_ENDIAN_CONSTANT 表示大端位元組序,預設值為
- ENDIAN_CONSTANT 。
- link_size 與 link_off :連結區段的大小與檔案偏移。如果此檔案未進行靜態連結,則兩個值都為0。
- map_off:從檔案開頭到對映項列表的檔案偏移量。
- string_ids_size 與 string_ids_off:字串識別符號列表中的字串數量與檔案偏移。
- type_ids_size 與 type_ids_off:型別識別符號列表中的元素數量及檔案偏移。元素數量上限為65535。
- proto_ids_size 與 proto_ids_off:原型識別符號列表中的元素數量及檔案偏移。元素數量上限為65535。
- field_ids_size 與 field_ids_off:欄位識別符號列表中的元素數量及檔案偏移。
- method_ids_size 與 method_ids_off:方法識別符號列表中的元素數量及檔案偏移。
- class_defs_size 與 class_defs_off:類定義列表中的元素數量及檔案偏移。
- data_size 與 data_off :data區段的大小及檔案偏移。
字串識別符號列表( dex_string_ids )在DEX檔案以 DexStringId[] 的形式存在,其結構如下。

型別識別符號列表( dex_type_ids )在DEX檔案以 DexTypeId[] 的形式存在,其結構如下。

方法原型識別符號列表( dex_proto_ids )在DEX檔案以 DexProtoId[] 的形式存在,其中 DexProtoId 結構如下。

DexTypeList 結構如下。

欄位識別符號列表( dex_field_ids )在DEX檔案以 DexFieldId[] 的形式存在,其中 DexFieldId 結構如下。

方法識別符號列表( dex_method_ids ) 在DEX檔案以 DexMethodId[] 的形式存在,其中 DexMethodId 結構如下。

類定義列列表( dex_class_defs )在DEX檔案以 DexClassDef[] 的形式存在,其中 DexClassDef 結構如下。

對映項列表( dex_map_list ) 在DEX檔案以 DexMapItem[] 的形式存在,其中 DexMapItem 結構如下。

型別程式碼表如圖所示。

由於篇幅限制,小象將在第二篇文章中繼續解析DEX檔案的DexAnnotationsDirectoryItem 、 DexClassData 與 DexEncodeArray 結構,請繼續關注。