【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )
Android 插件化系列文章目錄
【Android 插件化】插件化簡介 ( 組件化與插件化 )
【Android 插件化】插件化原理 ( JVM 內(nèi)存數(shù)據(jù) | 類加載流程 )
【Android 插件化】插件化原理 ( 類加載器 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 原理與實現(xiàn)思路 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 類加載器創(chuàng)建 | 資源加載 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 獲取插件入口 Activity 組件 | 加載插件 Resources 資源 )
【Android 插件化】“ 插樁式 “ 插件化框架 ( 運行應(yīng)用 | 代碼整理 )
【Android 插件化】Hook 插件化框架 ( Hook 技術(shù) | 代理模式 | 靜態(tài)代理 | 動態(tài)代理 )
【Android 插件化】Hook 插件化框架 ( Hook 實現(xiàn)思路 | Hook 按鈕點擊事件 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動過程 | 靜態(tài)代理 )
【Android 插件化】Hook 插件化框架 ( 從 Hook 應(yīng)用角度分析 Activity 啟動流程 一 | Activity 進程相關(guān)源碼 )
【Android 插件化】Hook 插件化框架 ( 從 Hook 應(yīng)用角度分析 Activity 啟動流程 二 | AMS 進程相關(guān)源碼 | 主進程相關(guān)源碼 )
【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )
【Android 插件化】Hook 插件化框架 ( 通過反射獲取 “插件包“ 中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 通過反射獲取 “宿主“ 應(yīng)用中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 與 “宿主“ 中的 Element[] dexElements | 設(shè)置合并后的 Element[] 數(shù)組 )
【Android 插件化】Hook 插件化框架 ( 創(chuàng)建插件應(yīng)用 | 拷貝插件 APK | 初始化插件包 | 測試插件 DEX 字節(jié)碼 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | Hook 點分析 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | 反射獲取 IActivityManager 對象 )
文章目錄
- Android 插件化系列文章目錄
- 前言
- 一、反射相關(guān)源碼說明
- 1、Instrumentation
- 2、ActivityManager
- 3、Singleton
- 二、反射獲取 IActivityManager 對象
- 1、反射獲取 ActivityManager 類
- 2、反射獲取 IActivityManagerSingleton 字段
- 3、反射獲取 IActivityManagerSingleton 對象
- 4、反射獲取 Singleton 類
- 5、反射獲取 mInstance 字段
- 6、反射獲取 mInstance 字段
- 三、完整代碼
- 四、博客資源
前言
在上一篇博客 【Android 插件化】Hook 插件化框架 ( Hook Activity 啟動流程 | Hook 點分析 ) 中分析了 Activity 啟動過程中的 Hook 點 ;
本篇博客中開始進行 Hook Activity 的操作 ;
一、反射相關(guān)源碼說明
1、Instrumentation
在 Instrumentation 中的 execStartActivity 方法 , 在最后 , 通過如下代碼 , 啟動 Activity ;
public class Instrumentation {public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);} }源碼路徑 : /frameworks/base/core/java/android/app/Instrumentation.java
2、ActivityManager
ActivityManager.getService() 是靜態(tài)方法 , 只要反射 ActivityManager 類之后 , 就可以直接調(diào)用該 getService 靜態(tài)方法 ;
ActivityManager 中的 IActivityManagerSingleton 成員是 Singleton<IActivityManager> 類型的 , 其中的單例變量是 mInstance ;
public class ActivityManager {/*** @hide*/public static IActivityManager getService() {return IActivityManagerSingleton.get();}private static final Singleton<IActivityManager> IActivityManagerSingleton =new Singleton<IActivityManager>() {@Overrideprotected IActivityManager create() {final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);final IActivityManager am = IActivityManager.Stub.asInterface(b);return am;}}; }源碼路徑 : /frameworks/base/core/java/android/app/ActivityManager.java
3、Singleton
Singleton 類是單例的實現(xiàn) , 注意該類只能由系統(tǒng)使用 , 應(yīng)用開發(fā)者不能調(diào)用 ;
package android.util;/*** Singleton helper class for lazily initialization.** Modeled after frameworks/base/include/utils/Singleton.h** @hide*/ public abstract class Singleton<T> {private T mInstance;protected abstract T create();public final T get() {synchronized (this) {if (mInstance == null) {mInstance = create();}return mInstance;}} }源碼路徑 : /frameworks/base/core/java/android/util/Singleton.java
二、反射獲取 IActivityManager 對象
1、反射獲取 ActivityManager 類
首先反射獲取 獲取 android.app.ActivityManager 類 ;
反射代碼 :
// 獲取 android.app.ActivityManager 類 Class<?> activityManagerClass = null; try {activityManagerClass = Class.forName("android.app.ActivityManager"); } catch (ClassNotFoundException e) {e.printStackTrace(); }2、反射獲取 IActivityManagerSingleton 字段
獲取 ActivityManager 類中的 的 IActivityManagerSingleton 成員字段 , 下面是該字段的完整聲明 ; 注意凡是涉及到字段獲取 , 一般都要設(shè)置其可見性為 true ;
( 一般情況下 , 只有非 public 的字段才需要使用反射方式獲取 )
反射代碼 :
// 獲取 android.app.ActivityManager 類 中的 IActivityManagerSingleton 屬性 // private static final Singleton<IActivityManager> IActivityManagerSingleton 成員變量 Field iActivityManagerSingletonField = null; try {iActivityManagerSingletonField =activityManagerClass.getDeclaredField("IActivityManagerSingleton");// 設(shè)置成員字段的可訪問性iActivityManagerSingletonField.setAccessible(true); } catch (NoSuchFieldException e) {e.printStackTrace(); }3、反射獲取 IActivityManagerSingleton 對象
獲取 android.app.ActivityManager 類的靜態(tài)成員變量 , 直接調(diào)用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 傳入 null 即可獲取 ;
// 獲取 android.app.ActivityManager 類的靜態(tài)成員變量 // private static final Singleton<IActivityManager> IActivityManagerSingleton // 直接調(diào)用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 傳入 null 即可獲取 Object iActivityManagerSingletonObject = null; try {iActivityManagerSingletonObject = iActivityManagerSingletonField.get(null); } catch (IllegalAccessException e) {e.printStackTrace(); }4、反射獲取 Singleton 類
在 ActivityManager 中 , IActivityManagerSingleton 成員是 Singleton<IActivityManager> 類型的 ,
private static final Singleton<IActivityManager> IActivityManagerSingleton通過反射獲取 android.util.Singleton 類 ;
// 獲取 Singleton 類 // ActivityManager 中的 IActivityManagerSingleton 成員是 Singleton<IActivityManager> 類型的 Class<?> singletonClass = null; try {singletonClass = Class.forName("android.util.Singleton"); } catch (ClassNotFoundException e) {e.printStackTrace(); }5、反射獲取 mInstance 字段
// 反射獲取 Singleton 類中的 mInstance 字段 Field mInstanceField = null; try {mInstanceField = singletonClass.getDeclaredField("mInstance");// 設(shè)置字段的可訪問性mInstanceField.setAccessible(true); } catch (NoSuchFieldException e) {e.printStackTrace(); }
6、反射獲取 mInstance 字段
反射獲取 Singleton 類中的 mInstance 成員對象 , 該 mInstanceObject 成員對象就是 IActivityManager ;
// 反射獲取 Singleton 類中的 mInstance 成員對象 // 該 mInstanceObject 成員對象就是 IActivityManager // private static final Singleton<IActivityManager> IActivityManagerSingleton Object mInstanceObject = null; try {mInstanceObject = mInstanceField.get(iActivityManagerSingletonObject); } catch (IllegalAccessException e) {e.printStackTrace(); }三、完整代碼
package kim.hsl.plugin;import java.lang.reflect.Field;/*** 主要職責(zé) : Hook Activity 的啟動過程* 本工具類只針對 API Level 28 實現(xiàn) , 如果是完整插件化框架 , 需要實現(xiàn)所有版本的 Hook 過程* 不同的版本 , Activity 的啟動過程是不同的 , 需要逐個根據(jù) Activity 啟動源碼進行 Hook 適配*/ public class HookUtils {/*** 最終目的是劫持 ActivityManagerService 的 startActivity 方法 ,* 修改 Intent 中藥啟動的 Activity 類*/public static void hookAms(){// 獲取 android.app.ActivityManager 類Class<?> activityManagerClass = null;try {activityManagerClass = Class.forName("android.app.ActivityManager");} catch (ClassNotFoundException e) {e.printStackTrace();}// 獲取 android.app.ActivityManager 類 中的 IActivityManagerSingleton 屬性// private static final Singleton<IActivityManager> IActivityManagerSingleton 成員變量Field iActivityManagerSingletonField = null;try {iActivityManagerSingletonField =activityManagerClass.getDeclaredField("IActivityManagerSingleton");// 設(shè)置成員字段的可訪問性iActivityManagerSingletonField.setAccessible(true);} catch (NoSuchFieldException e) {e.printStackTrace();}// 獲取 android.app.ActivityManager 類的靜態(tài)成員變量// private static final Singleton<IActivityManager> IActivityManagerSingleton// 直接調(diào)用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 傳入 null 即可獲取Object iActivityManagerSingletonObject = null;try {iActivityManagerSingletonObject = iActivityManagerSingletonField.get(null);} catch (IllegalAccessException e) {e.printStackTrace();}// 獲取 Singleton 類// ActivityManager 中的 IActivityManagerSingleton 成員是 Singleton<IActivityManager> 類型的Class<?> singletonClass = null;try {singletonClass = Class.forName("android.util.Singleton");} catch (ClassNotFoundException e) {e.printStackTrace();}// 反射獲取 Singleton 類中的 mInstance 字段Field mInstanceField = null;try {mInstanceField = singletonClass.getDeclaredField("mInstance");// 設(shè)置字段的可訪問性mInstanceField.setAccessible(true);} catch (NoSuchFieldException e) {e.printStackTrace();}// 反射獲取 Singleton 類中的 mInstance 成員對象// 該 mInstanceObject 成員對象就是 IActivityManager// private static final Singleton<IActivityManager> IActivityManagerSingletonObject mInstanceObject = null;try {mInstanceObject = mInstanceField.get(iActivityManagerSingletonObject);} catch (IllegalAccessException e) {e.printStackTrace();}}}
四、博客資源
博客資源 :
- GitHub : https://github.com/han1202012/Plugin_Hook
總結(jié)
以上是生活随笔為你收集整理的【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Android 插件化】Hook 插件
- 下一篇: 【Android 插件化】Hook 插件