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

📄 523.htm

📁 unix高级编程原吗
💻 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="518.htm">上一层</a>][<a href="524.htm">下一篇</a>]
<hr><p align="left"><small>:网络安全工具开发函数库介绍之一 ——libnet(续一) <br>

---------------------------------------------------------------------------- <br>

---- <br>

: backend 于 00-7-15 17:49:59 加贴在 绿盟科技论坛(bbs.nsfocus.com)--UNIX系统安 <br>

:全: <br>

:绿色兵团版权所有。未经允许,严禁转载! <br>

>> <br>

:★ 数据包发送函数 <br>

    打开raw socket: <br>

        int libnet_open_raw_sock(int protocol); <br>

    关闭raw socket: <br>

        int libnet_close_raw_sock(int socket); <br>

    选择接口设备: <br>

        int libnet_select_device(struct sockaddr_in *sin, <br>

                                 u_char **device, u_char *ebuf); <br>

    打开链路层接口设备: <br>

        struct libnet_link_int *libnet_open_link_interface(char *device, <br>

                                                           char *ebuf); <br>

    关闭链路层接口设备: <br>

        int libnet_close_link_interface(struct libnet_link_int *l); <br>

    发送IP数据包: <br>

        int libnet_write_ip(int socket, u_char *packet, int packet_size); <br>

    发送链路层数据包: <br>



        int libnet_write_link_layer(struct libnet_link_int *l, <br>

                                    const u_char *device, u_char *packet, <br>

                                    int packet_size); <br>

    检验和计算: <br>

        int libnet_do_checksum(u_char *packet, int protocol, int packet_size <br>

); <br>

:★ 相关的支持函数 <br>

    随机数种子生成器: <br>

        int libnet_seed_prand(); <br>

    获取随机数: <br>

        u_long libnet_get_prand(int modulus); <br>

    16进制数据输出: <br>

        void libnet_hex_dump(u_char * buf, int len, int swap, FILE *stream); <br>

  <br>

    端口列表链初始化: <br>

        int libnet_plist_chain_new(struct libnet_plist_chain **plist, <br>

                                   char *token_list); <br>

    获取端口列表链的下一项(端口范围): <br>

        int libnet_plist_chain_next_pair(struct libnet_plist_chain *plist, <br>

                                         u_short *bport, u_short *eport); <br>

    端口列表链输出显示: <br>

        int libnet_plist_chain_dump(struct libnet_plist_chain *plist); <br>



    获取端口列表链: <br>

        u_char *libnet_plist_chain_dump_string(struct libnet_plist_chain *pl <br>

ist); <br>

    端口列表链内存释放: <br>

        void libnet_plist_chain_free(struct libnet_plist_chain *plist); <br>

:★ 数据常量 <br>

============================================================================ <br>

====== <br>

:数据包头大小定义: <br>

常量名                          数值(字节数) <br>

LIBNET_ARP_H                    28 <br>

LIBNET_DNS_H                    12 <br>

LIBNET_ETH_H                    14 <br>

LIBNET_ICMP_H                    4 <br>

LIBNET_ICMP_ECHO_H               8 <br>

LIBNET_ICMP_MASK_H              12 <br>

LIBNET_ICMP_UNREACH_H            8 <br>

LIBNET_ICMP_TIMXCEED_H           8 <br>

LIBNET_ICMP_REDIRECT_H           8 <br>

LIBNET_ICMP_TS_H                20 <br>

LIBNET_IGMP_H                    8 <br>

LIBNET_IP_H                     20 <br>



LIBNET_RIP_H                    24 <br>

LIBNET_TCP_H                    20 <br>

LIBNET_UDP_H                     8 <br>

============================================================================ <br>

====== <br>

:数据包内存常量: <br>

常量名                          含义 <br>

LIBNET_PACKET                   TCP/UDP数据包头 + IP数据包头使用的内存 <br>

LIBNET_OPTS                     IP或TCP选项使用的内存 <br>

LIBNET_MAX_PACKET               IP_MAXPACKET (65535字节)使用的内存 <br>

============================================================================ <br>

====== <br>

:随机数发生器常量(libnet_get_prand()函数使用): <br>

常量名                          数值 <br>

LIBNET_PRAND_MAX                65535 <br>

LIBNET_PR2                      0 - 2 <br>

LIBNET_PR8                      0 - 255 <br>

LIBNET_PR16                     0 - 32767 <br>

LIBNET_PRu16                    0 - 65535 <br>

LIBNET_PR32                     0 - 2147483647 <br>

