gpt4 book ai didi

c - 从内核劫持系统调用

转载 作者:太空宇宙 更新时间:2023-11-03 23:38:14 25 4
gpt4 key购买 nike

我想拦截 open() 系统调用,以测试每次用户打开文件时,消息“OPEN IS!”应显示在 dmesg 中。

dmesg 中的系统调用表和打开调用地址显示,但消息“OPEN IS!”不可见。内核 v. 4.18

我想知道问题是什么。代码:

unsigned long cr0;
static unsigned long *__sys_call_table;

typedef asmlinkage int (*orig_open_t)(const char *, int, int);

orig_open_t orig_open;

unsigned long *
get_syscall_table_bf(void)
{
unsigned long *syscall_table;
unsigned long int i;

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

if (syscall_table[__NR_close] == (unsigned long)ksys_close) {
printk(KERN_INFO "syscall: %08lx\n", syscall_table);
return syscall_table;
}
}
return NULL;
}

asmlinkage int
hacked_open(const char *filename, int flags, int mode)
{
printk(KERN_INFO "OPEN IS!\n");
return 0;
}

static inline void
protect_memory(void)
{
write_cr0(cr0);
}

static inline void
unprotect_memory(void)
{
write_cr0(cr0 & ~0x00010000);
}

static int __init
diamorphine_init(void)
{
__sys_call_table = get_syscall_table_bf();
if (!__sys_call_table)
return -1;

cr0 = read_cr0();

orig_open = (orig_open_t)__sys_call_table[__NR_open];

unprotect_memory();
__sys_call_table[__NR_open] = (unsigned long)hacked_open;
printk(KERN_INFO "WE DO IT!\n");
printk(KERN_INFO "hacked is: %08lx\n", hacked_open);
protect_memory();

return 0;
}

static void __exit
diamorphine_cleanup(void)
{
unprotect_memory();
__sys_call_table[__NR_open] = (unsigned long)orig_open;
protect_memory();
}

module_init(diamorphine_init);
module_exit(diamorphine_cleanup);

MODULE_LICENSE("GPL");

最佳答案

我猜你的 Hook 有问题。要么你 Hook 了系统调用表的错误偏移量,要么你完全关闭了。我不明白为什么要明确地开始使用 ksys_close() 进行搜索,尤其是当它是一个内联函数时。您应该尝试寻找系统调用表符号:

typedef void (*_syscall_ptr_t)(void); 
_syscall_ptr_t *_syscall_table = NULL;
_syscall_table=(_syscall_ptr_t *)kallsyms_lookup_name("sys_call_table");

我看到的一个不同的(巨大的)问题是重置 CR0,它允许你系统中的任何东西在你写的时候写入只读内存,而不是页面遍历和设置特定的 W 位您将要编辑的页面。

额外的一个小建议:您应该完成钩子(Hook)以重定向到原始打开的系统调用。否则,您将导致整个系统从 STDIN 读取每个新打开的文件描述符(这最终会杀死您的系统)

关于c - 从内核劫持系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53575454/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com