[英]Get a probed function's arguments in the entry_handler of a kretprobe
我試圖使用kretprobe void *__kmalloc(size_t size, gfp_t flags);
攔截kmalloc void *__kmalloc(size_t size, gfp_t flags);
我可以使用kretprobe結構的handler
成員找出kmalloc的返回值。
static struct kretprobe kmalloc_probe = {
.handler = kmalloc_ret_handler,
.entry_handler = kmalloc_entry_handler,
.data_size = sizeof(struct kmalloc_read_args),
.maxactive = 20,
};
但是我需要一種方法來查找在entry_handler中調用函數的參數。 這是我的entry_handler函數:
static int kmalloc_entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs)
我試着在regs struct參數的所有寄存器中搜索,但沒有運氣。 我正在使用的架構是i686。 我知道jprobes可以更好地解決這類問題,但我需要使用kretprobes來解決它。 你能告訴我如何使用寄存器或堆棧來查找函數調用參數嗎?
pt_regs結構的鏈接: http ://lxr.free-electrons.com/source/arch/x86/include/asm/ptrace.h#L11
在x86中的內核中傳遞參數的約定在asm / calling.h中的注釋中描述。
在32位x86系統上,Linux內核中函數的第一個參數(系統調用和其他一些東西除外)通常按順序在%eax,%edx,%ecx中傳遞。 這是因為源代碼是使用'-mregparm = 3'GCC選項編譯的,默認設置。 這是因為至少內核2.6.32,或者甚至更早。
其余參數在堆棧上傳遞。
如果函數有一個變量參數列表(比如sprintf()
),那么就我所見,所有參數都在棧上傳遞。
因此,在您的情況下, size
應該在%eax和flags
- 在輸入函數時的%edx中。 如果這些寄存器沒有被kretprobe以某種方式破壞,你應該能夠在pt_regs
找到它們。
在64位x86系統上,約定更簡單,更符合x86-64 ABI。 內核函數的第一個參數(再次,除了系統調用和一些特殊函數)在%rdi,%rsi,%rdx,%rcx,%r8,%r9中按順序傳遞,其余的在堆棧上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.