xposed调用substrate的一些思考

//1.就是实现substrate调用的模块的位置一定要在Global.config中设置。
//2.这个调用会在每个包的调用过程中实现加载native层的hook代码。
//3.要hook的库的路径这里也可以写死,因为我们hook的是系统的函数,不用hook第三方的库
//4.最后就是我们写的nativehook的so文件的代码位置。这个也可以固定,我们每增加一个nativehook,就要在interface的文件里添加相应的实现。
//综上,源代码中的frame和interface的so不用传递参数,我们直接写死,包名传递已经实现。
//唯一需要变化的是系统libso的位置,

路径的问题,我们可以确定,不需要从java层传递到native层这样实现。

我们只需要在interface中硬编码或者直接读取lib的路径。

但一般来讲,系统libso在内存中已经加载过一次,我们似乎不用再次加载。

1.如果不再次加载,我们无法得到模块的基地址,也是个问题。如果我们再次加载系统模块,那这两个相同的模块会不会冲突。

2.两次加载进内存的模块到底在调用的过程中是哪一个执行了也是个问题。

3还有个严重的问题这里的substrate的实现也是采用的系统函数实现的,也就是说必然后部分系统函数是无法hook的。否者就是死循环。那么那些函数是无法hook的,我也不确定。

简直了。

原来加载过的so 在内存中是有map文件的

首先我们的插件在加载substrate实现nativehook的时候,使用的自己的pid,也就是说,我们系寻找自己pid下面的函数。
那这样我们就很容易获取到所用系统native函数的基地址。

我们现有的hook框架实现的是远程注入。

个人觉得hook 系统native不用再dlopen进行专门的处理,因为map中已经映射了所有函数的地址。我们只需要那我们的需要的东西就行了。

如果是第三方的so就不一样了,我们不确定这些库在什么时候会被加载到内存中,所以没有一个好的时机获取这些信息。
为了解决这个问题,我们需要实现hook dlopen ,因为dlopen 是加载so的必经之路,而且通过dlopen 的参数我们可以轻易的获取到加载的模块的基地址和函数地址。这样hooK的时候就会方便。

substrate hook 的特点就是必须要有函数的地址,然后我们构造和原始函数一样的申明和调用,就可以利用substra实现hook

系统函数可以轻易获取,所以我们不需要在dlopen的地方进行特殊的处理。

也就是说,我们根本不需要专门写第二so 来操作hook的代码。interface的模块式可以取消的。

总的利用方式:
xposed挂钩每一个应用的system.load函数是想加载我们自己的调用substrate.lib的c层代码。

    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        if (off == false)
        {
            flushConfig();
        }
        if (!loadPackageParam.packageName.equals(GlobalConfig.Inject_PackageName))
            return;
        Class clazz = XposedHelpers.findClass("java.lang.System", loadPackageParam.classLoader); //使用注入包的类加载器来反射查找System.load函数,从而调用加载自己的框架so
        if(clazz == null)
        {
            XposedBridge.log("[-] not found class: " + "java.lang.System");
            Log.e(GlobalConfig.Log_TAG, "[-] can't found class: " + "java.lang.System");
            return;
        }
        Log.e(GlobalConfig.Log_TAG, "[+] found class: " + "java.lang.System");
        Method method = XposedHelpers.findMethodExact(clazz, "load", String.class);//查找system.load函数
        if (method == null)
        {
            Log.e(GlobalConfig.Log_TAG, "[-] can't found function: " + method.getName());
        }
        Log.e(GlobalConfig.Log_TAG, "[+] found function: " + method.getName());
        method.invoke(null, GlobalConfig.Inject_SoPath);//加载待注入库
    }

这里GlobalConfig.Inject_SoPath就是我们调用substrate.lib入口,原本的设计是通过加载frame继而加载interface,我们的hook在interface当中实现。
这样的设计的方便之处在于灵活的判断加载不同的lib的时机,借以实现hook.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值