【问题标题】:How to get data segment of Linux kernel from LKM如何从 LKM 获取 Linux 内核的数据段
【发布时间】:2014-02-10 09:23:57
【问题描述】:

我正在编写一个涉及tasklist_lock__bss_start 的内核模块。

这些符号不会被导出。我很确定即使没有导出,我们也可以使用 kernsym_lookup_name() 访问文本部分中的符号

参考How my custom module on linux 3.2.28 can make a call to print_cpu_info?

$ vim System.map
...
80017be0 T register_undef_hook
80017c28 T unregister_undef_hook
80017c70 T do_unexp_fiq
...
806eb000 D mmlist_lock
806eb040 D tasklist_lock
806eb080 d softirq_vec
....

T代表文本符号。
Dd代表数据段符号。

我可以使用kallsyms_lookup_name() 访问register_undef_hook()unregister_undef_hook()

但不是tasklist_lock

请分享您的知识以从内核模块(LKM)访问tasklist_lock

【问题讨论】:

    标签: c linux-kernel linux-device-driver


    【解决方案1】:

    看到这位高贵的post

    #include <linux/module.h>
    #include <linux/kallsyms.h>
    #include <linux/string.h>
    
    MODULE_LICENSE("GPL");
    MODULE_DESCRIPTION("Access non-exported symbols");
    MODULE_AUTHOR("Stephen Zhang");
    
    static int __init lkm_init(void)
    {
        char *sym_name = "__bss_start";
        unsigned long sym_addr = kallsyms_lookup_name(sym_name);
        char filename[256];
    
        strncpy(filename, (char *)sym_addr, 255);
    
        printk(KERN_INFO "[%s] %s (0x%lx): %s\n", __this_module.name, sym_name, sym_addr, filename);
    
        return 0;
    }
    
    static void __exit lkm_exit(void)
    {
    }
    
    module_init(lkm_init);
    module_exit(lkm_exit);
    

    【讨论】:

    • 我已经试过了。这适用于 T 类型的符号,但不适用于 D 类型。
    • 因此您将不得不为此使用硬编码地址...或从内核中导出它,显然您的设计不好,请参见此处...或者您正在尝试执行 rootkit stackoverflow.com/questions/2103315/…
    • 我无法修改内核端。但是硬编码地址可以解决我目前的情况,但不是永久的解决方案。无论如何感谢您的努力。
    • 如果是调试使用 kprobes 和 jprobes。有时在 .config 标志中有反映 .bss 和 .text 偏移量
    • 不用于调试目的:)
    猜你喜欢
    • 2015-01-27
    • 1970-01-01
    • 2014-10-19
    • 2013-02-17
    • 1970-01-01
    • 2013-02-04
    • 2010-09-25
    • 1970-01-01
    • 2012-10-09
    相关资源
    最近更新 更多