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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 逆向】Dalvik 函数抽取加壳 ( 类加载流程分析 | native 函数查询 | dalvik_system_DexFile.cpp#defineClassNative 函数 )

發布時間:2025/6/17 Android 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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 函数 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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