LIBNET_PRu32                    0 - 4294967295 <br>

============================================================================ <br>



====== <br>

:错误消息常量(libnet_error()函数使用): <br>

常量名                          含义 <br>

LIBNET_ERR_WARNING              警告类型消息 <br>

LIBNET_ERR_CRITICAL             紧急类型消息 <br>

LIBNET_ERR_FATAL                致命错误消息 <br>

============================================================================ <br>

====== <br>

:libnet_host_lookup()、libnet_host_lookup_r()和libnet_name_resolve()函数使用的 <br>

:常量: <br>

常量名                          含义 <br>

LIBNET_DONT_RESOLVE             不将IP地址解析为FQDN名 <br>

LIBNET_RESOLVE                  尝试将IP地址解析为FQDN名 <br>

============================================================================ <br>

====== <br>

:宏定义 <br>

宏名                                    功能 <br>

LIBNET_GET_ARENA_SIZE(arena)            返回多数据包内存缓冲区大小(字节数) <br>

LIBNET_GET_ARENA_REMAINING_BYTES(arena) 返回多数据包内存缓冲区剩余空间大小(字 <br>

节数) <br>

LIBNET_PRINT_ETH_ADDR(e)                输出显示ether_addr结构中的以太网地址 <br>

  <br>

  <br>

============================================================================ <br>

====== <br>

:---[[ libnet应用实例 ]]---------------------------------- <br>

    利用libnet函数库开发应用程序的基本步骤非常简单: <br>

     1、数据包内存初始化; <br>

     2、网络接口初始化; <br>

     3、构造所需数据包; <br>

     4、计算数据包检验和; <br>

     5、发送数据包; <br>

     6、关闭网络接口; <br>

     7、释放数据包内存。 <br>

    以下是四个使用了libnet接口函数编写的数据包发送程序。在编译前必须确保libn <br>

et库已成功安装。 <br>

============================ cut here ============================ <br>

/* Example 1 [raw socket api - TCP packet] */ <br>

/* gcc -Wall `libnet-config --defines` \ <br>

   libnet-example-x.c -o libnet-example-x \ <br>

   `libnet-config --libs` */ <br>

#include <libnet.h> <br>

void usage(char *); <br>

int main(int argc, char **argv) <br>

