【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )
文章目錄
- 一、創(chuàng)建用戶自定義 Application
- 二、替換 ContextImpl 對象的 mOuterContext 成員
dex 解密時 , 需要將 代理 Application 替換為 真實 Application ; 替換 Application 首先要理解系統(tǒng)如何注冊應(yīng)用的 Application 的 ;
上一篇博客 【Android 安全】DEX 加密 ( Application 替換 | 判定自定義 Application 存在 | 獲取 ContextImpl 對象 ) , 繼續(xù)后續(xù)步驟 ;
一、創(chuàng)建用戶自定義 Application
獲取 app_name 元數(shù)據(jù) , 該元數(shù)據(jù)就是用戶自定義的 Application 的全類型 , 即 包名.類名 , 這里是 kim.hsl.dex.MyApplication ;
通過 反射 獲取 Application 類 , 系統(tǒng)也是進行的反射操作 , 并創(chuàng)建用戶真實配置的 Application ;
// 通過反射獲取 Application , 系統(tǒng)也是進行的反射操作Class<?> delegateClass = Class.forName(app_name);// 創(chuàng)建用戶真實配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();調(diào)用 Application 的 attach 函數(shù) , 該函數(shù)無法直接調(diào)用 , 也需要通過反射調(diào)用 , 該方法是私有的 , 需要 設(shè)置 attach 方法允許訪問 ;
// 調(diào)用 Application 的 attach 函數(shù)// 該函數(shù)無法直接調(diào)用 , 也需要通過反射調(diào)用// 這里先通過反射獲取 Application 的 attach 函數(shù)Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 設(shè)置 attach 方法允許訪問attach.setAccessible(true);attach 方法需要傳入兩個參數(shù) , Application 對象 和 Context 對象 ,
該 Context 是通過調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl , 因此通過調(diào)用 getBaseContext() 方法即可獲取 Context 對象 ;
將上面 delegateClass.newInstance() 創(chuàng)建的 Application 對象 , 和 getBaseContext() 獲取的 Context 對象 , 傳入 attach 方法中 , 即可創(chuàng)建完整的 Application 對象 ;
// 獲取上下文對象 ,// 該 Context 是通過調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl// 將該上下文對象傳入 Application 的 attach 方法中attach.invoke(delegate, baseContext);本步驟完整代碼示例 :
// 獲取上下文對象 , 保存下來 , 之后要使用Context baseContext = getBaseContext();// 通過反射獲取 Application , 系統(tǒng)也是進行的反射操作Class<?> delegateClass = Class.forName(app_name);// 創(chuàng)建用戶真實配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();// 調(diào)用 Application 的 attach 函數(shù)// 該函數(shù)無法直接調(diào)用 , 也需要通過反射調(diào)用// 這里先通過反射獲取 Application 的 attach 函數(shù)Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 設(shè)置 attach 方法允許訪問attach.setAccessible(true);// 獲取上下文對象 ,// 該 Context 是通過調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl// 將該上下文對象傳入 Application 的 attach 方法中attach.invoke(delegate, baseContext);二、替換 ContextImpl 對象的 mOuterContext 成員
ContextImpl 的 private Context mOuterContext 成員是 kim.hsl.multipledex.ProxyApplication 對象 , 這是外層的殼 Application , 現(xiàn)在替換成上面創(chuàng)建的用戶自定義的 kim.hsl.dex.MyApplication 對象 ;
首先通過反射獲取 ContextImpl 類 ,
Class<?> contextImplClass = Class.forName("android.app.ContextImpl");然后獲取類成員 mOuterContext 字段 ,
// 獲取 ContextImpl 中的 mOuterContext 成員Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");設(shè)置反射中私有成員的可訪問性 ,
// mOuterContext 成員是私有的 , 設(shè)置可訪問性mOuterContextField.setAccessible(true);ContextImpl 就是應(yīng)用的 Context , 直接通過 getBaseContext() 獲取即可 ,
// ContextImpl 就是應(yīng)用的 Context , 直接通過 getBaseContext() 獲取即可mOuterContextField.set(baseContext, delegate);本步驟完整代碼 :
// I . 替換 ① ContextImpl 的 private Context mOuterContext// 成員是 kim.hsl.multipledex.ProxyApplication 對象Class<?> contextImplClass = Class.forName("android.app.ContextImpl");// 獲取 ContextImpl 中的 mOuterContext 成員Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");// mOuterContext 成員是私有的 , 設(shè)置可訪問性mOuterContextField.setAccessible(true);// ContextImpl 就是應(yīng)用的 Context , 直接通過 getBaseContext() 獲取即可mOuterContextField.set(baseContext, delegate);總結(jié)
以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 安全】DEX 加密 (
- 下一篇: 【错误记录】Android NDK 错误