frida 查看方法被谁调用
时间: 2023-10-07 22:07:41 浏览: 294
要使用Frida查看一个Java方法被哪些方法调用,可以按照以下步骤操作:
1. 在需要查看的应用程序中,找到目标Java类和方法。
2. 在Frida中编写JavaScript脚本,使用Java.use()函数引用目标Java类,并使用该类的方法名作为函数名。
3. 在脚本中使用Java.use()函数引用目标Java类中调用目标方法的所有其他方法。
4. 在调用这些方法时,将它们的调用堆栈记录到Frida脚本中的一个数组中。
5. 最后,在目标应用程序中触发目标Java方法,以启动Frida脚本并捕获其输出。
6. 在Frida的控制台中查看脚本输出,以查看目标Java方法的调用情况和调用堆栈。
下面是一个示例Frida脚本,用于查看目标应用程序中的java.lang.String类的equals()方法被哪些方法调用:
```javascript
Java.perform(function() {
var StringClass = Java.use("java.lang.String");
// 定义一个数组来记录equals()方法的调用堆栈
var callStack = [];
// 用于在Java调用栈中记录方法
function recordMethodCall(method) {
var caller = Java.use("java.lang.Thread").currentThread().getStackTrace();
var callerClassName = caller[2].getClassName();
var callerMethodName = caller[2].getMethodName();
var call = {
"class": callerClassName,
"method": callerMethodName
};
method.callStack.push(call);
}
// 引用所有调用equals()方法的其他方法
var StringEquals = StringClass.equals.overload("java.lang.Object");
StringEquals.implementation = function(other) {
// 记录equals()方法的调用堆栈
var call = {
"class": "java.lang.String",
"method": "equals",
"callStack": []
};
callStack.push(call);
// 记录调用equals()方法的方法的调用堆栈
recordMethodCall(callStack[callStack.length - 1]);
// 调用equals()方法并返回结果
var result = this.equals(other);
return result;
};
// 在控制台中打印所有调用equals()方法的方法的调用堆栈
Java.use("java.lang.Runtime").getRuntime().addShutdownHook(
Java.use("java.lang.Thread").$new({
"run": function() {
console.log("equals() method call stack:");
for (var i = 0; i < callStack.length; i++) {
var call = callStack[i];
console.log(" " + call.class + "." + call.method);
for (var j = 0; j < call.callStack.length; j++) {
var stackCall = call.callStack[j];
console.log(" at " + stackCall.class + "." + stackCall.method);
}
}
}
})
);
});
```
这个脚本会在每次目标应用程序中调用String.equals()方法时,记录该方法的调用堆栈和调用该方法的方法的调用堆栈。在目标应用程序结束时,脚本会在Frida控制台中打印所有调用equals()方法的方法的调用堆栈。
阅读全文