日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | 查找 DexFile 对应的C代码 | dalvik_system_DexFile.cpp 分析 )

發布時間:2025/6/17 Android 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 文件的流程 , 入口函數是 DexFileloadDexFile 函數 , 然后在該函數中調用了 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 分析 )的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产普通话bbwbbwbbw | 5月婷婷6月丁香 | 欧美日韩一级二级三级 | 一级欧美日韩 | 欧美日韩国产免费 | 美女脱裤子打屁股 | 人人射人人干 | 樱空桃在线| 天堂网在线播放 | 亚洲一区二区在线电影 | 欧美日韩免费一区二区三区 | 可以免费观看av的网站 | 日韩视频免费看 | 亚洲区小说区图片区 | 亚洲一页| 波多野结衣在线观看一区二区 | 国产男女无套 | 日韩av一| 永久在线视频 | 91ts人妖另类精品系列 | 实拍澡堂美女洗澡av | 91视频网址入口 | 丰满人妻妇伦又伦精品国产 | 妺妺窝人体色www在线下载 | 俄罗斯videodesxo极品 | 日韩美女激情视频 | 国产女人高潮毛片 | 中国精品一区二区 | 男人的天堂一级片 | 亚洲色图 在线视频 | 一区二区高清在线观看 | 樱花草av| 不卡在线一区二区 | 鲁鲁狠狠狠7777一区二区 | 女人高潮潮呻吟喷水 | 91在线国产观看 | 手机成人在线视频 | 欧美人和黑人牲交网站上线 | 午夜不卡福利视频 | 欧美福利视频一区 | 99精品视频免费 | 欧美午夜在线 | 国产精品高潮呻吟久久久 | 潘金莲一级淫片a.aaaaa播放 | 欧美性色19p | 国产资源第一页 | 拔插拔插海外华人免费视频 | 激情图片区 | 伊人激情| 青青草一区二区 | 北条麻妃青青久久 | 蜜桃成熟时李丽珍在线观看 | 日韩综合网 | 亚洲最大福利视频 | 成人a毛片 | 国产视频污 | 91精品久久久久久久久久久 | 高h全肉污文play带道具 | 免费成人深夜夜视频 | 污视频免费网站 | 三级做爰在线观看视频 | 91视频黄色| 国产一级久久 | 国产精品久久一 | 国产最新地址 | 亚洲av无码乱码在线观看性色 | 国产精品自拍电影 | 欧美偷拍第一页 | www插插插| 就爱啪啪网站 | 雪花飘电影在线观看免费高清 | 好吊视频一二三区 | 一区二区三区久久久久 | 野外(巨肉高h) | 黄视频在线| 福利在线小视频 | 特级黄毛片 | 欲求不满在线小早川怜子 | 中文字幕在线资源 | 色婷婷狠狠 | 六月丁香综合 | 中国老太婆性视频 | 91porny丨首页入口在线 | 超碰66| 中国女人高潮hd | 国产精品揄拍100视频 | 黄色国产网站 | 国产精品秘入口18禁麻豆免会员 | 免费av看| 精品人妻一区二区三区四区五区 | 操你啦在线视频 | 精品国产鲁一鲁一区二区三区 | 精品乱人伦一区二区三区 | 性视频网址 | 久久午夜福利电影 | 99婷婷| 一区二区三区91 | 中文字幕亚洲精品在线观看 | 成人污视频 |