Centos 6.9版本kallsyms_lookup_name 未导出解决方法

本文介绍了一种利用Linux内核kprobe机制来获取kallsyms_lookup_name函数地址的方法,并通过该函数指针进一步定位系统调用表地址的过程。具体步骤包括:注册kprobe并设置回调函数以获取kallsyms_lookup_name的地址,然后使用这个函数查找系统调用表的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用kprobe机制去获取kallsyms_lookup_name函数地址,再通过函数指针获取系统调用表地址

static int handler_pre(struct kprobe *p, struct pt_regs *regs){

return 0;
}
static struct kprobe kp = {  
.symbol_name = "kallsyms_lookup_name",  
};  
// 函数定义
typedef unsigned long (*kallsyms_lookup_name_t)(const char *name);
static kallsyms_lookup_name_t fn_kallsyms_lookup_name = 0;

int __get_kallsyms_lookup_name(void)
{
int ret = -1;
kp.pre_handler = handler_pre;
// register_kprobe成功返回0
ret = register_kprobe(&kp);
if (ret < 0) {
printk(KERN_INFO "register_kprobe failed, returned %d\n", ret);
return ret;
}
printk(KERN_INFO "Planted kprobe at %p\n", kp.addr);
fn_kallsyms_lookup_name = (kallsyms_lookup_name_t)(void*)kp.addr;
unregister_kprobe(&kp);
return ret;

}

syscall_t* _get_sys_call_table_by_kallsyms2(void)
{
unsigned long addr;
// 1. 获取kallsyms_lookup_name函数指针
get_kallsyms_lookup_name() ;
// 2. 使用kallsyms_lookup_name()获取系统调用表地址
addr = fn_kallsyms_lookup_name("sys_call_table");
return (syscall_t*)addr;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值