介绍

firda一个在Android逆向十分常用的 native 层动态调试的工具。

但是它有没有办法在windows的hotspot使用。 根据我目前找到关于jvm hotspot的frida文章,提问等都无法使用

即使你导入了pdb表也一样会显示无法使用

这篇就来整合一下信息,让你能够在windows运行残血版frida (哈哈,够用了亲)

安装

首先你得要有python环境,安装这两个玩意

第二个 frida-tools 是用来编译或者其他的,如果你不写自己的脚本,可以不安装

1
2
pip install frida
pip install frida-tools

从这里面下载openjdk 17 版本,目前frida-java对17稳定性较好一些(实际上我没测过其他的版本,用的就openjdk17)

img

下载上图的两个文件即可,解压pdb表即可了捏

bin

启动

命令行:

frida -l F:\main.js -f "C:\Program Files\Java\jdk-17.0.14+6\bin\java.exe" -- -jar 1.jar

这边的 -- 后面的所要添加的参数捏。非常的简单哈

局限性

目前 Java.use , Java.cast 和一些 jni 相关的api能够正常使用

对某个函数进行overload它的method入口会报错捏,只能等有缘人修复了啊啊啊(

脚本

windows java hotspot 的脚本比较怪,如果你在脚本直接调用 Java.available 是不可以滴!

由于win的frida加载script时机比jvm.dll早,我们需要用setTimeout 等待jvm.dll加载某个函数,才可以用捏。 我这边是对JVM_DefineClassWithSource 进行了hook ,在这个时机后调用是可以使用

代码可能写的比较垃圾见谅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
let start = new Promise((resolve) => {
Interceptor.attach(
jvmModule.getExportByName("JVM_DefineClassWithSource"),{
onEnter: function (args) {
const ptr = args[0].readPointer();
resolve(ptr);
},
}
);
});

start.then((jnienv) => {
console.log(Java.available);
bootstrap(jnienv, Java.api.jvmti.handle);
});

// 这上面的写在setTimeout内,时间50ms即可

function bootstrap(jni, jvmti) {
console.log(`[*] Got JNI: ${jni.toString()}`);
console.log(`[*] Got JVMTI: ${jvmti.toString()}`);
}

3