Linux-Kernel

無法註冊 kprobe

  • April 29, 2021

我正在嘗試註冊一個 kprobe 來檢索系統呼叫的地址。但我所有的嘗試似乎都返回 -22 作為錯誤程式碼。下面的範常式式碼(不完整但包含相關函式)嘗試為sys_mkdir呼叫註冊核心探針。

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

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

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結構,因此您沒有滿足symbol_name和之間的排他性或要求(文件addr中表中的第register_kprobe3 點):addr包含函式入口堆棧上的任何內容,這可能是非零, 所以symbol_nameaddr都是非零的並且以(22)register_kprobe失敗。EINVAL

您可以按如下方式解決此問題:

       int ret;
       struct kprobe kp = {
               .symbol_name = name
       };
       unsigned long retval;

這將確保結構的其他成員初始化為其預設值。

引用自:https://unix.stackexchange.com/questions/647270