- 论坛徽章:
- 0
|
目前有需求要实现中断处理函数的hook,基本思路如下:
1:通过对文件/proc/kallsyms的处理,找到中断处理函数的函数地址,比如键盘中断gpio_keys_isr的函数地址是0xc02c7cec。
2:修改该函数地址的前三条指令为0xe59ff000, 0xe1a08008, (int)funcHook,实现函数跳转,跳到我的自定义函数funcHook。
3:在我的自定义函数里边:
asmlinkage void Hook_IRQ()
{
printk("debug here\r\n");
// 下边三行是恢复中断处理函数的前三条指令
((int *)0xc02c7cec)[0] = g_hookObj.codeBegin[0];
((int *)0xc02c7cec)[1] = g_hookObj.codeBegin[1];
((int *)0xc02c7cec)[2] = g_hookObj.codeBegin[2];
// 下边通过内联汇编实现跳转回原中断处理函数,中断处理函数的函数地址是0xc02c7cec
int temp = 0xc02c7cec;
asm(
"mov R4, %0\n"
"mov pc, R4\n"
:
:"r"(temp)
);
return;
}
运行下来,确实有钩到中断处理函数,printk有打印到,关键是返回原中断处理函数时会报一堆oops错误,应该是那一段内联汇编代码用的不对,请高手帮忙指点一下!!! |
|