Linux 抓取sys_call_table地址

本文主要介绍三种方法抓取sys_call_table的地址
方法一:以sys_close为参考,遍历内存
方法二:直接抓/proc/kallsyms
方法三:调用函数syscall_table = (unsigned long*)kallsyms_lookup_name(“sys_call_table”);
方法四:sudo cat /boot/System.mapxxxxx | grep sys_call_table

test.c

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/syscalls.h>
#include <linux/kallsyms.h>
MODULE_LICENSE("GPL"); 
MODULE_AUTHOR("curits li");
MODULE_DESCRIPTION("HELLO");
MODULE_VERSION("1.0");

unsigned long *syscall_table;
struct module *mod;
/*
 *  run over the memory till find the sys call talbe
 *  doing so, by searching the sys call close.
 *  kernel version over 5.3 using ksys_close.
 */
//方式一,遍历内存查找
unsigned long * obtain_syscall_table_bf(void)
{
  	unsigned long *syscall_table;
	unsigned long int i;

	for (i = (unsigned long int)sys_close; i < ULONG_MAX;
			i += sizeof(void *)) {
		syscall_table = (unsigned long *)i;

		if (syscall_table[__NR_close] == (unsigned long)sys_close)
			return syscall_table;
	}
	return NULL;
}

unsigned long *
get_sct(void)
{
    return obtain_syscall_table_bf();
}


   static int hello_init(void)
    {	
	printk("%s\n", "Greetings the World!");
 //	struct module *mod;	
    	syscall_table = get_sct();

     	printk("PAGE_OFFSET = %lx\n", PAGE_OFFSET);
    	printk("syscall_table = %p\n", syscall_table);
	
	//方式二,直接使用shell命令
	//system("cat /proc/kallsyms | grep -w sys_call_table | awk '{print $1}'");
	
	//方式三,需要添加头文件
        printk("sys_call_table address is: %lx\n",kallsyms_lookup_name("sys_call_table"));
        
        printk(KERN_ALERT "this module: %p==%p\n", &__this_module, THIS_MODULE );
        printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state );
        printk(KERN_ALERT "module name: %s\n", THIS_MODULE->name );
        printk(KERN_ALERT"module version:%s\n",THIS_MODULE->version);  
        list_for_each_entry(mod, *(&THIS_MODULE->list.prev), list )
        printk(KERN_ALERT "module name: %s\n", mod->name );

        return 0;
    }
 
    static void hello_exit(void)
    {
        printk(KERN_ALERT "module state: %d\n", THIS_MODULE->state );
        printk("find_module bye...\n");
    }
 
module_init(hello_init);
module_exit(hello_exit);

Makefile:

CONFIG_MODULE_SIG=n

ifeq ($(KERNELRELEASE),)

ROOTS_DIR = /root/
#内核源码路径,不同环境可能会不一样,内核源码一定要先编译
KERNEL_DIR = /lib/modules/$(shell uname -r)/build
CUR_DIR = $(shell pwd)

all: 
	make -C $(KERNEL_DIR) M=$(CUR_DIR) modules
clean :
	make -C $(KERNEL_DIR) M=$(CUR_DIR) clean
install:
	insmod test.ko
uninstall:
	rmmod test
    
else
#用于指定到底编译的是哪个代码--hello.c
obj-m += test.o
#obj-m += math.o
endif

在编译驱动代码的时候报错

warning: ISO C90 forbids mixed declarations and code [-Wdeclaration-after-statement]

从报错的信息很直观的可以看出是因为“ISO C90 禁止将声明和代码混合”,也就是说结构体 struct module *mod 因该在函数外进行声明,把结构体声明放在开头,编译不再由warming。

结尾粘上效果:

[22919.816516] PAGE_OFFSET = ffff880000000000
[22919.816517] syscall_table = ffffffff816beee0
[22919.819755] sys_call_table address is: ffffffff816beee0
[22919.819757] this module: ffffffffc06da000==ffffffffc06da000
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值