安卓逆向學習----Android可執行文件

一、Android程序的生成步驟

APK是AndroidPackage的縮寫,實際上APK文件就是一個zip類型的壓縮包,使用zip格式解壓縮會發現它由圖片、字符串等資源和dex文件組成,dex文件就是dalvik虛擬機的可執行文件。現在安卓開發基本都是用Android Studio了。APK打包的過程分爲七個步驟

第一步,打包資源文件生成R.java文件。打包資源使用的工具可以在android SDK中找到,它首先對AndroidManifest.xml的合法性進行檢查,然後對res目錄下的資源子目錄進行處理,然後編譯res和asserts目錄下的資源並生成resources.arsc文件,最後生成R.java,在之後對res目錄下的xml文件進行編譯,這一步相當於加密,最後所有資源和resources.arsc文件以及AndroidManifest.xml打包壓縮成爲resources.ap_文件。

第二步,處理aidl(android接口定義語言)文件,生成相應的java文件。使用的工具是aidl,對於沒有用到aidl的安卓工程,這一步可以跳過。aidl也在androidSDK中可以找到

第三步,編譯工程源代碼,生成相應的class文件,調用javac編譯src目錄下所有java代碼,若果如果使用NDK開發的話,還可能需要使用AndroidNDK編譯C/C++代碼

第四步,將所有class文件轉換爲dex文件,使用工具是dx,主要工作是轉換格式、壓縮常量池、消除冗餘信息

第五步,打包生成APK,使用的工具爲apkbuilder,它是一個腳本文件,實際上調用的是sdklib.jar中的ApkBuilderMain類。先構建一個apkbuilder類,然後以包含resources.arsc的文件爲基礎生成apk文件,然後添加各種資源,接着寫入依賴庫,添加libs目錄下的Native庫,最後關閉apk文件

第六步,對apk文件簽名。一種是調試程序時的簽名,使用的JDK中的jarsigner;另一種是打包發佈的時候進行簽名,使用的是Android源碼中的signapk工具。

第七步,對簽名後的文件進行對齊處理。使用的是zipalign,將所有資源文件其實便宜爲4字節的整數倍,這樣通過內存映射訪問apk文件時速度更快。

二、安卓程序的安裝流程

apk安裝分爲四種:系統程序開機自動安裝、android市場安裝、ADB工具安裝、手機自帶apk安裝。

第一種有開機啓動時的PackageManagerService服務完成,在啓動時自動掃描/system/app路徑下的程序並重新安裝,這個路徑默認是隻讀的;

第四種是調用安卓系統中的packageinstaller.apk來完成安裝。收到應用安裝請求,系統啓動PackageInstaller,接受Intent傳過來的待安裝apk信息,啓動過程首先會解析程序包信息,解析失敗則返回,成功則啓動PackageInstallerActivity。PackageInstallerActivity調用的函數有兩個比較重要,分別是getPackageInfo()和initiateInstall(),前者解析安裝包中各種信息,並構建package對象將解析的信息添加進去;後者檢測該程序是否已經安裝過,然後根據結果進行安裝或者替換更新

三、dex文件格式

dex文件整體結構分爲:dex header、string_ids、type_ids、proto_ids、field_ids、method_ids、class_def、data、link_data。在安卓源碼dalvik/libdex/Dexfile.h中有介紹

dex header爲dex文件的文件頭,指定dex文件的屬性,記錄其他幾部分在文件中的偏移,string_id到class_def幾部分則爲索引結構區,程序真正會用到的數據放在data區,最後link_data爲靜態鏈接數據區。

dex header中有幾個字段比較重要,magic字段標識一個有效的dex文件,目前的值爲“64 65 78 01 30 33 35 00”,轉換爲字符串爲“dex.035”,checksum是校驗和,對dex文件進行修改之後要把校驗和重新計算然後覆蓋這一字段才能成功運行;signature字段用於識別優化之前的dex文件;filesize指示了文件大小,endianTag指定了cpu字節序的大小端。

dalvik虛擬機解析dex文件之後,會將其映射爲DexMapList,其結構如下:

struct DexMpList{
    u4 size;//u4表示4字節無符號數
    DexMapItem list[1];
};

struct DexMapItem {
    u2 type;
    u2 unused;
    u4 size;
    u4 offset;
};

type是枚舉常量,形式爲kDexType*,size指定這種類型的個數,offset是指該類型文件的起始偏移地址

四、odex文件格式

odex全稱OptimizedDEX,表示經過優化的dex文件。Android程序apk文件爲zip壓縮包格式,dalvik虛擬機每次加載它們需要從apk中讀取classes.dex文件,耗費大量CPU時間,而odex文件已經包含了加載dex必須的依賴庫文件列表,只需要檢測並加載需要的依賴庫即可,大大縮短了讀取dex文件所需時間。

odex生成:(1)使用dexopt-wrapper工具(2)從apk中提取,這種多是Android ROM的系統程序(3)dalvik-cache緩存文件

odex文件結構:它是dex文件的一個超集,由odex文件頭、dex文件、依賴庫、輔助數據組成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章