PAGalaxyLab / VirtualHook

Android application hooking tool based on VirtualApp
757 stars 128 forks source link

如何在hook插件里面获得虚拟化app的Application对象 #9

Closed wjy000 closed 7 years ago

wjy000 commented 7 years ago

大神,早上好 如题,麻烦解答一下,非常感谢

rk700 commented 7 years ago

暂时没有办法,VirtualHook中hook插件的加载是在Application创建结束之后,hook不到attachBaseContext()onCreate()

wjy000 commented 7 years ago

大神,这个真的非常重要,我想做个操作虚拟化app的hook 插件.所以必须获得Application对象. 既然不能通过hook的方法获得Application,那能不能从va上面下手呢?我刚接触你项目几天,也一直研究了几天,对va和yahfa也不太了解,麻烦你指导一下

rk700 commented 7 years ago

可以在VirtualApp基础上添加你的需求,VClientImpl()中可以拿到Application对象

wjy000 commented 7 years ago

但是我直接调用VClientImpl().get() 获得的对象是被重写new了的,和加载的时候不是同一个,可以说的具体一点吗?谢谢

rk700 commented 7 years ago

VClientImpl中的mInitialApplication是Application对象,具体阅读VirtualApp源码

wjy000 commented 7 years ago

找到一个完美的解决方案了,在hookInfo里面写一个Application静态变量,再加载插件的时候利用反射给这个变量赋值,当然任何数据都能通过这个方法进行赋值,给后来人一个参考吧,下面是代码 public void doHookDefault (ClassLoader patchClassLoader, ClassLoader originClassLoader, Application application) { try { Class<?> hookInfoClass = Class.forName("zpp.wjy.xvirtual.patch.HookInfo", true, patchClassLoader);

        hookInfoClass.getMethod("init", Application.class).invoke(hookInfoClass.newInstance(), application);

        String[] hookItemNames = (String[]) hookInfoClass.getField("hookItemNames").get(null);
        for (String hookItemName : hookItemNames)
        {
            doHookItemDefault_xv(patchClassLoader, hookItemName, originClassLoader);
        }
    } catch (Exception e)
    {
        e.printStackTrace();
    }
}