通过前面的介绍
知道参数在寄存器及堆栈的位置,我们就有可能显示参数的值
jprobe也可以显示参数的值,但是其有缺点:不能探测函数时加上偏移量
具体上下文请参考: ARM架构kprobe应用及实现分析(3.0 被探测函数说明)
导出参数的函数:
static int dump_arm_parameter(struct pt_regs *regs)
{
int i=0;
unsigned int * sp = regs->uregs[13];
printk(" func paras maybe : (0x%08x,0x%08x,0x%08x,0x%08x,0x%08x,0x%08x) \n",\
regs->uregs[0],\
regs->uregs[1],\
regs->uregs[2],\
regs->uregs[3],\
*sp,\
*(sp+1)\
);
return 0;
}
使用情形:
static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
printk("shitshit kprobes name is %s pt_regs size is %d \n",p->symbol_name,sizeof(regs->uregs));
dump_arm_regs(regs->uregs);
dump_arm_stack((unsigned int *)regs->uregs[13],5);
dump_arm_parameter(regs);
return 0;
}
kernel log 输出如下:
func paras maybe : (0x00000011,0x00000022,0x00000033,0xc077c670,0x00000044,0x00000055)
与我们实际传入的一致
good luck