frida 调用了错误的构造函数
frida calls the wrong constructor
我正在尝试挂钩 java.net.URL 的以下构造函数:
URL(URL 上下文,字符串规范,URLStreamHandler 处理程序)
我的代码如下:
import argparse
import frida
import sys
jscode = """
Java.perform(function () {
Java.use('java.net.URL').$init.overload('java.net.URL', 'java.lang.String', 'java.net.URLStreamHandler').implementation = function(arg0,arg1,arg2) {
return this.$init(arg0,arg1,arg2);
};
});
"""
parser = argparse.ArgumentParser()
parser.add_argument("target")
args = parser.parse_args()
process = frida.get_usb_device().attach(args.target)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
这会导致应用程序(有时是 frida-server)崩溃。检查 logcat 显示:
03-25 16:09:03.347 23490 23563 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:391)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:316)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:339)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(Native Method)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:498)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:447)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at okhttp3.HttpUrl.url(HttpUrl.kt:1)
...
这意味着我尝试调用的 init 是错误的 init 函数,因为 URL.java:339 映射到 URL(String protocol, String host, String file)
构造函数。我怀疑这可能是因为 arg0 和 arg2 在这个调用链中都是空的。
有没有办法调用特定的重载?
我在 frida github 上得到了答案。
解决方案是:
Java.perform(function () {
var URL = Java.use('java.net.URL');
var ctor = URL.$init.overload('java.net.URL', 'java.lang.String', 'java.net.URLStreamHandler');
ctor.implementation = function (arg0, arg1, arg2) {
return ctor.call(this, arg0, arg1, arg2);
};
});
我正在尝试挂钩 java.net.URL 的以下构造函数: URL(URL 上下文,字符串规范,URLStreamHandler 处理程序)
我的代码如下:
import argparse
import frida
import sys
jscode = """
Java.perform(function () {
Java.use('java.net.URL').$init.overload('java.net.URL', 'java.lang.String', 'java.net.URLStreamHandler').implementation = function(arg0,arg1,arg2) {
return this.$init(arg0,arg1,arg2);
};
});
"""
parser = argparse.ArgumentParser()
parser.add_argument("target")
args = parser.parse_args()
process = frida.get_usb_device().attach(args.target)
script = process.create_script(jscode)
script.load()
sys.stdin.read()
这会导致应用程序(有时是 frida-server)崩溃。检查 logcat 显示:
03-25 16:09:03.347 23490 23563 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toLowerCase()' on a null object reference
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:391)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:316)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:339)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(Native Method)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:498)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at java.net.URL.<init>(URL.java:447)
03-25 16:09:03.347 23490 23563 E AndroidRuntime: at okhttp3.HttpUrl.url(HttpUrl.kt:1)
...
这意味着我尝试调用的 init 是错误的 init 函数,因为 URL.java:339 映射到 URL(String protocol, String host, String file)
构造函数。我怀疑这可能是因为 arg0 和 arg2 在这个调用链中都是空的。
有没有办法调用特定的重载?
我在 frida github 上得到了答案。 解决方案是:
Java.perform(function () {
var URL = Java.use('java.net.URL');
var ctor = URL.$init.overload('java.net.URL', 'java.lang.String', 'java.net.URLStreamHandler');
ctor.implementation = function (arg0, arg1, arg2) {
return ctor.call(this, arg0, arg1, arg2);
};
});