📄 550.htm
字号:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>CTerm非常精华下载</title>
</head>
<body bgcolor="#FFFFFF">
<table border="0" width="100%" cellspacing="0" cellpadding="0" height="577">
<tr><td width="32%" rowspan="3" height="123"><img src="DDl_back.jpg" width="300" height="129" alt="DDl_back.jpg"></td><td width="30%" background="DDl_back2.jpg" height="35"><p align="center"><a href="http://apue.dhs.org"><font face="黑体"><big><big>apue</big></big></font></a></td></tr>
<tr>
<td width="68%" background="DDl_back2.jpg" height="44"><big><big><font face="黑体"><p align="center"> ● UNIX网络编程 (BM: clown) </font></big></big></td></tr>
<tr>
<td width="68%" height="44" bgcolor="#000000"><font face="黑体"><big><big><p align="center"></big></big><a href="http://cterm.163.net"><img src="banner.gif" width="400" height="60" alt="banner.gif"border="0"></a></font></td>
</tr>
<tr><td width="100%" colspan="2" height="100" align="center" valign="top"><br><p align="center">[<a href="index.htm">回到开始</a>][<a href="517.htm">上一层</a>][<a href="551.htm">下一篇</a>]
<hr><p align="left"><small>:网络安全工具开发函数库介绍之三——libnids <br>
---------------------------------------------------------------------------- <br>
---- <br>
: backend 于 00-7-17 14:46:51 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>
:全: <br>
:绿色兵团版权所有。未经允许,不得转载! <br>
:网络安全工具开发函数库介绍之三——libnids <br>
:作者:backend <backend@isbase.com> <br>
: <http://www.isbase.com> <br>
:日期:2000-07-16 <br>
:绿色兵团版权所有。未经允许,不得转载! <br>
:<<< 续前 >>> <br>
:---[[ libnids ]]------------------------------------------ <br>
&&& <br>
:一、简介 <br>
libnids的英文意思是 Network Intrusion Detect System library,即网络入侵监 <br>
测系统函数库。它是在前面介绍的两种C函数接口库libnet和libpcap的基础上开发的, <br>
封装了开发NIDS所需的许多通用型函数。linids提供的接口函数监视流经本地的所有网 <br>
络通信,检查数据包等。除此之外,还具有重组TCP数据段、处理IP分片包和监测TCP端 <br>
口扫描的功能。利用libnids接口函数库,NIDS开发者不需要再编写底层的网络处理代码 <br>
,只需专注于NIDS本身功能的实现即可。 <br>
libnids支持Linux、Solaris和*BSD系统平台,目前最新版本为1.13。 <br>
:二、IP分片数据包 <br>
为了使libnids能接收所有的IP数据包(包括分片包、畸形包等),程序员需要定义如 <br>
下的回调函数: <br>
void ip_frag_func(struct ip * a_packet) <br>
在调用nids_init()函数初始化后,使用nids的函数进行注册: <br>
nids_register_ip_frag(ip_frag_func); <br>
这样回调函数ip_frag_func会在适当的时候由libnids调用,参数a_packet指针将指向接 <br>
收到的数据报。 <br>
类似地,如果仅接收目标主机会接受的数据包(如非碎片包、重组包或头部校验正确 <br>
的数据包等),需要定义如下回调函数: <br>
void ip_func(struct ip * a_packet) <br>
然后注册: <br>
nids_register_ip(ip_func); <br>
:三、TCP数据流重组 <br>
要接收TCP流在交换的数据,必须定义如下回调函数: <br>
void tcp_callback(struct tcp_stream * ns, void ** param) <br>
tcp_stream结构提供了一个TCP连接的所有信息。例如,它包含了客户端与服务器端的h <br>
alf_stream结构。下文会对该结构的字段进行解释。 <br>
tcp_stream结构有一个名为nids_state的字段。此字段的数值将决定tcp_callback <br>
的操作。 <br>
(a) ns->nids_state==NIDS_JUST_EST时,ns表示一个刚刚建立的连接。 <br>
tcp_callback可以据此决定是否对该连接的后续数据进行检查。如 <br>
需要检查,tcp_callback回调函数将通知libnids它希望接收哪些 <br>
数据(如到客户端的数据、到服务器端的数据、到客户端的紧急数 <br>
据或到服务器端的紧急数据等),然后返回。 <br>
(b) ns->nids_state==NIDS_DATA时,表示ns连接接收到新的数据。 <br>
half_stream结构中的缓冲区用于存放这些数据。 <br>
(c) nids_state字段为其它数值(NIDS_CLOSE、NIDS_RESET、 <br>
NIDS_TIMEOUT)时,表示该连接已经关闭了。tcp_callback函数应 <br>
释放相关资源。 <br>
:四、一个简单的实例 <br>
下面的源代码是一个非常简单的程序,它将libnids捕获的所有TCP连接交换的数据 <br>
输出显示到标准输出设备上。 <br>
-----------------------BEGINING OF CODE-------------------------------- <br>
#include "nids.h" <br>
#include <string.h> <br>
#include <stdio.h> <br>
extern char * inet_ntoa(unsigned long); <br>
// tuple4结构包含了TCP连接两端的IP地址和端口,以下函数将它们转换为字符串 <br>
// 格式,如10.0.0.1,1024, 10.0.0.2,23 <br>
char * <br>
adres (struct tuple4 addr) <br>
{ <br>
static char buf[256]; <br>
strcpy (buf, inet_ntoa (addr.saddr)); <br>
sprintf (buf + strlen (buf), ",%i,", addr.source); <br>
strcat (buf, inet_ntoa (addr.daddr)); <br>
sprintf (buf + strlen (buf), ",%i", addr.dest); <br>
return buf; <br>
} <br>
void <br>
tcp_callback (struct tcp_stream *a_tcp, void ** this_time_not_needed) <br>
{ <br>
char buf[1024]; <br>
strcpy (buf, adres (a_tcp->addr)); // we put conn params into buf <br>
if (a_tcp->nids_state == NIDS_JUST_EST) <br>
{ <br>
// a_tcp所定义的连接已经建立。此处可视程序需要添加额外 <br>
// 的判断处理。如if (a_tcp->addr.dest != 23) return;表 <br>
// 示不处理目标端口为23的数据包。 <br>
// 本例需要处理(显示)所有数据包,故: <br>
a_tcp->client.collect++; // 需要处理客户端接收的数据 <br>
a_tcp->server.collect++; // 和服务器端接收的数据 <br>
a_tcp->server.collect_urg++; // 需要处理服务器端接收的紧急数据 <br>
#ifdef WE_WANT_URGENT_DATA_RECEIVED_BY_A_CLIENT <br>
a_tcp->client.collect_urg++; // 需要处理客户端接收的紧急数据 <br>
// (打开编译选项才有效) <br>
#endif <br>
fprintf (stderr, "%s established\n", buf); <br>
return; <br>
} <br>
if (a_tcp->nids_state == NIDS_CLOSE) <br>
{ <br>
// TCP连接正常关闭 <br>
fprintf (stderr, "%s closing\n", buf); <br>
return; <br>
} <br>
if (a_tcp->nids_state == NIDS_RESET) <br>
{ <br>
// TCP连接因RST数据包而关闭 <br>
fprintf (stderr, "%s reset\n", buf); <br>
return; <br>
} <br>
if (a_tcp->nids_state == NIDS_DATA) <br>
{ <br>
// 接收到新数据,下面判断决定是否显示 <br>
struct half_stream *hlf; <br>
if (a_tcp->server.count_new_urg) <br>
{ <br>
{ <br>
// 服务器端接收的紧急数据 <br>
strcat(buf,"(urgent->)"); <br>
buf[strlen(buf)+1]=0; <br>
buf[strlen(buf)]=a_tcp->server.urgdata; <br>
write(1,buf,strlen(buf)); <br>
return; <br>
} <br>
#ifdef WE_WANT_URGENT_DATA_RECEIVED_BY_A_CLIENT <br>
if (a_tcp->client.count_new_urg) <br>
{ <br>
// 客户端接收的紧急数据 <br>
strcat(buf,"(urgent->)"); <br>
buf[strlen(buf)+1]=0; <br>
buf[strlen(buf)]=a_tcp->server.urgdata; <br>
write(1,buf,strlen(buf)); <br>
return; <br>
} <br>
#endif <br>
if (a_tcp->client.count_new) <br>
{ <br>
// 客户端接收的数据 <br>
hlf = &a_tcp->client; // 准备显示客户端接收的数据 <br>
strcat (buf, "(<-)"); // 指示数据流方向 <br>
} <br>
else <br>
{ <br>
hlf = &a_tcp->server; // 准备显示服务器端接收的数据 <br>
strcat (buf, "(->)"); // 指示数据流方向 <br>
} <br>
fprintf(stderr,"%s",buf); // 首先输出显示连接双方的IP地址、端口 <br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -