Frida 17.4.0变化及问题解决

Frida 最新更新了新的API。过去很多使用的脚本都没法用了。很多脚本都无法正常使用了。

问题1:

{'type': 'error', 'description': "ReferenceError: 'Java' is not defined", 'stack': "ReferenceError: 'Java' is not defined\n

解决办法:

script.js

import Java from  "frida-java-bridge";

if (Java.available) {
    Java.perform(() => {
        send({
            type: "status",
            message: "Application class-loader now available"
        });
    });
} else {
    console.log("No Java VM in this process");
}

要导入

import Java from  "frida-java-bridge";

问题2:

脚本需要编译然后加载

def on_diagnostics(diag):
    print("diag", diag)
compiler = frida.Compiler()
compiler.on("diagnostics", on_diagnostics)
... # frida initialize procedure
bundle = compiler.build("sw44.js")
script = session.create_script(bundle)
...

问题3:

script:

function hook_dlopen() {
    // Hook 所有可能的 dlopen 变体
    const dlopenFuncs = [
        'android_dlopen_ext',
        'dlopen',
        '__loader_dlopen'
    ];
     
    let interceptors = [];
     
    dlopenFuncs.forEach(funcName => {
        let funcPtr = Module.findExportByName(null, funcName);
        if (funcPtr) {
            let interceptor = Interceptor.attach(funcPtr, {
                onEnter: function(args) {
                    var pathptr = args[0];
                    if (pathptr && !pathptr.isNull()) {
                        var path = ptr(pathptr).readCString();
                        console.log("[LOAD]", path);
                         
                        // 检查是否是可疑的检测库
                        if (path && (path.includes("libtt") || path.includes("libbili") ||
                            path.includes("security") || path.includes("protect"))) {
                            console.warn("!!! Possible Frida detection library loaded:", path);
                            // 打印调用栈可以帮助定位谁加载了这个库
                            console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
                                .map(DebugSymbol.fromAddress).join('\n') + '\n');
                        }
                    }
                }
            });
            interceptors.push(interceptor);
            console.log(`Hooked ${funcName} at ${funcPtr}`);
        }
    });
     
    // 返回所有拦截器以便后续管理
    return interceptors;
}
 
// 延迟执行以避免错过早期加载的库
setImmediate(hook_dlopen);

加载出现错误:

'{'type': 'error', 'description': 'TypeError: not a function', 'stack': 'TypeError: not a function\n    at <anonymous> (sw44.js:27)\n    at forEach (native)\n    at hook_dlopen

原因:

最新版的Frida把全局的API变了。

之前这些

Module.ensureInitialized()
Module.findBaseAddress()
Module.getBaseAddress()
Module.findExportByName()
Module.getExportByName()
Module.findSymbolByName()
Module.getSymbolByName()

现在是:

Module.getGlobalExportByName('open')
Process.getModuleByName('libc.so').getExportByName('open')
Process.getModuleByName('libc.so').base
const openImpl = Process.getModuleByName('libc.so').getExportByName('open');
const libc = Process.getModuleByName('libc.so');
const openImpl = libc.getExportByName('open');
const readImpl = libc.getExportByName('read');

更新后的脚本是:

import Java from  "frida-java-bridge";

if (Java.available) {
    Java.perform(() => {
        send({
            type: "status",
            message: "Application class-loader now available"
        });
    });
} else {
    console.log("No Java VM in this process");
}



function hook_dlopen() {
    // Hook
    const dlopenFuncs = [
        'android_dlopen_ext',
        'dlopen',
        '__loader_dlopen'
    ];

    let interceptors = [];

    dlopenFuncs.forEach(funcName => {
        var funcPtr = Module.getGlobalExportByName(funcName);
        //var funcPtr = Module.findExportByName(null, funcName);
        if (funcPtr) {
            let interceptor = Interceptor.attach(funcPtr, {
                onEnter: function(args) {
                    var pathptr = args[0];
                    if (pathptr && !pathptr.isNull()) {
                        var path = ptr(pathptr).readCString();
                        console.log("[LOAD]", path);

                        // 检查是否是可疑的检测库
                        if (path && (path.includes("libtt") || path.includes("libbili") ||
                            path.includes("security") || path.includes("protect"))) {
                            console.warn("!!! Possible Frida detection library loaded:", path);
                            // 打印调用栈可以帮助定位谁加载了这个库
                            console.log(Thread.backtrace(this.context, Backtracer.ACCURATE)
                                .map(DebugSymbol.fromAddress).join('\n') + '\n');
                        }
                    }
                }
            });
            interceptors.push(interceptor);
            console.log(`Hooked ${funcName} at ${funcPtr}`);
        }
    });

    // 返回所有拦截器以便后续管理
    return interceptors;
}

// 延迟执行以避免错过早期加载的库
setImmediate(hook_dlopen);


现在加载就没问题了。

ref: https://frida.re/news/2025/05/17/frida-17-0-0-released/

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *