全部博文(930)
分类: LINUX
2008-12-08 23:40:05
概述
在此,我们将操作内核源代码以扩展内核本地数据包截获能力。
内核源文件位于 /usr/src/linux,要修改的两个主要文件是 ip_input.c 和 ip_output。这两个文件位于 /usr/src/linux/net/ipv4/ 目录中。
源文件修改:ip_input.c
ip_input.c 包含这两个函数,可以为所有流入数据包调用它们: incoming packets:
ip_local_deliver(struct sk_buff, struct device,struct packet_type)
为所有的流入数据包执行而不考虑目的地
ip_rcv(struct sk_buff, struct device,struct packet_type)
为目的地是本地机器的所有数据包进行调用
sk_buff
device
packet_type
ip_rcv
执行 IP 层所需的几个任务,包括重新装配、校验和计算等。
由于 ip_rcv
处理所有流入的 IP 数据包,因此这是一个添加要对流入数据包执行任何附加代码的好地方。其他选项是用于编写自己的 ip_rcv
例程的。
源文件修改:ip_output.c
与 ip_output 一样,ip_output.c 位于 /usr/src/linux/net/ipv4/ 目录中,它处理流出的数据包。它的四个函数是:
ip_build_and_sent_pkt(struct sk_buff,struct sock,u32 saddr,u32
daddr, struct ip_options)
将 IP 报头添加到 sk_buff 并将其发送出去
ip_queue_xmit(struct sk_buff)
对要发送的数据包排队
ip_build_xmit_slow()
构建和传送数据包
ip_build_xmit()
“快速”构建和传送数据包,该选项只用于无需碎片整理的选项。
只有 ip_build_xmit_slow
和 ip_build_xmit
处理所有流出的 IP 数据包,因此任何额外处理均可在任何阶段完成。对于 ip_input.c,其他选项用于编写自己的例程,然后从这些例程中调用最初的函数。您选择的策略依赖于您要实现的功能。
使用 Makefiles 修改源代码
可以使用 Makefiles 动态修改内核源代码;Makefile 脚本确保对源代码做必需的修改。可以使用一条命令(make install
或 make uninstall
)添加或删除数据包拦截器,然后重新编译内核并重新启动机器。
由于该机制要求修改 Linux 内核源代码,所以快速调试可能非常困难。而且,由于该方法要求重新编译内核,所以这个过程是冗长、复杂且不灵活的。