linux函数参数顺序,linux – 使用kprobes获取函数参数

我已经在函数上放了一个kprobe,现在我需要在kprobe的预处理函数中获取它的参数值.

这是我的功能:

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);

最后预处理功能(取自here):

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++;

//...

}

预处理程序函数的输出看起来像这样(我将regs指针增加3次)

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?),它们不应该在堆栈中吗?如何从预处理程序功能访问堆栈?或者如何在不知道其类型和数量的情况下获取任何函数的参数?我知道这可能不是一件容易的事(甚至不可能获得所有值),但只有大约值才足够.我正在计算两个函数的参数之间的相关性,我真的不需要精确的值.如果我有调用函数的汇编代码,其中参数被压入堆栈,它会有帮助吗?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值