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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 )

發布時間:2025/6/17 Android 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、RawDexFile.cpp 中 dvmRawDexFileOpen() 方法分析

前言


上一篇博客 【Android 逆向】整體加固脫殼 ( DexClassLoader 加載 dex 流程分析 | 查找 DexFile 對應的C代碼 | dalvik_system_DexFile.cpp 分析 ) 中 , dalvik_system_DexFile.cppDalvik_dalvik_system_DexFile_openDexFileNative() 方法中 , 調用了 RawDexFile.cpp 中的 dvmRawDexFileOpen() 方法 ;





一、RawDexFile.cpp 中 dvmRawDexFileOpen() 方法分析



調用 open 函數 以只讀形式 , 打開了 DEX 文件 ;

dexFd = open(fileName, O_RDONLY);

校驗 DEX 文件 ;

verifyMagicAndGetAdler32(dexFd, &adler32) < 0

調用 DexPrepare.cpp 中的 dvmOptimizeDexFile() 函數 , 優化 DEX 文件 ;

result = dvmOptimizeDexFile(optFd, dexOffset, fileSize,fileName, modTime, adler32, isBootstrap);

源碼示例 :

/** 打開一個未優化的 DEX 文件.*//* 請參閱頁眉中的文檔注釋. */ int dvmRawDexFileOpen(const char* fileName, const char* odexOutputName,RawDexFile** ppRawDexFile, bool isBootstrap) {/** TODO: 這復制了JarFile.c 中 dvmJarFileOpen() 的大量代碼。這應該被重構。*/DvmDex* pDvmDex = NULL;char* cachedName = NULL;int result = -1;int dexFd = -1;int optFd = -1;u4 modTime = 0;u4 adler32 = 0;size_t fileSize = 0;bool newFile = false;bool locked = false;// 調用 open 函數 以只讀形式 , 打開了 DEX 文件dexFd = open(fileName, O_RDONLY);if (dexFd < 0) goto bail;/* If we fork/exec into dexopt, don't let it inherit the open fd. */dvmSetCloseOnExec(dexFd);// 校驗 DEX 文件 if (verifyMagicAndGetAdler32(dexFd, &adler32) < 0) {ALOGE("Error with header for %s", fileName);goto bail;}if (getModTimeAndSize(dexFd, &modTime, &fileSize) < 0) {ALOGE("Error with stat for %s", fileName);goto bail;}/** 查看緩存的文件是否匹配。如果是這樣,optFd將成為一個參考* 到緩存文件,并將被查找到剛剛超過“opt”* 標題。*/if (odexOutputName == NULL) {// 優化的過程 cachedName = dexOptGenerateCacheFileName(fileName, NULL);if (cachedName == NULL)goto bail;} else {cachedName = strdup(odexOutputName);}ALOGV("dvmRawDexFileOpen: Checking cache for %s (%s)",fileName, cachedName);optFd = dvmOpenCachedDexFile(fileName, cachedName, modTime,adler32, isBootstrap, &newFile, /*createIfMissing=*/true);if (optFd < 0) {ALOGI("Unable to open or create cache for %s (%s)",fileName, cachedName);goto bail;}locked = true;/** 如果optFd指向一個新文件(因為沒有緩存* 版本,或緩存的版本已過時),生成* 優化的DEX。返回的文件描述符仍處于鎖定狀態,* 并定位在剛好超過優化標題的位置。*/if (newFile) {u8 startWhen, copyWhen, endWhen;bool result;off_t dexOffset;dexOffset = lseek(optFd, 0, SEEK_CUR);result = (dexOffset > 0);if (result) {startWhen = dvmGetRelativeTimeUsec();result = copyFileToFile(optFd, dexFd, fileSize) == 0;copyWhen = dvmGetRelativeTimeUsec();}if (result) {result = dvmOptimizeDexFile(optFd, dexOffset, fileSize,fileName, modTime, adler32, isBootstrap);}if (!result) {ALOGE("Unable to extract+optimize DEX from '%s'", fileName);goto bail;}endWhen = dvmGetRelativeTimeUsec();ALOGD("DEX prep '%s': copy in %dms, rewrite %dms",fileName,(int) (copyWhen - startWhen) / 1000,(int) (endWhen - copyWhen) / 1000);}/** 映射緩存的版本。這會立即倒帶fd,因此* 不需要在任何地方尋找。*/if (dvmDexFileOpenFromFd(optFd, &pDvmDex) != 0) {ALOGI("Unable to map cached %s", fileName);goto bail;}if (locked) {/* unlock the fd */if (!dvmUnlockCachedDexFile(optFd)) {/* uh oh -- this process needs to exit or we'll wedge the system */ALOGE("Unable to unlock DEX file");goto bail;}locked = false;}ALOGV("Successfully opened '%s'", fileName);*ppRawDexFile = (RawDexFile*) calloc(1, sizeof(RawDexFile));(*ppRawDexFile)->cacheFileName = cachedName;(*ppRawDexFile)->pDvmDex = pDvmDex;cachedName = NULL; // don't free it belowresult = 0;bail:free(cachedName);if (dexFd >= 0) {close(dexFd);}if (optFd >= 0) {if (locked)(void) dvmUnlockCachedDexFile(optFd);close(optFd);}return result; }

總結

以上是生活随笔為你收集整理的【Android 逆向】整体加固脱壳 ( DexClassLoader 加载 dex 流程分析 | RawDexFile.cpp 分析 | dvmRawDexFileOpen函数读取 DEX 文件 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 精品亚洲精品 | 又爽又黄又无遮挡 | 99re视频在线 | 在线a免费 | 国产伦精品一区二区三区免费视频 | 精品午夜福利在线观看 | 久久久久久免费观看 | gav在线| 美女被变态侵犯 | 色播一区二区 | 免费av日韩 | 最好看的2019中文大全在线观看 | 一级特黄毛片 | 亚洲精品图区 | 国内视频自拍 | 亚洲天堂热 | 亚洲精品久久久久久久久久久久久 | 狠狠干在线| 一区二区视频国产 | 午夜影院免费体验区 | 青青青国产精品一区二区 | 国产乱子一区二区 | 亚洲av成人精品日韩在线播放 | 播金莲一级淫片aaaaaaa | 天天曰天天干 | 日本精品少妇 | 久久久久亚洲av成人片 | 91精品人妻一区二区三区四区 | 一级福利片 | 丰满少妇在线观看bd | 99热热久久 | 日本人dh亚洲人ⅹxx | 性农村xxxxx小树林 | 国产污视频在线播放 | 国产黄色av片 | 欧美xxxx18国产 | 任我爽在线 | 在线观看成年人网站 | 亚洲综合自拍偷拍 | 日本色偷偷 | 日韩中文字幕在线视频 | 色婷婷aⅴ一区二区三区 | 欧美精品观看 | 女儿的朋友5中汉字晋通话 欧美成人免费高清视频 | 国产福利在线导航 | 亚洲精品视频导航 | 色噜噜影院 | 国产激情无套内精对白视频 | 成人h动漫精品一区二区下载 | 欧美精品v国产精品v日韩精品 | 免费a视频在线观看 | 精品国产无码一区二区 | 精品日韩在线播放 | 国产亚洲欧美日韩精品一区二区三区 | av成人动漫| 欧美成人精品欧美一级乱黄 | 日本大尺度吃奶做爰视频 | 日日碰狠狠添天天爽无码 | 夜夜躁狠狠躁日日躁 | 中文字幕一区二区三区四区欧美 | 欧美一级α片 | 中文字幕人妻色偷偷久久 | 亚洲无码一区二区三区 | youjizz日韩 | 欧美日本中文 | 日韩深夜在线 | 欧美一区二区三区不卡视频 | 亚洲码中文 | 日本东京热一区二区三区 | 日韩福利网站 | 亚洲青春草 | 亚洲一页| 大陆极品少妇内射aaaaaa | 国产黄色精品视频 | 国产尤物在线视频 | 不卡视频在线播放 | 国产偷国产偷av亚洲清高 | 欧洲精品在线播放 | 色94色欧美| 另类性姿势bbwbbw | 波多野结衣简介 | 久久久夜色| 深爱五月综合网 | 手机在线观看av片 | 国精品一区 | 国产精选网站 | 色爽交| 午夜污片 | 国产精品久久久 | 不卡视频免费在线观看 | 亚州色图欧美色图| 精品国自产拍在线观看 | 在线看一级片 | 免费日批视频 | 久久精品视频在线 | 波多野结衣一区二区 | 国产亚洲精品成人a | 91玉足脚交嫩脚丫在线播放 | 欧美一区日韩一区 |