最近听过应用层的朋友用的是libnids库,因此大致看了一下。
1.libnids库完全是应用层的函数库,基本上没有内核相关的操作。
2.libnids底层收包用的是libpcap函数,几个主要的libpcap函数接口是:
pcap_open_live(pcap_open_offline) --> nids_init
pcap_loop --> nids_run
pcap_next --> nids_next
pcap_dispatch --> nids_dispatch
3.报文处理回调函数封装为:
nids_pcap_handler
4.libnids处理ip分片,tcp会话重组。libnids号称的稳定性据说是因为“代码拷贝自Linux内核,因此与内核协议栈有一样的稳定性”。
TCP会话重组部分似乎比内核中的代码简单,可能是因为buffer处理部分比较简单。
//==================
5. 用户注册回调函数:
nids_register_ip_frag (接收 未进行ip分片重组的原始报文)
nids_register_ip
nids_register_tcp
nids_register_udp
分别存储在:ip_frag_procs,ip_procs,tcp_procs,udp_procs的item指针中。
6.在ndis_init的时候,首先调用init_procs,
a.在ip_frag_procs中注册默认处理函数:gen_ip_frag_proc,调用ip_defrag_stub -->ip_defrag 进行ip分片重组。
b.在ip_procs中注册默认的处理函数:gen_ip_proc, gen_ip_proc函数根据报文类型处理tcp,dup,icmp包。
7.tcp会话重组,待续。