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

来源:互联网 发布:linux停机命令 编辑:程序博客网 时间:2024/06/02 05:31

转载时请注明转载自: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.终于不用再每天重启几十次手机了。

原创粉丝点击