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

📄 525.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="526.htm">下一篇</a>]
<hr><p align="left"><small>:网络安全工具开发函数库介绍之一 ——libnet(续三) <br>

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

---- <br>

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

:全: <br>

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

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

:/* Example 4 [link-layer api - UDP packet using port list chaining] */ <br>

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

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

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

#include <libnet.h> <br>

#define MAX_PAYLOAD_SIZE    1024 <br>

void usage(char *); <br>

u_char enet_src[6] = {0x0d, 0x0e, 0x0a, 0x0d, 0x00, 0x00}; <br>

u_char enet_dst[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; <br>

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

{ <br>

    int packet_size,                    /* size of our packet */ <br>

        payload_size,                   /* size of our packet */ <br>

        c;                              /* misc */ <br>

    u_long src_ip, dst_ip;              /* source ip, dest ip */ <br>

    u_short bport, eport;               /* beginning and end ports */ <br>



    u_short cport;                      /* current port */ <br>

    u_char payload[MAX_PAYLOAD_SIZE];   /* packet payload */ <br>

    u_char *packet;                     /* pointer to our packet buffer */ <br>

    char err_buf[LIBNET_ERRBUF_SIZE];   /* error buffer */ <br>

    u_char *device;                     /* pointer to the device to use */ <br>

    struct libnet_link_int *network;    /* pointer to link interface struct <br>

*/ <br>

    struct libnet_plist_chain plist;    /* plist chain */ <br>

    struct libnet_plist_chain *plist_p; /* plist chain pointer */ <br>

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

    printf("packet injection interface:\tlink layer\n"); <br>

    printf("packet type:\t\t\tUDP [with payload] using port list chaining\n" <br>

); <br>

    plist_p = NULL; <br>

    device = NULL; <br>

    src_ip = 0; <br>

    dst_ip = 0; <br>

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

    { <br>

        switch (c) <br>

        { <br>

            case 'd': <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>

                break; <br>

            case 'i': <br>

                device = optarg; <br>

                break; <br>

            case 's': <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>

            case 'p': <br>

                plist_p = &plist; <br>

                if (libnet_plist_chain_new(&plist_p, optarg) == -1) <br>

                { <br>



                    libnet_error(LIBNET_ERR_FATAL, <br>

                                 "Could not build port list\n"); <br>

                } <br>

                break; <br>

            default: <br>

                usage(argv[0]); <br>

                exit(EXIT_FAILURE); <br>

        } <br>

    } <br>

    if (!src_ip || !dst_ip || !plist_p) <br>

    { <br>

        usage(argv[0]); <br>

        exit(EXIT_FAILURE); <br>

    } <br>

    c = argc - optind; <br>

    if (c != 1) <br>

    { <br>

        usage(argv[0]); <br>

        exit(EXIT_FAILURE); <br>

    } <br>

    memset(payload, 0, sizeof(payload)); <br>

    strncpy(payload, argv[optind], strlen(argv[optind])); <br>



    /* <br>

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

     */ <br>

    if (device == NULL) <br>

    { <br>

        struct sockaddr_in sin; <br>

        /* <br>

         *  Try to locate a device. <br>

         */ <br>

        if (libnet_select_device(&sin, &device, err_buf) == -1) <br>

        { <br>

            libnet_error(LIBNET_ERR_FATAL, <br>

                         "libnet_select_device failed: %s\n", err_buf); <br>

        } <br>

        printf("device:\t\t\t\t%s\n", device); <br>

    } <br>

    if ((network = libnet_open_link_interface(device, err_buf)) == NULL) <br>

    { <br>

        libnet_error(LIBNET_ERR_FATAL, <br>

                     "libnet_open_link_interface: %s\n", err_buf); <br>

    } <br>

    /* <br>

    /* <br>

     *  Get the payload from the user.  Hrm.  This might fail on a Sparc <br>

     *  if byte alignment is off... <br>

     */ <br>

    payload_size = strlen(payload); <br>

    /* <br>

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

     *  link-layer API, so this time we need memory for a ethernet header <br>

     *  as well as memory for the ICMP and IP headers and our payload. <br>

     */ <br>

    packet_size = LIBNET_IP_H + LIBNET_ETH_H + LIBNET_UDP_H + payload_size; <br>

    /* <br>

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

     */ <br>

    if (libnet_init_packet(packet_size, &packet) == -1) <br>

    { <br>

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

    } <br>

    /* <br>

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

     */ <br>

    libnet_build_ethernet(enet_dst, <br>

            enet_src, <br>



            ETHERTYPE_IP, <br>

            NULL, <br>

            0, <br>

            packet); <br>

    /* <br>

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

     */ <br>

    libnet_build_ip(LIBNET_UDP_H + payload_size, <br>

            0,                      /* IP tos */ <br>

            242,                    /* IP ID */ <br>

            0,                      /* Frag */ <br>

            64,                     /* TTL */ <br>

            IPPROTO_UDP,            /* Transport protocol */ <br>

            src_ip,                 /* Source IP */ <br>

            dst_ip,                 /* Destination IP */ <br>

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

            0, <br>

            packet + LIBNET_ETH_H); /* Packet header memory */ <br>

    while (libnet_plist_chain_next_pair(plist_p, &bport, &eport)) <br>

    { <br>

        while (!(bport > eport) && bport != 0) <br>

        { <br>

        { <br>

            cport = bport++; <br>

            /* <br>

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

             */ <br>

            libnet_build_udp(242,           /* source port */ <br>

                    cport,                  /* dest. port */ <br>

                    payload,                /* payload */ <br>

                    payload_size,           /* payload length */ <br>

                    packet + LIBNET_ETH_H + LIBNET_IP_H); <br>

            /* <br>

             *  Step 4: Packet checksums (ICMP header *AND* IP header). <br>

             */ <br>

            if (libnet_do_checksum(packet + ETH_H, IPPROTO_UDP, LIBNET_UDP_H <br>

 + payload_size) == -1) <br>

            { <br>

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

); <br>

            } <br>

            if (libnet_do_checksum(packet + ETH_H, IPPROTO_IP, LIBNET_IP_H) <br>

== -1) <br>

            { <br>

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



); <br>

            } <br>

            /* <br>

             *  Step 5: Packet injection. <br>

             */ <br>

            c = libnet_write_link_layer(network, device, packet, packet_size <br>

); <br>

            if (c < packet_size) <br>

            { <br>

                libnet_error(LN_ERR_WARNING, <br>

                             "libnet_write_link_layer only wrote %d bytes\n" <br>

, c); <br>

            } <br>

            else <br>

            { <br>

                printf("construction and injection completed, wrote all %d b <br>

ytes, port %d\n", <br>

                       c, cport); <br>

            } <br>

        } <br>

    } <br>

    /* <br>

    /* <br>

     *  Shut down the interface. <br>

     */ <br>

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

    { <br>

        libnet_error(LN_ERR_WARNING, <br>

        "libnet_close_link_interface 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 [-i interface] -s s_ip -d d_ip -p port list p <br>

ayload\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="526.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 + -