先打一拳,打的时候再把问题问遍。

——蔚

前言

当我们在xposed进行反射调用的时候,很多时候被HOOK函数并不是static函数,但是我们在调用的时候需要传入该函数的类的实例,那实例我们怎么拿到呢,今天介绍几种办法拿到类的实例。

情况一

对于单例类,这个问题就变得简单了,我们只需要调用单例类的获取实例的函数,他会将实例返回,拿到后直接用就行。

单例类长这样:

如果你恰巧了解单例模式,那就很清楚了。

我们先通过反射调用getInstance函数(该函数一定是static)拿到该类的实例,再通过拿到的实例进行该类的其他非static函数调用。

情况二

非单例函数,这种时候如果类的初始化参数并不复杂,比如仅有一个Context或其他简单的参数,我们通过模拟参数,自行初始化一个实例,供后续反射调用使用。

不过用该方案是有一定风险的,对于业务比较复杂的类,很可能在实例化之后还要进行一些参数设置等操作,我们很容易遗漏,导致最终实例并不完全,后续反射调用出错。

所以该方案只用在业务比较简单清晰的类,比如一些算法类。

情况三

对于上述不能解决的,我们都可以用该方案来解决。

需要用到A类,那么该类一定已经被APP本身实例化过了,如果我们拿到这个实例,那肯定是正常可用的。这个时候我们还是需要借助HOOK来拿到这个实例,再将其用到反射调用中去。

基本步骤是:

(假定目标函数为A类的bb函数,但是bb函数是非static,A类也非单例类)HOOK A类的任意函数(包括bb函数,该函数会被触发即可)

再hook到的地方保存实例到全局map中(见下图,setInst是我自己定义的函数,用于保存这对kv到map)

需要使用该实例的地方从全局map中拿到实例正常执行反射调用B函数

看个例子:

这样我们就实现了反射调用。

需要注意的是,我们这样写,得保证在反射调用之前,已经拿到了hook到的实例,即业务正常触发到了这个HOOK,不然使用的这端拿不到实例,执行会报错的。(也就是,用之前,在APP上划拉几下)

好了,有了以上三招,反射调用就不会愁拿不到实例的问题了。