Android逆向之Xposed不重启手机替换hook代码(并不是简单替换字符串)

转载时请注明转载自:http://blog.csdn.net/qq_26914291/article/details/78445151

1.核心代码:

public void hook(final LoadPackageParam lpparam){
        final ClassLoader mXposedClassLoader=this.getClass().getClassLoader();//重要,获取当前类的classloader,通过lpparam.classLoader获取的不行!
        XposedHelpers.findAndHookMethod(Application.class,"onCreate",new XC_MethodHook(){//hook当前应用的入口类application的onCreate方法以获取当前应用的Context.
            public void beforeHookedMethod(XC_MethodHook.MethodHookParam param){
                Context app=(Context)param.thisObject;
                DexClassLoader loader=new DexClassLoader("/data/local/tmp/Main.dex",app.getDir("odex",Context.MODE_PRIVATE).getPath(),null,mXposedClassLoader);//动态加载目录下/data/local/tmp/Main.dex文件到mXposedClassLoader类加载器中,这样的话,我们就可以动态替换Main.dex达到动态更新hook代码的目的!
                try
                {
                    Class Main=Class.forName("larson.mhook.Main", false, loader);
                    Method main=Main.getDeclaredMethod("main",LoadPackageParam.class);
                    main.invoke(null,lpparam);//然后调用这个dex的入口函数,并传入lpparam参数
                }
                catch (Exception e)
                {
                    Log.d(TAG,"error:"+e.toString());

                }
            }
        });

    }

2.main.dex代码:

package larson.mhook;
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
import de.robv.android.xposed.IXposedHookLoadPackage;
import android.util.*;

public class Main
{
    public static final String TAG="XposedDex";

    public static void main(LoadPackageParam lpparam){//入口函数
        Log.d(TAG,"hook start!");
        //我们自己实现的hook代码
    }
}

3.调用

public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable {
        hook(lpparam);
    }

4.总结
1.知道了原来lpparam.classLoader与在hook代码中直接获取的classLoader不是同一个类加载器。
2.odex优化目录必须得是应用私有目录。
3.终于不用再每天重启几十次手机了。

你可能感兴趣的:(Android逆向之Xposed不重启手机替换hook代码(并不是简单替换字符串))