5

カーネル レベルでシステム コールをフックしようとしてきました。この質問から基本的なアイデアを得ました。インターセプトしようとしていたシステム コールはfork(). sys_call_tableということで、 fromのアドレスをSystem.map調べたら0xc12c9e90だったので、以下のようにモジュールを書きました。

#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/unistd.h>
#include<linux/semaphore.h>
#include<asm/cacheflush.h>
MODULE_LICENSE("GPL");
void **sys_call_table;
unsigned long addr;
asmlinkage int (*original_call)(struct pt_regs);
asmlinkage int our_call(struct pt_regs regs)
{
        printk("Intercepted sys_fork");
        return original_call(regs);
}
static int __init p_entry(void)
{
       struct page *pg;
       printk(KERN_ALERT "Module Intercept inserted");
       sys_call_table=(void *)0xc12c9e90;
       pg=virt_to_page(sys_call_table);
       addr=(unsigned long)page_address(pg);
       set_memory_rw(addr,1);
       original_call=sys_call_table[__NR_fork];
       sys_call_table[__NR_fork]=our_call;
       set_memory_ro(addr,1);
       return 0;
}
static void __exit p_exit(void)
{
       sys_call_table[__NR_fork]=original_call;
       set_memory_ro(addr,1);
       printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);

モジュールをコンパイルし、カーネルに挿入しようとしました。残念ながら、dmesg の出力に次のようなメッセージが表示されましたBUG: unable to handle kernel paging request at c12c9e98 and here is the ellaborate dmesg output put

ここに画像の説明を入力 ここに画像の説明を入力

問題を見つけるための実験として、私は単に行をコメントアウトしました

sys_call_table[__NR_fork]=our_call;

その後、コンパイルと挿入を繰り返しましたが、エラーは表示されませんでした。したがって、新しい関数をsys_call_tableに割り当てる上記の指定された行が問題であると結論付けました。しかし、何が原因で、どのように解決すればよいのかわかりません。

4

0 に答える 0