TMF框架与Frida脚本相关疑问及核心解析提炼
本文档围绕TMF框架的sendShark方法、Frida脚本的Hook与通信逻辑,解答了异步回调、类型转换、跨层交互等核心疑问。核心逻辑是:Frida脚本作为桥梁,打通Python(控制端)、JS(脚本层)、Java(APP业务层)、Native层(C/C++底层)的交互,实现APP网络请求的被动监控和主动构造,其中异步回调(ISharkCallBack2的onFinish方法)是TMF框架原生设
一、核心基础:TMF框架核心方法与参数解析
1. sendShark方法(TMF框架核心网络请求方法)
sendShark是TMF框架中发起网络请求的核心方法,其核心设计围绕异步回调模式,关键要点如下:
-
入参核心:第三个入参为ISharkCallBack2接口的实例,这是异步回调的核心约定,与Python逻辑无关,是框架原生设计。
-
异步体现:sendShark内部的网络请求或业务逻辑执行完成后,会异步触发第三个入参(ISharkCallBack2实例)的onFinish方法,将响应结果通过参数传入回调,避免程序阻塞,这是典型的异步回调设计。
-
其他关键入参/关联对象:第一个入参常为SharkHttpEntity实例(封装请求参数,如apiName、header、body等);请求的发起与连接由OkHttpClient实例负责,请求的封装由Request.Builder构建的request对象负责,响应结果由Response对象接收(包含状态码、响应头、响应体等)。
2. TMF框架其他核心对象
-
TMFBase:框架核心调度类,可理解为请求调度的“大脑”,通过TMFBase.getShark()方法可获取Shark请求实例,进而调用sendShark发起请求。
-
SharkHttpEntity:请求/响应实体类,用于封装请求参数(apiName、header、cookies等)和响应数据(data、header等),其内部字段需通过类型转换后才能访问。
二、Frida脚本核心解析(基于JS语言,注入APP进程)
1. Frida核心功能与特性
Frida脚本本质是JS脚本,核心作用是注入APP进程,实现Hook、调试及跨环境通信,核心特性有二:
-
Hook Java方法标准流程:通过“类名[‘方法名’]”定位目标方法,用overload指定参数签名(避免重载方法混淆),再通过implementation注入自定义Hook逻辑(可修改参数、拦截数据、替换返回值等)。
-
类型转换要求:因Java是强类型语言,Frida Hook时拿到的对象默认是泛型Object引用,需通过Java.cast()强转为具体类型,才能访问其内部字段和方法(如将Object转为SharkHttpEntity,才能访问apiName字段)。
2. Frida脚本核心流程(TMF.js)
该脚本核心实现两大功能:被动拦截APP网络请求、主动构造请求,整体围绕Frida与Python的双向通信及与Java层的交互展开,关键流程如下:
(1)被动拦截流程
-
Hook目标:SharkClass(sendShark方法所在类)的sendShark方法。
-
拦截逻辑:Hook后获取sendShark方法的所有入参(通过Frida内置arguments对象,arguments[0]为第一个入参,arguments[2]为ISharkCallBack2回调实例),将请求参数解析后,通过Frida的send方法发送到Python端,实现请求监控。
-
回调监控:同时Hook ISharkCallBack2接口的onFinish方法,当响应返回时,将响应数据也转发到Python端,完成请求-响应全链路监控。
(2)主动构造请求流程
-
入口:通过rpc.exports暴露sendShark函数,供Python端直接调用,实现外部主动触发请求。
-
参数处理:接收Python端传入的apiName、header、cookies等参数,通过Java.cast()进行类型转换,封装成SharkHttpEntity实例。
-
回调实例:创建自定义回调实例MyHttpEntityCallback(实现ISharkCallBack2接口),该实例的onFinish方法不会触发被动拦截的转发逻辑,用于单独处理主动请求的响应。
-
请求发起:调用TMFBase.getShark().sendShark(),传入封装好的请求实体和自定义回调实例,由APP原生流程发起请求。
-
响应处理:请求完成后,系统自动触发MyHttpEntityCallback的onFinish方法,解析响应数据(提取响应体、响应头),通过OkHttp发送到指定服务器地址,完成响应转发。
3. Frida关键API与交互说明
-
通信API:send(JS脚本向Python端发送数据/日志)与recv(JS脚本接收Python端发送的消息),二者配对使用,构建JS与Python的双向通信桥梁。
-
其他常用API:Java.use()(获取Java类对象)、Java.registerClass()(注册自定义Java类,如MyHttpEntityCallback)、Java.choose()(扫描内存中指定接口/类的实例)、wait()(同步阻塞,等待异步操作完成,避免空指针错误)。
-
日志差异:console.log()打印的日志输出到APP控制台(需用adb logcat查看),send方法打印的日志直接输出到Python终端,更便于调试。
三、跨语言/跨层交互核心解析
1. JS与Python交互
-
数据类型适配:Python的字典传到JS端,会被Frida自动解析为JS对象;如需避免数据嵌套、循环引用导致的错误,可通过JSON.stringify()(JS对象转JSON字符串)+JSON.parse()(JSON字符串转JS对象)进行数据清洗和深拷贝。
-
调用方式:Python端通过script.exports.send()调用JS端暴露的函数,JS端通过recv接收Python传参,处理后通过send返回结果。
2. JS与Java交互(Frida作为桥梁)
-
类型转换:JS字符串需通过StringClass.$new()转为Java的String实例,才能传入Java层方法;Java对象需通过Java.cast()转为JS可操作的类型。
-
回调适配:自定义JS回调类(如MyHttpEntityCallback)需实现Java接口(ISharkCallBack2),才能被Java层方法(sendShark)识别并触发回调。
3. Java与Native层交互
Native层通常指C/C++开发的代码,Java与Native层的交互通过JNI实现;而Frida可进一步打通JS与Native层的交互,实现对Native层方法的Hook和控制,补充JNI的交互灵活性。
四、关键疑问与核心结论
-
send与sendShark区别:Frida的send是通信API(JS→Python),sendShark是TMF框架的请求方法;JS脚本中send可作为sendShark的别名(通过rpc.exports映射),简化外部调用。
-
JSON解析相关:JSON.stringify()用于序列化(对象转字符串),JSON.parse()用于反序列化(字符串转对象),核心作用是数据清洗、深拷贝和跨语言传输适配;Java中Fastjson的parseObject方法与JS的JSON.parse功能一致,均用于解析JSON字符串为当前语言可操作的数据结构。
-
回调实例与onFinish:ISharkCallBack2是异步回调接口,其onFinish方法由TMF框架自动触发(sendShark请求完成后),不同实现类(原生回调、自定义MyHttpEntityCallback)的onFinish方法独立,自定义回调可绕过被动拦截逻辑。
-
防御性编程:脚本可增加空值判断、参数默认值等逻辑,避免因传参不全、异步未完成导致的空指针错误。
五、总结
本文档围绕TMF框架的sendShark方法、Frida脚本的Hook与通信逻辑,解答了异步回调、类型转换、跨层交互等核心疑问。核心逻辑是:Frida脚本作为桥梁,打通Python(控制端)、JS(脚本层)、Java(APP业务层)、Native层(C/C++底层)的交互,实现APP网络请求的被动监控和主动构造,其中异步回调(ISharkCallBack2的onFinish方法)是TMF框架原生设计,也是整个请求-响应流程的核心触发点。
(注:文档部分内容可能由 AI 生成)
更多推荐




所有评论(0)