Frida通过两种方法,getAnyObjectType和getArrayType,实现Java和JavaScript之间的交互。getAnyObjectType主要负责对象间的转换,它提供了一种从JavaScript到JNI和从JNI到JavaScript的桥梁,允许这两种环境中的对象互相传递。这个方法返回的对象包含name、type、size和defaultValue等属性,用于描述Java类型的基础信息。
相比之下,getArrayType特别关注JavaScript数组和Java数组的转换,确保在两种环境间传递数组类型的对象时能正确操作。它同样关注于类型实例的转换,以保证数据的准确传递。
在处理ClassWrapper时,Frida采取了独特的策略。ClassWrapper用于调用Java方法,它通过factory._getType创建type。Frida通过使用字典缓存,避免频繁创建ClassHandle,因为JNI全局表有数量限制。非数组类型使用字典缓存确保复用性,而Type和ClassWrapper紧密关联,Type需要jclass来调用JNI,此时会创建ClassWrapper并利用字典缓存管理。
对于自定义类加载器,Frida根据是否存在进行不同的处理。如果提供了自定义loader,它会使用特定的makeLoaderClassHandleGetter获取类句柄,否则则使用makeBasicClassHandleGetter。若自定义loader先于app classloader加载,可能会影响app类的hook,因为JVM的双亲委派模型会在平级的app classloader找不到类时寻找。
在特定情况下,如需要在app启动前注入自定义dex,可能需要调整makeLoaderClassHandleGetter的逻辑,确保找不到类时能从当前环境的classloader加载。然而,值得注意的是,Frida在14.xxx版本后存在一个bug,直到22年7月我发现并自行修复,但该bug似乎仍未解决。
温馨提示:答案为网友推荐,仅供参考