{ <br>

{ <br>

    int network,                /* our network interface */ <br>

        packet_size,            /* packet size */ <br>

        c;                      /* misc */ <br>

    u_long src_ip, dst_ip;      /* ip addresses */ <br>

    u_short src_prt, dst_prt;   /* ports */ <br>

    u_char *cp, *packet;        /* misc / packet */ <br>

    printf("libnet example code:\tmodule 1\n\n"); <br>

    printf("packet injection interface:\traw socket\n"); <br>

    printf("packet type:\t\t\tTCP [no payload]\n"); <br>

    src_ip  = 0; <br>

    dst_ip  = 0; <br>

    src_prt = 0; <br>

    dst_prt = 0; <br>

    while((c = getopt(argc, argv, "d:s:")) != EOF) <br>

    { <br>

        switch (c) <br>

        { <br>

            /* <br>

             *  We expect the input to be of the form `ip.ip.ip.ip.port`.  W <br>

e <br>

             *  point cp to the last dot of the IP address/port string and <br>

             *  then seperate them with a NULL byte.  The optarg now points <br>



to <br>

             *  just the IP address, and cp points to the port. <br>

             */ <br>

            case 'd': <br>

                if (!(cp = strrchr(optarg, '.'))) <br>

                { <br>

                    usage(argv[0]); <br>

                } <br>

                *cp++ = 0; <br>

                dst_prt = (u_short)atoi(cp); <br>

                if (!(dst_ip = libnet_name_resolve(optarg, LIBNET_RESOLVE))) <br>

  <br>

                { <br>

                    libnet_error(LIBNET_ERR_FATAL, <br>

                                 "Bad destination IP address: %s\n", optarg) <br>

; <br>

                } <br>

                break; <br>

            case 's': <br>

                if (!(cp = strrchr(optarg, '.'))) <br>

                { <br>

                    usage(argv[0]); <br>



                } <br>

                *cp++ = 0; <br>

                src_prt = (u_short)atoi(cp); <br>

                if (!(src_ip = libnet_name_resolve(optarg, LIBNET_RESOLVE))) <br>

  <br>

                { <br>

                    libnet_error(LIBNET_ERR_FATAL, <br>

                                 "Bad source IP address: %s\n", optarg); <br>

                } <br>

                break; <br>

        } <br>

    } <br>

    if (!src_ip || !src_prt || !dst_ip || !dst_prt) <br>

    { <br>

        usage(argv[0]); <br>

        exit(EXIT_FAILURE); <br>

    } <br>

    /* <br>

     *  We're just going to build a TCP packet with no payload using the <br>

     *  raw sockets API, so we only need memory for a TCP header and an IP <br>

     *  header. <br>

     */ <br>

     */ <br>

    packet_size = LIBNET_IP_H + LIBNET_TCP_H; <br>

    /* <br>

     *  Step 1: Memory initialization (interchangable with step 2). <br>

     */ <br>

    libnet_init_packet(packet_size, &packet); <br>

    if (packet == NULL) <br>

    { <br>

        libnet_error(LIBNET_ERR_FATAL, "libnet_init_packet failed\n"); <br>

    } <br>

    /* <br>

     *  Step 2: Network initialization (interchangable with step 1). <br>

     */ <br>

    network = libnet_open_raw_sock(IPPROTO_RAW); <br>

    if (network == -1) <br>

    { <br>

        libnet_error(LIBNET_ERR_FATAL, "Can't open network.\n"); <br>

    } <br>

    /* <br>

     *  Step 3: Packet construction (IP header). <br>

     */ <br>

    libnet_build_ip(LIBNET_TCP_H,   /* size of the packet sans IP header */ <br>

            IPTOS_LOWDELAY,         /* IP tos */ <br>



            242,                    /* IP ID */ <br>

            0,                      /* frag stuff */ <br>

            48,                     /* TTL */ <br>

            IPPROTO_TCP,            /* transport protocol */ <br>

            src_ip,                 /* source IP */ <br>

            dst_ip,                 /* destination IP */ <br>

            NULL,                   /* payload (none) */ <br>

            0,                      /* payload length */ <br>

            packet);                /* packet header memory */ <br>

    /* <br>

     *  Step 3: Packet construction (TCP header). <br>

     */ <br>

    libnet_build_tcp(src_prt,       /* source TCP port */ <br>

            dst_prt,                /* destination TCP port */ <br>

            0xa1d95,                /* sequence number */ <br>

            0x53,                   /* acknowledgement number */ <br>

            TH_SYN,                 /* control flags */ <br>

            1024,                   /* window size */ <br>

            0,                      /* urgent pointer */ <br>

            NULL,                   /* payload (none) */ <br>

            0,                      /* payload length */ <br>

            packet + LIBNET_IP_H);  /* packet header memory */ <br>



    /* <br>

     *  Step 4: Packet checksums (TCP header only). <br>

     */ <br>

    if (libnet_do_checksum(packet, IPPROTO_TCP, LIBNET_TCP_H) == -1) <br>

    { <br>

        libnet_error(LIBNET_ERR_FATAL, "libnet_do_checksum failed\n"); <br>

    } <br>

    /* <br>

     *  Step 5: Packet injection. <br>

     */ <br>

    c = libnet_write_ip(network, packet, packet_size); <br>

    if (c < packet_size) <br>

    { <br>

        libnet_error(LN_ERR_WARNING, <br>

                     "libnet_write_ip only wrote %d bytes\n", c); <br>

    } <br>

    else <br>

    { <br>

        printf("construction and injection completed, wrote all %d bytes\n", <br>

 c); <br>

    } <br>

    /* <br>



     *  Shut down the interface. <br>

     */ <br>

    if (libnet_close_raw_sock(network) == -1) <br>

    { <br>

        libnet_error(LN_ERR_WARNING, <br>

                     "libnet_close_raw_sock couldn't close the interface"); <br>

    } <br>

    /* <br>

     *  Free packet memory. <br>

     */ <br>

    libnet_destroy_packet(&packet); <br>

    return (c == -1 ? EXIT_FAILURE : EXIT_SUCCESS); <br>

} <br>

void usage(char *name) <br>

{ <br>

    fprintf(stderr, "usage: %s -s s_ip.s_port -d d_ip.d_port\n", name); <br>

} <br>

============================ cut here ============================ <br>

<<< 待续 >>> <br>

绿色兵团版权所有。未经允许,严禁转载! <br>

=== 说难不难,说易不易。=== <br>

</small><hr>
<p align="center">[<a href="index.htm">回到开始</a>][<a href="518.htm">上一层</a>][<a href="524.htm">下一篇</a>]
<p align="center"><a href="http://cterm.163.net">欢迎访问Cterm主页</a></p>
</table>
</body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -