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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

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

Android

【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )

發(fā)布時(shí)間:2025/6/17 Android 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 ) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 一、創(chuàng)建用戶(hù)自定義 Application
  • 二、替換 ContextImpl 對(duì)象的 mOuterContext 成員



dex 解密時(shí) , 需要將 代理 Application 替換為 真實(shí) Application ; 替換 Application 首先要理解系統(tǒng)如何注冊(cè)應(yīng)用的 Application 的 ;

上一篇博客 【Android 安全】DEX 加密 ( Application 替換 | 判定自定義 Application 存在 | 獲取 ContextImpl 對(duì)象 ) , 繼續(xù)后續(xù)步驟 ;





一、創(chuàng)建用戶(hù)自定義 Application



獲取 app_name 元數(shù)據(jù) , 該元數(shù)據(jù)就是用戶(hù)自定義的 Application 的全類(lèi)型 , 即 包名.類(lèi)名 , 這里是 kim.hsl.dex.MyApplication ;

通過(guò) 反射 獲取 Application 類(lèi) , 系統(tǒng)也是進(jìn)行的反射操作 , 并創(chuàng)建用戶(hù)真實(shí)配置的 Application ;

// 通過(guò)反射獲取 Application , 系統(tǒng)也是進(jìn)行的反射操作Class<?> delegateClass = Class.forName(app_name);// 創(chuàng)建用戶(hù)真實(shí)配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();

調(diào)用 Application 的 attach 函數(shù) , 該函數(shù)無(wú)法直接調(diào)用 , 也需要通過(guò)反射調(diào)用 , 該方法是私有的 , 需要 設(shè)置 attach 方法允許訪(fǎng)問(wèn) ;

// 調(diào)用 Application 的 attach 函數(shù)// 該函數(shù)無(wú)法直接調(diào)用 , 也需要通過(guò)反射調(diào)用// 這里先通過(guò)反射獲取 Application 的 attach 函數(shù)Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 設(shè)置 attach 方法允許訪(fǎng)問(wèn)attach.setAccessible(true);

attach 方法需要傳入兩個(gè)參數(shù) , Application 對(duì)象 Context 對(duì)象 ,

該 Context 是通過(guò)調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl , 因此通過(guò)調(diào)用 getBaseContext() 方法即可獲取 Context 對(duì)象 ;

將上面 delegateClass.newInstance() 創(chuàng)建的 Application 對(duì)象 , 和 getBaseContext() 獲取的 Context 對(duì)象 , 傳入 attach 方法中 , 即可創(chuàng)建完整的 Application 對(duì)象 ;

// 獲取上下文對(duì)象 ,// 該 Context 是通過(guò)調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl// 將該上下文對(duì)象傳入 Application 的 attach 方法中attach.invoke(delegate, baseContext);

本步驟完整代碼示例 :

// 獲取上下文對(duì)象 , 保存下來(lái) , 之后要使用Context baseContext = getBaseContext();// 通過(guò)反射獲取 Application , 系統(tǒng)也是進(jìn)行的反射操作Class<?> delegateClass = Class.forName(app_name);// 創(chuàng)建用戶(hù)真實(shí)配置的 ApplicationApplication delegate = (Application) delegateClass.newInstance();// 調(diào)用 Application 的 attach 函數(shù)// 該函數(shù)無(wú)法直接調(diào)用 , 也需要通過(guò)反射調(diào)用// 這里先通過(guò)反射獲取 Application 的 attach 函數(shù)Method attach = Application.class.getDeclaredMethod("attach", Context.class);// attach 方法是私有的 , 設(shè)置 attach 方法允許訪(fǎng)問(wèn)attach.setAccessible(true);// 獲取上下文對(duì)象 ,// 該 Context 是通過(guò)調(diào)用 Application 的 attachBaseContext 方法傳入的 ContextImpl// 將該上下文對(duì)象傳入 Application 的 attach 方法中attach.invoke(delegate, baseContext);



二、替換 ContextImpl 對(duì)象的 mOuterContext 成員



ContextImpl 的 private Context mOuterContext 成員是 kim.hsl.multipledex.ProxyApplication 對(duì)象 , 這是外層的殼 Application , 現(xiàn)在替換成上面創(chuàng)建的用戶(hù)自定義的 kim.hsl.dex.MyApplication 對(duì)象 ;

首先通過(guò)反射獲取 ContextImpl 類(lèi) ,

Class<?> contextImplClass = Class.forName("android.app.ContextImpl");

然后獲取類(lèi)成員 mOuterContext 字段 ,

// 獲取 ContextImpl 中的 mOuterContext 成員Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");

設(shè)置反射中私有成員的可訪(fǎng)問(wèn)性 ,

// mOuterContext 成員是私有的 , 設(shè)置可訪(fǎng)問(wèn)性mOuterContextField.setAccessible(true);

ContextImpl 就是應(yīng)用的 Context , 直接通過(guò) getBaseContext() 獲取即可 ,

// ContextImpl 就是應(yīng)用的 Context , 直接通過(guò) getBaseContext() 獲取即可mOuterContextField.set(baseContext, delegate);

本步驟完整代碼 :

// I . 替換 ① ContextImpl 的 private Context mOuterContext// 成員是 kim.hsl.multipledex.ProxyApplication 對(duì)象Class<?> contextImplClass = Class.forName("android.app.ContextImpl");// 獲取 ContextImpl 中的 mOuterContext 成員Field mOuterContextField = contextImplClass.getDeclaredField("mOuterContext");// mOuterContext 成員是私有的 , 設(shè)置可訪(fǎng)問(wèn)性mOuterContextField.setAccessible(true);// ContextImpl 就是應(yīng)用的 Context , 直接通過(guò) getBaseContext() 獲取即可mOuterContextField.set(baseContext, delegate);

總結(jié)

以上是生活随笔為你收集整理的【Android 安全】DEX 加密 ( Application 替换 | 创建用户自定义 Application | 替换 ContextImpl 对象的 mOuterContext 成员 )的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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