我使用这种方式重新定义了系统调用:
long my_sys_munmap(unsigned long addr, size_t len)
{
PR_DBG("addr(%p) len(%lu)\n", (void *)addr, len);
.........................
static int my_make_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;
}
static int my_make_page_ro(unsigned long addr)
{
unsigned int level;
pte_t *pte = lookup_address(addr, &level);
pte->pte = pte->pte &~ _PAGE_RW;
return 0;
}
void my_ioc_patch_munmap(void)
{
my_make_page_rw((unsigned long)sys_call_table);
orig_sys_munmap = sys_call_table[__NR_munmap];
*(sys_call_table+__NR_munmap) = (void *)my_sys_munmap;
my_make_page_ro((unsigned long)sys_call_table);
}
但之后我在my_sys_munmap中获得了以下跟踪线:
addr(91) len(449989154)
这意味着第一个参数是系统调用的数量(91)。 my_sys_munmap的原型是什么?我无法得到合适的addr和len。
答案 0 :(得分:0)
我忘记了asmlinkage指令
asmlinkage long my_sys_munmap( unsigned long addr, size_t len)
答案 1 :(得分:0)
这是什么内核?什么架构(i386?)?您是否尝试过拆卸正在替换的函数以查看它如何访问其参数?