一个用kld替换内核函数指针的例子

2009-05-13 03:29:51来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

参照相关文档,写了(或者说是验证了)一个用kld修改函数指针,从而替换内核函数的例子,以icmp输入函数icmp_input()为例。这个简单的例子将内核中对icmp_input()的函数指针调用替换为对自己的new_icmp_input()的调用。我们可以在new_icmp_input()函数中对收到的报文进行自定义的解析处理。但是在本例中,我们不做任何处理,仅打印出一行调试信息,随后继续调用我们保存下来的系统原来的icmp_input()函数,从而完成正常的icmp输入处理。
工作目录下有两个文件,一个是Makefile,一个是我们的源文件icmphook.c。
Makefile文件的内容如下:
CODE:
[Copy to clipboard]
      1    KMOD=   icmphook
      2    SRCS=   icmphook.c
      3
      4    .include icmphook.c文件的内容如下:
CODE:
[Copy to clipboard]
      1    #include
      2    #include
      3    #include
      4    #include
      5    #include
      6    #include
      7    #include
      8    #include
      9   
     10    extern struct protosw inetsw[];
     11    extern u_char ip_protox[];
     12    void new_icmp_input(struct mbuf *, int);
     13    void *old_icmp_input;
     14   
     15    void new_icmp_input(struct mbuf * m, int off)
     16    {
     17        printf("new_icmp_input recv packet!\n");
     18        ((void (*)(struct mbuf *, int))old_icmp_input)(m, off);
     19    }
     20   
     21    static int
     22    load(struct module *module, int cmd, void *arg)
     23    {
     24        int error = 0;
     25   
     26        switch(cmd) {
     27        case MOD_LOAD:
     28            uprintf("Replacing ICMP Input\n");
     29            old_icmp_input = inetsw[ip_protox[IPPROTO_ICMP]].pr_input;
     30            inetsw[ip_protox[IPPROTO_ICMP]].pr_input = new_icmp_input;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Garcia regains Peru presidency in runoff (6.5)

下一篇:“How To Become A Hacker”摘录