当前位置:   article > 正文

Linux内核编程:第一个Linux内核代码_内核第一行代码

内核第一行代码

生成testtcp.ko模块,添加到内核。

添加该模块后,每个由该机器发出的数据包,如果是TCP协议,且源端口为81,将其改为RST包发出。

一、代码

1.1 文件:testtcp_main.c

  1. #include <linux/netfilter.h>
  2. #include <linux/netfilter_ipv4.h>
  3. #include <linux/module.h>
  4. #include <linux/moduleparam.h>
  5. #include <linux/kernel.h>
  6. #include <linux/inetdevice.h>
  7. #include <linux/string.h>
  8. #include <net/route.h>
  9. #include <linux/inet.h>
  10. #include <linux/ip.h>
  11. #include <linux/tcp.h>
  12. #include <net/checksum.h>
  13. #include <net/tcp.h>
  14. #include <net/ip.h>
  15. unsigned int hook_mark1(unsigned int hooknum, struct sk_buff *skb,
  16. const struct net_device *in, const struct net_device *out, int (*okfn)(struct sk_buff *))
  17. {
  18. struct iphdr *iph;
  19. struct tcphdr *tcph;
  20. struct sk_buff *sk = skb;
  21. u16 src_port,dst_port;
  22. u16 datalen;
  23. iph = ip_hdr(sk);
  24. tcph = (struct udphdr*)((u_int8_t*)iph + (iph->ihl << 2));
  25. src_port = ntohs(tcph->source);
  26. dst_port = ntohs(tcph->dest);
  27. if(src_port == 81 || dst_port == 81)
  28. printk("<0>""src_port:%d, dst_port:%d, protocol:%d, rst:%d\n",src_port, dst_port, iph->protocol, tcph->rst);
  29. if (iph->protocol == 6 && src_port == 81)
  30. {
  31. printk("<0>""---000---src_port:%d, dst_port:%d, protocol:%d, rst:%d\n",src_port, dst_port, iph->protocol, tcph->rst);
  32. tcph->rst = 1;
  33. iph->check = 0;
  34. iph->check = ip_fast_csum((unsigned char*)iph, iph->ihl);
  35. datalen = ntohs(iph->tot_len) - (iph->ihl << 2);
  36. tcph->check = 0;
  37. tcph->check = csum_tcpudp_magic(iph->saddr, iph->daddr, datalen,
  38. iph->protocol, csum_partial((unsigned char*)tcph, datalen, 0));
  39. skb->ip_summed = CHECKSUM_NONE;
  40. return NF_ACCEPT;
  41. }
  42. return NF_ACCEPT;
  43. }
  44. static struct nf_hook_ops nfho_marker1;
  45. static int init_marker(void)
  46. {
  47. nfho_marker1.hook=hook_mark1;
  48. nfho_marker1.hooknum=NF_INET_LOCAL_OUT;
  49. nfho_marker1.pf=PF_INET;
  50. nfho_marker1.priority=NF_IP_PRI_LAST;
  51. nf_register_hook(&nfho_marker1);
  52. return 0;
  53. }
  54. static void exit_marker(void)
  55. {
  56. nf_unregister_hook(&nfho_marker1);
  57. }
  58. module_init(init_marker);
  59. module_exit(exit_marker);


1.2 文件Makefile:

obj-m := testtcp.o
testtcp-objs := testtcp_main.o


KERNELDIR = /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
      $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
clean:  
      $(MAKE) -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
install:
      cp inerdns.ko ../


注意事项:

      1. 第一行的testtcp.o 与第二行的testtcp_main.o  不能重复。

      2. 第一行的testtcp.o 与第二行的testtcp-objs  前缀必须相同。

      3. “default:”、“clean:  ”、“install:” 下一行的内容,行前面必须有tab键。


二、编译、添加模块到内核

2.1 编译

      执行make,即可编译代码,并生产模块testtcp.ko。

2.2 添加模块到内核

      lsmod                          查看linux内核模块。

      insmod testtcp.ko     将testtcp.ko模块添加到内核。

      (rmmod testtcp           从内核中删除testtcp.ko模块。)


三、测试模块功能

3.1 测试代码

     可以参照以下文章代码修改:http://blog.csdn.net/guowenyan001/article/details/11742621

3.2 linux下访问URL

      curl 192.168.9.200:81 

3.3 抓包查看

      用tcpdump抓包查看,相关数据包是否已经被修改为RST包。

四、注意事项

      内核模块代码,可能会造成系统崩溃,需要重启,所以最好在测试机上测试内核代码。


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/385983
推荐阅读
相关标签
  

闽ICP备14008679号