Linux-Kernel
無法註冊 kprobe
我正在嘗試註冊一個 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_kprobe
3 點):addr
包含函式入口堆棧上的任何內容,這可能是非零, 所以symbol_name
和addr
都是非零的並且以(22)register_kprobe
失敗。EINVAL
您可以按如下方式解決此問題:
int ret; struct kprobe kp = { .symbol_name = name }; unsigned long retval;
這將確保結構的其他成員初始化為其預設值。