frida so

function main(){
Java.perform(function() {
        //这个API可以枚举被加载到内存的modules。
        console.log(JSON.stringify(Process.enumerateModules()));
        //来查找要hook的函数所在的so的基地址,如果找不到就返回null。
        const lib_arr=Module.findBaseAddress("libnative-lib.so")
        console.log("libnative-lib.so基地址是",lib_arr)
        if(lib_arr){
            //来查找导出函数的绝对地址
            const myfirstJNI = Module.findExportByName("libnative-lib.so","Java_com_example_demoso1_MainActivity_myfirsyjniJNI")
            console.log("myfirstJNI函数地址",myfirstJNI);
            const offset = myfirstJNI-lib_arr
            //偏移量=函数的地址-so文件的基址,这个偏移量就是ida需要搜的
            console.log(offset,"0x"+offset.toString(16));
        //如果没有循环调用它,就需要主动去触发了
        //找到地址之后,就可以拦截function/instruction的执行。
        Interceptor.attach(myfirstJNI, {
        onEnter: function (args) {
            console.log("myfirstJNI args: " + args[0], args[1], args[2])
            //另外为了将jstring的值打印出来,可以使用jenv的函数getStringUtfChars
            console.log(Java.vm.getEnv().getStringUtfChars(args[2], null).readCString())
        },
        onLeave: function (retval) {
            console.log("retval:", retval)
            console.log(Java.vm.getEnv().getStringUtfChars(retval, null).readCString())
            var newRetval = Java.vm.getEnv().newStringUtf("new retval from hook_native");
            retval.replace(ptr(newRetval));
        }
    })


        }

    var symbols = Process.findModuleByName("libssl.so").enumerateSymbols();
    for(var i = 0;i<symbols.length;i++){
        var symbol = symbols[i].name;
        console.log("symbol",symbol,"address",symbol.address)
    }

})

}
setImmediate(main)
原文地址:https://www.cnblogs.com/c-x-a/p/15163775.html