Frida 0x7中获取已经存在的实例com.ad2001.frida0x7.MainActivity,并hook Checker类的构造函数创建Checker示例,然后调用com.ad2001.frida0x7.MainActivity#flag方法,以Checker对象作为参数传递。这里需要注意Hook的时机,如果以-l参数传递脚本会报错:Didn't find class "com.ad2001.frida0x7.MainActivity" on path: DexPathList,这是因为MainActivity还未加载完成,有两种方式解决,一种是使用frida -f先启动程序,然后在控制台中输入hook脚本;第二种是在脚本中指定延迟hook
Java.performNow(function() { var modules = Module.enumerateExports('libfrida0x8.so') for (var i in modules){ if (modules[i].name.indexOf("cmpstr") > -1){ console.log(modules[i].address) } } });
Module.getExportByName():根据名称获取导出函数的地址
1 2 3 4 5
Java.performNow(function() { // 注意这里要写导出表中的函数名 var addr = Module.getExportByName("libfrida0x8.so","Java_com_ad2001_frida0x8_MainActivity_cmpstr") console.log(addr) });
Java.performNow(function () { var strcmp_adr = Module.findExportByName("libc.so", "strcmp"); // hook native层函数 Interceptor.attach(strcmp_adr, { onEnter: function (args) { var arg0 = Memory.readUtf8String(args[0]); // first argument var flag = Memory.readUtf8String(args[1]); // second argument // 只hook指定的函数, 此处表示只对我们输入为Hello的情况进行处理 if (arg0.includes("Hello")) { console.log("Hookin the strcmp function"); console.log("Input " + arg0); console.log("The flag is "+ flag); } }, // Modify or log return value if needed onLeave: function (retval) { } }); })
Hook Native方法修改返回值
1 2 3 4 5 6 7 8 9 10 11 12
Java.performNow(function () { var check_flag_addr = Module.findExportByName("liba0x9.so", "Java_com_ad2001_a0x9_MainActivity_check_1flag"); // hook native层函数 Interceptor.attach(check_flag_addr, { onEnter: function (args) { }, onLeave: function (retval) { // 修改返回值 retval.replace(1337) } }); })