簡體   English   中英

無法注冊 kprobe

[英]Unable to register kprobe

我正在嘗試注冊一個 kprobe 來檢索系統調用的地址。 但我所有的嘗試似乎都返回 -22 作為錯誤代碼。 下面的示例代碼(不完整但包含相關函數)嘗試為sys_mkdir調用注冊 kernel 探針。

如果我指定 pre 或 post 處理程序似乎並不重要,只是注冊探針不起作用。

注意:我正在嘗試使用 kprobes 替代在kallsyms_lookup_name 5.7 及更高版本中不再導出的未導出 kallsyms_lookup_name。

unsigned long lookup_name(const char *name)  
{
        int ret;
        struct kprobe kp;
        unsigned long retval;
 
        kp.symbol_name = name;
        ret = register_kprobe(&kp);     
        if (ret < 0) {
                printk(KERN_DEBUG "register_kprobe failed for symbol %s, returned %d\n", name,
 ret);
                return 0;
        }
        retval = (unsigned long)kp.addr;
        unregister_kprobe(&kp);
        return retval;
}
                                                                                                  
static int __init mod_init(void)                                                              
{                                                                                                 
        int (*fn)(unsigned long param);

        fn = (void*)lookup_name("__x64_sys_mkdir");   
} 

我正在嘗試注冊一個 kprobe 來檢索系統調用的地址。 但我所有的嘗試似乎都返回 -22 作為錯誤代碼。 下面的示例代碼(不完整但包含相關函數)嘗試為sys_mkdir調用注冊 kernel 探針。

如果我指定 pre 或 post 處理程序似乎並不重要,只是注冊探針不起作用。

注意:我正在嘗試使用 kprobes 替代在kallsyms_lookup_name 5.7 及更高版本中不再導出的未導出 kallsyms_lookup_name。

unsigned long lookup_name(const char *name)  
{
        int ret;
        struct kprobe kp;
        unsigned long retval;
 
        kp.symbol_name = name;
        ret = register_kprobe(&kp);     
        if (ret < 0) {
                printk(KERN_DEBUG "register_kprobe failed for symbol %s, returned %d\n", name,
 ret);
                return 0;
        }
        retval = (unsigned long)kp.addr;
        unregister_kprobe(&kp);
        return retval;
}
                                                                                                  
static int __init mod_init(void)                                                              
{                                                                                                 
        int (*fn)(unsigned long param);

        fn = (void*)lookup_name("__x64_sys_mkdir");   
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM