3

重複の可能性:
Linuxカーネル:システムコールフッキングの例

カーネルレベルでシステムコールをフックしようとしています。この質問から基本的な考え方がわかりました。傍受しようとしたシステムコールはfork()でした。そこで、System.mapからsys_call_tableのアドレスを見つけたところ、 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の出力から次のようなメッセージが表示されました。バグ:c12c9e98でカーネルページング要求を処理できません。

ここに画像の説明を入力してください ここに画像の説明を入力してください

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

 sys_call_table[__NR_fork]=our_call;

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

4

1 に答える 1

0

set_memory_rwを使用していないため、 への呼び出しが有効にならないことが予想されます。flush_tlbそのため、 への書き込みが有効になったとき、CPU の TLB はアクティブなままsyscall_tableです。TLB をフラッシュする必要があります。おそらく使用できますlocal_flush_tlb()

于 2013-01-20T16:15:41.150 に答える