Получение аргументов функции с помощью kprobes

Я наложил kprobe на функцию, и теперь мне нужно получить значения ее аргументов в kprobe's

Вот моя функция:

void foobar(int arg, int arg2, int arg3, int arg4, int arg5, int arg6, int arg7, int arg8)
{
    printk("foobar called\n");
}

Ставим на нее kprobe и вызываем функцию:

...
kp.addr = (kprobe_opcode_t *) foobar;
register_kprobe(&kp);

foobar(0xdead1, 0xdead2, 0xdead3, 0xdead4, 0xdead5, 0xdead6, 0xdead7, 0xdead8);

И, наконец, функция прехендлера (взято из здесь):

static int inst_generic_make_request(struct kprobe *p, struct pt_regs *regs)
{
  printk(KERN_INFO "eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
    regs->ax, regs->bx, regs->cx, regs->dx);
    printk(KERN_INFO "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
      regs->si, regs->di, regs->bp, regs->sp);
    regs++;
    //...
}

Вывод из прехендлера функция выглядит так (я увеличил указатель regs3 раза)

May 10 22:58:07 kernel: [  402.640994] eax: 000dead1   ebx: f7d80086   ecx: 000dead3   edx: 000dead2
May 10 22:58:07 kernel: [  402.640996] esi: 00000000   edi: b77c8040   ebp: 00000000   esp: f7d8006c

May 10 22:58:07 kernel: [  402.641006] eax: f7d8032c   ebx: 000dead5   ecx: 000dead6   edx: 000dead7
May 10 22:58:07 kernel: [  402.641007] esi: 000dead8   edi: f7d800e0   ebp: f7d80330   esp: 08049674

May 10 22:58:07 kernel: [  402.641014] eax: 00000080   ebx: 0992b018   ecx: 0000108e   edx: 0992b008
May 10 22:58:07 kernel: [  402.641015] esi: 08049674   edi: b77c8040   ebp: bfe23fb8   esp: bfe23f50

Теперь я вижу аргументы функции foobarв разных регистрах (но где 0xdead4?) , разве они не должны быть в стеке? Как я могу получить доступ к стеку из функции преобработчика? Или как я могу получить аргументы любой функции, не зная их типов и количества? Я знаю, что это может быть непростой задачей (и даже не можно получить все значения), но только приблизительных значений должно быть достаточно. Я вычисляю корреляцию между аргументами двух функций, и мне действительно не нужны точные значения. помогло бы, если бы у меня был ассемблерный код вызывающей функции, где аргументы помещаются в стек)?

6
задан Peter Krejci 12 May 2012 в 12:15
поделиться