解决Frida关于“cannot read property ‘readU8’ of null”错误

今天在分析一个软件的时候,想用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){

		}
	});
}

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值