4,436
社区成员
发帖
与我相关
我的任务
分享
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#define sys_No 78
unsigned long old_sys_call_func;
unsigned long p_sys_call_table = 0xc15ea020;
unsigned long orig_cr0;
static int clear_cr0(void)
{
unsigned int cr0 = 0;
unsigned int ret;
asm volatile ("movl %%cr0, %%eax":"=a"(cr0));
ret = cr0;
cr0 &=0xfffeffff;
asm volatile ("movl %%eax, %%cr0": :"a"(cr0));
return ret;
}
static void setback_cr0(int val)
{
asm volatile ("movl %%eax, %%cr0": :"a"(val));
}
//篡改为自己的78号系统调用的函数
asmlinkage int hello(int a, int b, int c)
{
printk("No 78 syscall has changed to hello\n");
return a+b+c;
}
void modify_syscall(void)
{
unsigned long *sys_call_addr;
orig_cr0 = clear_cr0();
sys_call_addr = (unsigned long *)(p_sys_call_table + sys_No*4);
printk("lelel%x", sys_call_addr);
old_sys_call_func = *(sys_call_addr);
*(sys_call_addr) = (unsigned long)&hello;
printk("I am ok\n");
setback_cr0(orig_cr0);
}
void restore_syscall(void)
{
unsigned long *sys_call_addr;
orig_cr0 = clear_cr0();
sys_call_addr = (unsigned long *)(p_sys_call_table + sys_No*4);
*(sys_call_addr) = old_sys_call_func;
setback_cr0(orig_cr0);
printk("I am leaveing \n");
}
static int mymodule_init(void)
{
modify_syscall();
return 0;
}
static void mymodule_exit(void)
{
restore_syscall();
}
module_init(mymodule_init);
module_exit(mymodule_exit);
MODULE_LICENSE("GPL");