【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )
文章目錄
- 前言
- 一、查詢 defineClassNative 函數
- 二、dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函數分析
前言
上一篇博客 【Android 逆向】Dalvik 函數抽取加殼 ( 類加載流程分析 | DexPathList#findClass 函數分析 | DexFile#loadClassBinaryName 函數 ) 中 , 分析到了調用到 DexFile#loadClassBinaryName 函數 , 該函數是 native 函數 ;
一、查詢 defineClassNative 函數
在 Android 源碼頁面 http://androidxref.com/4.4.4_r1 , 選中 dalvik 工程 , 然后在 " Full Search " 中搜索 defineClassNative 函數 ;
查詢出的對應的 native 函數是 /dalvik/vm/native/dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative ,
二、dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函數分析
在 /dalvik/vm/native/dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函數中 , 如果加載的是 dex 文件 , 則調用 dvmGetRawDexFileDex 函數 ;
// 如果加載的是 dex 文件 , 走這個分支 pDvmDex = dvmGetRawDexFileDex(pDexOrJar->pRawDexFile);dvmGetRawDexFileDex 函數定義在 /dalvik/vm/RawDexFile.h#dvmGetRawDexFileDex 中 , 該函數實現很簡單 :
/** 從 RawDexFile 中撬出 DexFile。*/ INLINE DvmDex* dvmGetRawDexFileDex(RawDexFile* pRawDexFile) {return pRawDexFile->pDvmDex; }在之后 , 調用了 Class.cpp#dvmDefineClass 函數 ;
dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative 函數源碼 :
/** 私有靜態類defineClassNative(字符串名稱、類加載器、,* int cookie)* * 從DEX文件加載類。這大致相當于defineClass()* 在常規VM中——類裝入器調用它以導致* 創建特定類。不同之處在于,搜索和* 字節的讀取是在VM中完成的。* * 類名是一個“二進制名稱”,例如“java.lang.String”。* * 如果找不到類,則返回空指針,無異常。* 在其他失敗時引發異常。*/ static void Dalvik_dalvik_system_DexFile_defineClassNative(const u4* args,JValue* pResult) {StringObject* nameObj = (StringObject*) args[0];Object* loader = (Object*) args[1];int cookie = args[2];ClassObject* clazz = NULL;// 獲取 cookie DexOrJar* pDexOrJar = (DexOrJar*) cookie;DvmDex* pDvmDex;char* name;char* descriptor;name = dvmCreateCstrFromString(nameObj);descriptor = dvmDotToDescriptor(name);ALOGV("--- Explicit class load '%s' l=%p c=0x%08x",descriptor, loader, cookie);free(name);if (!validateCookie(cookie))RETURN_VOID();if (pDexOrJar->isDex)// 如果加載的是 dex 文件 , 走這個分支 pDvmDex = dvmGetRawDexFileDex(pDexOrJar->pRawDexFile);elsepDvmDex = dvmGetJarFileDex(pDexOrJar->pJarFile);/* 一旦加載了某些內容,就無法取消映射存儲 */pDexOrJar->okayToFree = false;// 此處加載類 clazz = dvmDefineClass(pDvmDex, descriptor, loader);Thread* self = dvmThreadSelf();if (dvmCheckException(self)) {/** 如果我們拋出了一個“未找到類”異常,請扼殺它,因為* 較高方法中的contract表示,如果* 找不到該類。*/Object* excep = dvmGetException(self);if (strcmp(excep->clazz->descriptor,"Ljava/lang/ClassNotFoundException;") == 0 ||strcmp(excep->clazz->descriptor,"Ljava/lang/NoClassDefFoundError;") == 0){dvmClearException(self);}clazz = NULL;}free(descriptor);RETURN_PTR(clazz); }源碼路徑 : /dalvik/vm/native/dalvik_system_DexFile.cpp#Dalvik_dalvik_system_DexFile_defineClassNative
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 逆向】Dalvik 函
- 下一篇: 【Android 逆向】Dalvik 函