介绍
firda一个在Android逆向十分常用的 native 层动态调试的工具。
但是它有没有办法在windows的hotspot使用。 根据我目前找到关于jvm hotspot的frida文章,提问等都无法使用
即使你导入了pdb表也一样会显示无法使用
这篇就来整合一下信息,让你能够在windows运行残血版frida (哈哈,够用了亲)
既然我有了pdb表,为什么我不直接写dll来hook呢?
安装
首先你得要有python环境,安装这两个玩意
第二个 frida-tools 是用来编译或者其他的,如果你不写自己的脚本,可以不安装
pip install fridapip install frida-tools从这里面下载openjdk 17 版本,目前frida-java对17稳定性较好一些(实际上我没测过其他的版本,用的就openjdk17)

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

启动
命令行:
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 ,在这个时机后调用是可以使用
代码可能写的比较垃圾见谅
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()}`);}
部分信息可能已经过时