【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )
文章目錄
- 一、動態加載
- 二、第一代加殼技術 ( DEX 整體加固 )
- 三、第二代加殼技術 ( 函數抽取 )
- 四、第三代加殼技術 ( Java 函數 -> Native 函數 )
- 五、so 動態庫加殼
一、動態加載
動態加載 : 調用 Java 類時 , 使用到的時候 , 才從 DEX 字節碼文件中加載對應的字節碼類 ;
熱修復 , DEX 加殼 , 插件化 , 都必須使用動態加載技術 ;
動態加載 的 Java 類只能完成一般的函數調用 , 如果加載的是一個 Activity 組件類 , 加載的類不具有組件生命周期的特性 , 不能當做正常的組件使用 ;
如果要正常使用 動態加載 的組件類 , 則需要對類加載器修正 , 有 222 種修正方法 ;
- 替換 LoadedApk 的類加載器 : 【Android 逆向】啟動 DEX 字節碼中的 Activity 組件 ( 替換 LoadedApk 中的類加載器 | 加載 DEX 文件中的 Activity 類并啟動成功 )
- 在 PathClassLoader 和 BootClassLoader 之間插入 DexClassLoader : 【Android 逆向】啟動 DEX 字節碼中的 Activity 組件 ( 在 PathClassLoader 和 BootClassLoader 之間插入 DexClassLoader )
二、第一代加殼技術 ( DEX 整體加固 )
第一代加殼技術 :
- DEX 字節碼文件整體加密
- 使用自定義 DexClassLoader 加載 DEX 文件
第一代殼的特征 : 在內存中 , DEX 文件是整體的連續的內存塊 , 如果找到了 DEX 文件的起始地址 , 可以很容易將整個 DEX 文件 dump 下來 ;
DEX 脫殼加載方案 :
- 文件加載 : 通過監控文件訪問記錄 , 也可以找到 DEX 文件 ;
- 內存加載 : 內存中的 DEX 文件是完整的 , 也可以從內存中加載 DEX 文件 ;
保護粒度是 DEX 整體文件 ;
三、第二代加殼技術 ( 函數抽取 )
第二代加殼技術 對 DEX 文件整體進行了保護 , 將其中的 關鍵代碼抽取到外部 , DEX 加載到內存中后 , 不是完整的 DEX 文件 , 即使將整個 DEX 文件 DUMP 下來之后 , 其中的一些被抽取出來的關鍵代碼無法看到 , 也就是 DEX 文件中的關鍵類或方法是空的 ;
第二代殼的特征是 內存中的 DEX 數據不是連續的 ;
DexHunter 工具 可以遍歷內存中所有類信息 , 將 DEX 完整的拼接出來 , 得到一個完整的 DEX 類 ;
保護的粒度由 DEX 細化為每個函數 ; 破解者可以將 DEX 文件拿到 , 但是其中的關鍵函數是空的 ;
四、第三代加殼技術 ( Java 函數 -> Native 函數 )
第三代加殼技術 : 將 Java 函數轉為 Native 函數 ;
- VMP 加殼
- Dex2C / Java2C
該類型的加殼保護效果是最強的 , 多數加固廠商的此類加殼都是需要付費的 ;
五、so 動態庫加殼
so 動態庫加殼 :
- 基于 init , init_array , JNI_Onload 函數進行加殼 ;
- 基于 自定義 linker 進行加殼 ;
總結
以上是生活随笔為你收集整理的【Android 逆向】加壳技术简介 ( 动态加载 | 第一代加壳技术 - DEX 整体加固 | 第二代加壳技术 - 函数抽取 | 第三代加壳技术 - VMP / Dex2C | 动态库加壳技术 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】GitHub 提交报错 (
- 下一篇: 【Android 逆向】加壳技术识别 (