众所周知,frida是一款跨平台的(适用于Windows,Android,IOS等等)的Hook框架,由于其使用的是ptrace注入方法,所以相比于Xposed框架,优点是Hook代码写完或修改后,不需要重启手机。由于使用的是js,python脚本语言,所以支持代码热更新(更新Hook代码时不需要重启应用)。
而我这次使用frida目的是获取Android应用里jni动态注册函数的地址,大家都知道,jni注册native函数有两种:一种是静态方式(通过函数名称来匹配);而另一种就是动态注册(通过env->RegisterNatives函数),所以可以通过hook RegisterNatives函数来获取所有动态注册的native函数地址,但是由于我不知道如何用frida来找到RegisterNatives的地址,所以没有选择hook这个函数(如果有同学知道,可以告诉我。。)
我选择的是hook dvmCallJNIMethod,因为native层函数都是通过dvmCallJNIMethod函数来调用的(参考android源码),所以hook这个函数也可以达到我们的目的。
dvmCallJNIMethod的定义如下:
void dvmCallJNIMethod(const u4* args, JValue* pResult, const Method* method,