【发布时间】:2020-07-29 13:13:02
【问题描述】:
我正在尝试开发一个挂钩read() 系统调用的内核模块。由于某种原因,set_memory_rw() 函数似乎不起作用。
我看到了另一个类似的问题,但我真的不明白该怎么做。
我正在使用 Raspberry-pi 4 开发 Kali 4.19.93
我的代码:
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/moduleparam.h>
#include <linux/syscalls.h>
#include <linux/kallsyms.h>
#include <linux/slab.h>
#include <linux/kern_levels.h>
#include <asm/unistd.h>
#include <asm/cacheflush.h>
#include <linux/semaphore.h>
#include <asm/set_memory.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Omri Ben David");
MODULE_DESCRIPTION("Hooking Linux System calls");
MODULE_VERSION("1.0");
unsigned long** SYS_CALL_TABLE = (unsigned long**) 0xc02011c4;
asmlinkage ssize_t (*original_read) (int fd, char *buf, size_t count);
asmlinkage ssize_t HookRead(unsigned int fd, char * buf, size_t count)
{
printk(KERN_INFO "Rootkit_Debug: Yay you entered my function!!\n Now you can read\n");
return (*original_read)(fd,buf,count);
}
void (*seek)(unsigned long, int);
void (*hide)(unsigned long, int);
static int __init SetHooks(void)
{
printk(KERN_INFO "Hooks Will now be set, hold on tight\n");
printk(KERN_INFO "System calls table is at address %p\n",SYS_CALL_TABLE);
original_read = (void*) SYS_CALL_TABLE[__NR_read];
seek = (void*) kallsyms_lookup_name("set_memory_rw");
hide = (void*) kallsyms_lookup_name("set_memory_ro");
(*seek)((unsigned long)SYS_CALL_TABLE, 1);
SYS_CALL_TABLE[__NR_read] = (unsigned long*)HookRead;
(*hide)((unsigned long)SYS_CALL_TABLE, 1);
printk(KERN_INFO "System calls hooked successfully\n");
return 0;
}
static void __exit HookCleanup(void)
{
printk(KERN_INFO "System calls restore initiated\n");
(*seek)((unsigned long)SYS_CALL_TABLE, 1);
SYS_CALL_TABLE[__NR_read] = (unsigned long*) original_read;
(*hide)((unsigned long)SYS_CALL_TABLE, 1);
printk(KERN_INFO "System successfully restored. hope you had fun");
}
module_init(SetHooks);
module_exit(HookCleanup);
如何使set_memory_rw() 函数工作以覆盖系统调用表?还是我应该使用其他方法?
【问题讨论】:
-
你试过
#include <linux/set_memory.h>吗? -
set_memory_rw()函数没有导出,所以你不能直接在你的模块中使用它。试图在你的模块中使用它会导致编译失败。您可以在运行时使用kallsyms_lookup_name("set_memory_rw")获得指向它的指针。 -
@MarcoBonelli 我做到了,它编译成功。但是,访问此函数似乎会导致运行时错误:“无法在虚拟地址 [函数地址] 处处理分页请求
-
我还将问题中的代码编辑为新代码表单
-
那是因为你不能在那个内存区域使用那些函数:elixir.bootlin.com/linux/v4.19.13/source/arch/arm64/mm/…
标签: c linux-kernel hook system-calls rootkit