通過前面的介紹
知道參數在寄存器及堆棧的位置,我們就有可能顯示參數的值
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