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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )

發(fā)布時間:2025/6/17 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 ) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 一、脫殼點簡介
  • 二、修改系統(tǒng)源碼進行脫殼





一、脫殼點簡介



在上一篇博客 【Android 逆向】整體加固脫殼 ( DEX 優(yōu)化流程分析 | DexPrepare.cpp 中 rewriteDex 函數(shù)分析 | 脫殼點 | 獲取 dex 文件在內(nèi)存中的首地址 ) 中 , 提到了 222 個脫殼點 :

  • ① /dalvik/vm/DvmDex.cpp 的 dvmDexFileOpenPartial 方法
  • ② /dalvik/libdex/DexFile.cpp 的 dexFileParse 方法

可以脫殼的 HOOK 點函數(shù) , 不止上面 222 個 , 凡是函數(shù)中有 DEX 文件首地址的函數(shù)都可以作為脫殼點 ; 如 : DexPrepare.cpp 中 rewriteDex() 方法 也可以作為脫殼點 ;


HOOK 上面的 dvmDexFileOpenPartial 或 dexFileParse 方法 , 之后獲取這兩個方法的參數(shù) , 第一個參數(shù)是 DEX 文件在內(nèi)存中的首地址 , 第二個參數(shù)是 DEX 文件的字節(jié)長度 ;

使用 Xposed , Frida 可以對上述函數(shù)進行 HOOK 操作 ;





二、修改系統(tǒng)源碼進行脫殼



這里對 Android 系統(tǒng)的源碼進行簡單的修改 , 然后進行脫殼操作 , 這里的脫殼其實就是將 dex 文件在 內(nèi)存的起始地址 ;

/* 記錄當(dāng)前 dex 文件索引 */ int dexCount = 0;/** 為“部分”DEX創(chuàng)建DexFile結(jié)構(gòu)。這是一個在* 被優(yōu)化的過程。優(yōu)化標(biāo)頭未完成* 我們沒有任何輔助數(shù)據(jù)表,所以我們必須這樣做* 初始化過程略有不同。* * 錯誤時返回非零。*/ int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex) {// 系統(tǒng)啟動后 , 可能會生成很多 dex 文件 , // DEX 文件保存路徑char output[50]={0};// 獲取當(dāng)前進程 ID , 這是為了區(qū)分準(zhǔn)備的 int pid = getpid();// 生成文件名稱 , 由于單個 APK 可能有多個 DEX 文件 // 這里將每個 DEX 文件的 進程 ID 和 DEX 文件字節(jié)大小 // 放入 DEX 文件名中 , 加以識別sprintf(output, "/sdcard/%d_%d_output.dex", pid, dexCount);// dex 文件索引自增dexCount++;// 以寫的方式 , 打開文件 , 如果沒有就創(chuàng)建該文件int fd = open(output, "wb+");// 文件打開成功 , 則 dump 內(nèi)存數(shù)據(jù)到 /sdcard/output.dex 文件中if (fd > 0){// 將 addr 地址的內(nèi)存數(shù)據(jù)拷貝到 fd 文件中 , 拷貝 len 字節(jié)write(fd, addr, len);// 關(guān)閉文件 close(fd);}DvmDex* pDvmDex;DexFile* pDexFile;int parseFlags = kDexParseDefault;int result = -1;/* -- 文件不完整,尚未計算新校驗和if (gDvm.verifyDexChecksum)parseFlags |= kDexParseVerifyChecksum;*/pDexFile = dexFileParse((u1*)addr, len, parseFlags);if (pDexFile == NULL) {ALOGE("DEX parse failed");goto bail;}pDvmDex = allocateAuxStructures(pDexFile);if (pDvmDex == NULL) {dexFileFree(pDexFile);goto bail;}pDvmDex->isMappedReadOnly = false;*ppDvmDex = pDvmDex;result = 0;bail:return result; }

源碼路徑 : /dalvik/vm/DvmDex.cpp

然后編譯該 Android 4.4.4 源碼 , 在該源碼編譯的 模擬器 上執(zhí)行要脫殼的應(yīng)用 , 或者直接將該源碼刷到 Google 手機 / 開發(fā)版上 , 運行該系統(tǒng) ;

在上述系統(tǒng)中 , 運行要脫殼的應(yīng)用 , 會自動將 DEX 文件輸出到 SD 卡中的指定的 /sdcard/pid_dexCount_output.dex 目錄中 ;

總結(jié)

以上是生活随笔為你收集整理的【Android 逆向】整体加固脱壳 ( 脱壳点简介 | 修改系统源码进行脱壳 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。