天天看點

Xposed架構之子產品安裝驗證方法

最近在開發關于xposed方面的應用的時候,需要進行子產品驗證。我們知道xposed架構可以好hook應用的方法。但是在xposed的入口函數内是得不到Context對象的,之前想在

handleLoadPackage方法内進行廣播,然後在廣播内修改一下SharedPreferences的鍵值來判斷子產品是否安裝,因為得不到Context對象,是以沒法用廣播。後來想到2個方法。      
方法一:在主Activity中添加一個需要被hook掉的函數如下:      
//用于判斷子產品是否安裝
	public static  String getResult(){
		return "未安裝";
	}
           
因為是預設的未安裝,我們hook一下這個函數,令其傳回值為已安裝。如果hook成功,則代表已經安裝,否則就沒安裝。
代碼      
XSharedPreferences xpre = new XSharedPreferences("com.mero.wyt_register",Config.ID);
            final Class<?> thiz = XposedHelpers.findClass("com.mero.wyt_register.MainActivity",lpparam.classLoader);
            try{
                hookMethod(thiz,"getResult","已安裝");
            }catch (Exception e){
                e.printStackTrace();
           
           
hookMethod代碼如下:
private void hookMethod(final Class<?> clz, String methodName,final String result) {
        XposedHelpers.findAndHookMethod(clz,methodName,new Object[]{
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
//                        super.beforeHookedMethod(param);

                    }

                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                        super.afterHookedMethod(param);
                        param.setResult(result);
                        XposedBridge.log("正在測試beforeHookedMethod");
                    }
                }
        });
           
方法二:擷取Context對象。
我們可以擷取全局的Context對象。首先,我們建立立一個MyApplication的類繼承自Application類。      
public class MyApplication extends Application {
    public static MyApplication instance;
    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }
    public static MyApplication getMyApplication(){
        return instance;
    }
}
           
另外在配置檔案中添加:Android:name = ".MyApplication";代碼示範如下:
<application
        android:name=".MyApplication"
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@android:style/Theme.NoTitleBar">
           
同樣我們hook掉getMyApplication函數,在下面函數中拿到Context對象。
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                        super.afterHookedMethod(param);
                        param.setResult(result);
                        XposedBridge.log("正在測試beforeHookedMethod");
                        Context context = (Context) param.thisObject;
                    }
                }
           
記得把Context對象改成全局變量。這樣就可以發送廣播了。在廣播裡利用SharedPreferences對象儲存一個字元串。随機什麼都行。然後再在驗證子產品安裝的地方得到這個字元串,判斷是否與預設的也就是SharedPrefences對象
預設的getString(key,value);也就是這個value,假如你在這得到的數值和廣播中發送的不一樣,那麼就代表hook不成功,也就是說你的子產品還沒有安裝。