【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )
文章目錄
- 前言
- 一、查找 DexFile 對應的 C++ 代碼
- 1、根據 Native 文件命名慣例查找 C++ 代碼
- 2、根據方法名查找
- 二、dalvik_system_DexFile.cpp 源碼分析
前言
上一篇博客 【Android 逆向】整體加固脫殼 ( DexClassLoader 加載 dex 流程分析 | DexFile loadDexFile 函數 | 構造函數 | openDexFile 函數 ) 中 , 介紹了 DexFile 中加載 Dex 文件的流程 , 入口函數是 DexFile 的 loadDexFile 函數 , 然后在該函數中調用了 DexFile 的構造函數 , 之后再構造函數中調用了 openDexFile 函數 , 最終調用了 openDexFileNative 方法 ;
openDexFileNative 方法在 C++ 代碼中實現 , 本篇博客介紹該 C++ 實現 ;
一、查找 DexFile 對應的 C++ 代碼
1、根據 Native 文件命名慣例查找 C++ 代碼
DexFile.java 的路徑是
/libcore/dalvik/src/main/java/dalvik/system/DexFile.java按照 Android 的慣例 , DexFile 對應的 C++ 代碼名稱一般是將路徑中的 “/” 替換成 “_” ;
dalvik/system/DexFile.java 的 Java 代碼對應的 C++ 代碼一般命名為 dalvik_system_DexFile.cpp , 嘗試在 dalvik 模塊中搜索該 C++ 代碼 ;
dalvik_system_DexFile.cpp 源碼路徑為 /dalvik/vm/native/dalvik_system_DexFile.cpp
2、根據方法名查找
也可以直接在 http://androidxref.com/4.4.4_r1/ 地址的 Full Search 中 , 搜索 openDexFileNative 方法 , 注意選中 dalvik 模塊 ;
二、dalvik_system_DexFile.cpp 源碼分析
在下面的代碼中 , 從參數張紅獲取 dex 文件路徑 和 優化 dex 文件路徑 ,
// dex 文件路徑StringObject* sourceNameObj = (StringObject*) args[0];// 優化 dex 文件路徑 StringObject* outputNameObj = (StringObject*) args[1];判斷 dex 文件是否以 " .dex " 結尾 ,
hasDexExtension(sourceName)如果文件是以 .dex 結尾 , 則進入 dvmRawDexFileOpen 函數執行 ,
dvmRawDexFileOpen(sourceName, outputName, &pRawDexFile, false)dalvik_system_DexFile.cpp 相關代碼示例 :
/** 私有靜態int-openDexFileNative(字符串sourceName、字符串outputName、,* int標志)引發IOException* * 打開一個DEX文件,返回指向內部數據結構的指針。* * “sourceName”應該指向“source”jar或DEX文件。* * 如果“outputName”為空,則DEX代碼將自動查找* 緩存目錄中的“優化”版本,必要時創建它。* 如果它不為NULL,則將使用指定的文件。* * TODO:目前,我們很樂意多次打開同一個文件。* 為了優化這一點,我們可以在散列中搜索現有條目* 表并重新計算它們。需要原子操作或添加“已同步”* 指向在此調用的非本機代碼。* * TODO:應該使用“long”作為指針。*/ static void Dalvik_dalvik_system_DexFile_openDexFileNative(const u4* args,JValue* pResult) {// dex 文件路徑StringObject* sourceNameObj = (StringObject*) args[0];// 優化 dex 文件路徑 StringObject* outputNameObj = (StringObject*) args[1];DexOrJar* pDexOrJar = NULL;JarFile* pJarFile;RawDexFile* pRawDexFile;char* sourceName;char* outputName;if (sourceNameObj == NULL) {dvmThrowNullPointerException("sourceName == null");RETURN_VOID();}sourceName = dvmCreateCstrFromString(sourceNameObj);if (outputNameObj != NULL)outputName = dvmCreateCstrFromString(outputNameObj);elseoutputName = NULL;/** 我們必須處理可能有人試圖* 打開我們的一個引導類DEX文件。依賴項集* 將是不同的,因此優化的結果可能是不同的* 不同,這意味著我們實際上需要有兩個版本的* 優化的DEX:只知道引導類的一部分的DEX* 這條路,一條知道里面一切的路。后者可能會* 基于稍后出現的類優化字段/方法訪問* 在類路徑中。* * 我們不能讓用戶定義的類加載器打開它并開始使用* 類,因為代碼的優化形式跳過了一些* 我們通常使用的方法和場分辨率,以及* 我們會有錯誤的語義。* * 我們必須拒絕嘗試從啟動時手動打開DEX文件* 類路徑。最簡單的方法是通過文件名,這很有效* 由于名稱的變化(例如“/system/framework//ext.jar”)而無法使用* 結果我們命中了不同的dalvik緩存項。也很好* 如果調用方指定了自己的輸出文件。*/if (dvmClassPathContains(gDvm.bootClassPath, sourceName)) {ALOGW("Refusing to reopen boot DEX '%s'", sourceName);dvmThrowIOException("Re-opening BOOTCLASSPATH DEX files is not allowed");free(sourceName);free(outputName);RETURN_VOID();}/** 如果名稱以“.DEX”結尾,請嘗試直接將其作為DEX打開。* 如果失敗了(或者一開始就沒有嘗試過),可以嘗試一下* 拉鏈里面有一個“classes.dex”。*/if (hasDexExtension(sourceName)// 如果文件是以 .dex 結尾 , 則進入 dvmRawDexFileOpen 函數執行 && dvmRawDexFileOpen(sourceName, outputName, &pRawDexFile, false) == 0) {ALOGV("Opening DEX file '%s' (DEX)", sourceName);pDexOrJar = (DexOrJar*) malloc(sizeof(DexOrJar));pDexOrJar->isDex = true;pDexOrJar->pRawDexFile = pRawDexFile;pDexOrJar->pDexMemory = NULL;} else if (dvmJarFileOpen(sourceName, outputName, &pJarFile, false) == 0) {ALOGV("Opening DEX file '%s' (Jar)", sourceName);pDexOrJar = (DexOrJar*) malloc(sizeof(DexOrJar));pDexOrJar->isDex = false;pDexOrJar->pJarFile = pJarFile;pDexOrJar->pDexMemory = NULL;} else {ALOGV("Unable to open DEX file '%s'", sourceName);dvmThrowIOException("unable to open DEX file");}if (pDexOrJar != NULL) {pDexOrJar->fileName = sourceName;addToDexFileTable(pDexOrJar);} else {free(sourceName);}free(outputName);RETURN_PTR(pDexOrJar); }源碼路徑 : /dalvik/vm/native/dalvik_system_DexFile.cpp
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】整体加固脱壳 (
- 下一篇: 【Android 逆向】整体加固脱壳 (