2014-02-10 60 views
1

我正在編寫一個涉及tasklist_lock,__bss_start的內核模塊。如何從LKM獲取Linux內核的數據段

這些符號未導出。我敢肯定,即使不出口,我們可以使用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

回答

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); 
+0

這個我試過了。這適用於類型爲「T」的符號,但不適用於「D」類型。 – Jeyaram

+1

所以你將不得不使用硬編碼的地址......或從內核導出它,顯然你有壞設計看到這裏......或者你正在嘗試做rootkit http://stackoverflow.com/questions/ 2103315/linux-kernel-system-call-hooking-example – 0x90

+0

我無法修改內核端。但硬編碼地址將解決我目前的情況,但不是永久的解決方案。無論如何感謝您的努力。 – Jeyaram

相關問題