今天在分析一个软件的时候,想用FRIDA来hook一个函数来输出数据,发现使用Module.findExportByName("libc.so", "dlopen")
不能找到我们想要的libxxxx.so模块,猜测应该是程序自写实现了dlopen函数,这样我就尝试dlopen函数内层函数;经过分析,我使用了Module.findExportByName("linker", "__dl__ZL10dlopen_extPKciPK17android_dlextinfoPv")
,但是当运行的饿时候出现了下面的问题:
源代码如下图:
var dl_open = Module.findExportByName("linker", "__dl__ZL10dlopen_extPKciPK17android_dlextinfoPv");
Interceptor.attach(dl_open,{
onEnter:function(args){
console.log("pathname = " + Memory.readCString(args[0]));
},
onLeave:function(retval){
}
});
错与提示在代码的第九行,猜测可能是dlopen的值可能为NULL导致的,所以我去证实一下,如下图:
var dl_open = null;
dl_open = Module.findExportByName("linker", "__dl__ZL10dlopen_extPKciPK17android_dlextinfoPv");
if (dl_open == null){
console.log("find dl_open fail!");
}
else{
Interceptor.attach(dl_open,{
onEnter:function(args){
console.log("pathname = " + Memory.readCString(args[0]));
},
onLeave:function(retval){
}
});
}
由此看出确实是dlopen的值为null,这个是为什么呢?明明函数是存在的,用IDA来在确认一下,如下图:
经过确认该函数是存在的,参数没有问题,那我们去FRIDA的官方API看看对Module.findExportByName
函数是怎样说明解释的,具体如下图:
仔细看被黑色的框框圈中的部分有一个exportName
,翻译过来是导出的函数名,那是不是我们hook的函数不是导出函数导致出现上面的问题呢?打开IDA再去仔细看一下,具体如下图:
所以从图中看出导出函数里面并没有__dl__ZL10dlopen_extPKciPK17android_dlextinfoPv
函数,这就导致出现了“cannot read property ‘readU8’ of null”错误。你怎么定位这个函数的地址呢?我们可以使用Module.findBaseAddress(name)
函数,来获得模块的基地址,再加上函数的偏移地址就能成功实现hook功能,具体效果如下如:
var dl_open = null;
dl_open = new NativePointer(Module.findBaseAddress("linker")).add(0x2BF8+1);
if (dl_open == null){
console.log("find dl_open fail!");
}
else{
Interceptor.attach(dl_open,{
onEnter:function(args){
console.log("pathname = " + Memory.readCString(args[0]));
},
onLeave:function(retval){
}
});
}