分类: LINUX
2013-08-14 17:32:15
2. imp2_k.c
该程序为内核模块程序。其完成的功能如下:
(1)创建一种新的Netlink协议NL_IMP2,并注册该协议的回调函数kernel_receive。但用户空间通过建立且协议类型为NL_IMP2的socket套接字并调用sendto,sendmsg函数发送数据时,传送到内核空间的数据由kernel_receive进行处理。该函数主要是记录用户进程的ID,用于随后发送数据的时候指定目的。
(2)在Netfilter的hook点NF_IP_PRE_ROUTING注册hook函数get_icmp,对经过该hook点的ping包进行处理。get_icmp首先判断是否是ping包,如果不是,直接Accept。如果是,则记录该包的源IP和目的IP,然后调用send_to_user,将记录的信息发送给kernel_recieve函数中记录的用户进程ID。
该文件的源码如下:
3. imp2_u.c
该程序为用户空间的测试程序。该程序包括以下功能:
(1)生成NL_IMP2协议的socket.然后通过调用sendto发送IMP2_U_PID类型的请求信息给内核。然后等待接受内核发回的信息。记住:仅当有ping包经过内核的NF时,内核才会向用户进程发送信息。
(2)当用户进程通过Ctrl+C来结束该程序时,调用信号处理函数sig_int,向内核发送IMP2_CLOSE的消息,结束socket。
该文件的源码如下:
二、编译和测试
1. 整个源文件编译的Makefile如下:
all:
gcc -O2 -DMODULE -D__KERNEL__ -W -Wstrict-prototypes -Wmissing-prototypes -isystem /lib/modules/`uname -r`/build/include -c -o imp2_k.o imp2_k.c gcc imp2_u.c -o imp2_u
install: insmod imp2_k.o uninstall: rmmod imp2_k clean: rm -f imp2_k.o imp2_u |
[root@localhost imp2]# ./imp2_u
src: 192.168.1.100, dest: 192.168.1.101
src: 192.168.1.100, dest: 192.168.1.101
src: 192.168.1.100, dest: 192.168.1.101
src: 192.168.1.100, dest: 192.168.1.101