簡體   English   中英

在kretprobe的entry_handler中獲取探測函數的參數

[英]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.

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