10

カーネル レベルでシステム コールをインターセプトしようとしています。この質問から基本的なアイデアを得ました。私が傍受しようとしていたシステムコールはfork()でした。そこで、System.map からsys_fork()のアドレスを調べたところ、0xc1010e0c であることがわかりました。以下のようにモジュールを記述しました。

#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;
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)
{
    printk(KERN_ALERT "Module Intercept inserted");
    sys_call_table=(void *)0xc1010e0c;
    original_call=sys_call_table[__NR_open];
    set_memory_rw((long unsigned int)sys_call_table,1);
    sys_call_table[__NR_open]=our_call;
    return 0;
}
static void __exit p_exit(void)
{
    sys_call_table[__NR_open]=original_call;
    set_memory_ro((long unsigned int)sys_call_table,1);
    printk(KERN_ALERT "Module Intercept removed");
}
module_init(p_entry);
module_exit(p_exit);

ただし、モジュールをコンパイルした後、カーネルに挿入しようとすると、dmesg の出力から次のようになりました。 ここに画像の説明を入力 ここに画像の説明を入力

もちろん、システムコールをインターセプトしていません。問題を解決するのを手伝ってもらえますか? Linux カーネルの3.2.0-4-686バージョンを使用しています。

4

3 に答える 3

8

http://lxr.linux.no/linux+*/arch/x86/mm/pageattr.c#L874言う

            if (*addr & ~PAGE_MASK) {
                    *addr &= PAGE_MASK;
                    /*
                     * People should not be passing in unaligned addresses:
                     */
                    WARN_ON_ONCE(1);
            }

したがって、警告は、sys_call_table変数がページ整列されていないためです。

システム コール テーブルにパッチを適用することは、カーネル メンテナによって公式に推奨されておらず、意図的な障害物がいくつか置かれています。おそらく、実際のsys_call_tableシンボルにアクセスできないこと、および書き込み保護も意図的です。やりたいことを別の方法で行うことができる場合は、そうするべきです。より大きな目標によっては、ptraceカーネル モジュールをまったく使用せずに達成できる場合もあります。trace_sched_process_forkフックも便利かもしれません。

于 2013-01-19T15:06:28.037 に答える
2
original_call=sys_call_table[__NR_open];
....
sys_call_table[__NR_open]=our_call;

を傍受している場合fork、のエントリopenは変更したいものではありません。System.map の sys_fork() のアドレスの代わりに、 のアドレスを使用する必要がありsys_call_tableました。

于 2013-01-19T15:01:53.277 に答える
0

問題を解決したかどうかは明確ではありませんが、モジュール glib をテストする方法によっては、sys_fork を使用せず、代わりに sys_clone を使用してください。

于 2013-07-23T16:37:56.727 に答える