免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2728 | 回复: 6
打印 上一主题 下一主题

[硬件及驱动] ARM+Linux平台,我对中断处理函数进行hook? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-13 15:46 |只看该作者 |倒序浏览
目前有需求要实现中断处理函数的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错误,应该是那一段内联汇编代码用的不对,请高手帮忙指点一下!!!

论坛徽章:
0
2
发表于 2012-12-13 17:08
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
3 [报告]
发表于 2012-12-13 17:21 |只看该作者
请大侠们进来帮忙review一下!

论坛徽章:
0
4 [报告]
发表于 2012-12-17 22:50 |只看该作者
感觉有两个问题,
第一:你在手写汇编中使用了r4,那么r4的原值应该就丢失了,这是一个问题。
我没看过别人怎么实现,不过我感觉这种汇编级的hook,最好hook function的入口和出口都是汇编,这样比较容易保持栈的平衡,比如像

Hook_IRQ:
       ...  //保存一些手写汇编中会用到的寄存器和栈
       b _Hook_IRQ  //实际进行逻辑处理的地方 ,调用c code的话,gcc自己会处理栈平衡的问题
      ... //恢复寄存器和栈,注意进出时候栈要平衡

第二:动态修改code的话,要记得刷icache,自己做的话,icache全部invaild就好。

论坛徽章:
0
5 [报告]
发表于 2012-12-18 12:10 |只看该作者
内核已有的 kprobes 应该可以实现这个功能吧?

另: 在ELF格式里 code段不是只读的吗, 运行时修改code段不会产生段错误?

论坛徽章:
0
6 [报告]
发表于 2012-12-22 17:24 |只看该作者
回复 5# wwxbei


    kprobes没有ARM+Linux可用的版本呀!
    BTW:实际试验下来修改代码段是可以的,没有段错误发生。

论坛徽章:
0
7 [报告]
发表于 2012-12-26 18:13 |只看该作者
似乎是hook的时候没保护好现场,寄存器里面的数据都被改变了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP