.dex文件作爲Dalvik VM的可執行文件,是我們分析的核心。我們先來看看對於一個apk它的打包過程是如何的。上節我們說了大致流程,現在我們來看下詳細流程
安裝過程是如何的(略)。
現在我們來詳細看看一個dex文件的組成。
string_ids 到class_def皆爲索引,真實的數據存放在data區,link_data爲靜態鏈接數據區(目前爲空,預留)。
其中DexHeader定義如下:
我們可以看到其中包含了mapOff,它指明瞭DexMapList在dex文件中的位置(offset)。Dalvik VM解析出的dex文件內容最終都將被映射到DexMapList這個數據結構中去。其聲明如下:
struct DexMapList {
u4 size;
DexMapItem list[1];
};
size表示接下來將有多少個DexMapItem,其聲明如下
struct DexMapItem {
u2 type;
u2 unused; // 用於對齊
u4 size;
u4 offset;
};
type可能的類型如下:
其中ProtoId表示general method類型的索引,用於後面的TypeMethodId進一步的索引。在ubuntu下可以用bless hex editor來對dex進行閱讀。
對於個多細節就不在這裏敷述了,有興趣的讀者請去查閱非蟲的書。
Odex - Optimized DEX
Andoird 的apk文件爲zip壓縮包格式,Dalvik VM每次加載app時需要從apk中提取classes.dex文件,會耗費很多CPU資源。而採用odex方式優化的dex文件已經包含了加載dex所必須的依賴庫文件列表