⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 550.htm

📁 unix高级编程原吗
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<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 + -