织梦CMS - 轻松建站从此开始!

罗索

一个简单的生成包和发包的程序

落鹤生 发布于 2011-10-17 13:13 点击:次 
步骤: 1。先生成包 定义结构体 定义结构体变量 给结构体变量赋值 #define FLOWCOUNT 30 包头结构 struct netflow_header { unsigned short version; unsigned short count; unsigned int sysUptime; unsigned int unix_seconds; unsigned int unix_nanoseconds; unsig
TAG:

步骤:

1。先生成包

定义结构体
定义结构体变量
给结构体变量赋值
#define FLOWCOUNT 30

包头结构
struct netflow_header  
{
        unsigned short  version;
        unsigned short  count;
        unsigned int sysUptime;
        unsigned int unix_seconds;
        unsigned int unix_nanoseconds;
        unsigned int flow_sequence_number;
        unsigned char engine_type;
        unsigned char engine_ID;
        unsigned short  reserved;

};
payload结构
struct netflow_Entry
{
        unsigned int src_Ip;
        unsigned int dst_Ip;
        unsigned int next_hop_Ip;
        unsigned short  input_interface_index;
        unsigned short  output_interface_index;
        unsigned int packets;
        unsigned int bytes;
        unsigned int start_time;
        unsigned int end_time;
        unsigned short  src_Port;
        unsigned short  dst_Port;
        unsigned char pad;
        unsigned char flag;
        unsigned char proto;
        unsigned char tos;
        unsigned short  src_AS;
        unsigned short dst_AS;
        unsigned char src_netmask_len;
        unsigned char dst_netmask_len;
        unsigned short  padding;

};

整体包结构
struct netflow_pkt               
{
        struct netflow_header hdr;//包头  
        struct netflow_Entry  entry[30];  payload

} pkts;

2。再发包

建立socket,
建立connection
把前面生成的包发出去

unsigned int GetTickCount()
{
    struct tms tm;
    return (unsigned int)times(&tm);
}

unsigned int rand_long()
{
        unsigned int ip_addr,ip1,ip2,ip3,ip4;
        ip1 = rand()%254+1;
        ip2 = rand()%254+1;
        ip3 = rand()%254+1;
        ip4 = rand()%254+1;

        ip_addr = (ip1<<24)+(ip2<<16)+(ip3<<8)+ip4;

        return ip_addr;
}

生成一个包
create_packet()     
{
        int   i = 0;
        int   j = 0;
        int   k = 0;
        unsigned int currentT;
        int counts = FLOWCOUNT;
       int numbytes;
       socklen_t socklen = sizeof(servaddr);


        pkts.hdr.version   = htons(5);

        pkts.hdr.count     = htons(counts);

        currentT = GetTickCount() ;
        pkts.hdr.sysUptime = htons(currentT - 2000);

        pkts.hdr.unix_seconds = htons(currentT/1000);
        pkts.hdr.unix_nanoseconds = htons(currentT - pkts.hdr.unix_seconds * 1000);
        pkts.hdr.engine_ID = (unsigned char)11;
        pkts.hdr.engine_type = (unsigned char)1;
        pkts.hdr.reserved = (unsigned char)1;


        for (i =0; i < counts ; i++)
        {
                pkts.entry[i].src_Ip =htons(rand_long());
                pkts.entry[i].dst_Ip =htons(rand_long());
                pkts.entry[i].next_hop_Ip=htons(rand_long());

                pkts.entry[i].input_interface_index = htons(rand()%3+1);
                pkts.entry[i].output_interface_index =htons(rand()%3+1);

                pkts.entry[i].packets = htons(rand()%1000+5);
                pkts.entry[i].bytes = htons(rand()%2048 + 48);

                pkts.entry[i].start_time = htons(currentT - 1500);
                pkts.entry[i].end_time= htons(currentT - 100);

                pkts.entry[i].src_Port =  htons(rand()%65533+1);
                pkts.entry[i].dst_Port =  htons(rand()%65533+1);

                pkts.entry[i].pad = htons(1);
                pkts.entry[i].flag = htons(rand()%8129);

                if(counts%2 == 0)
                  pkts.entry[i].proto = (unsigned char)1;  //lfc changed
                else
                if(counts%3 == 0)
                  pkts.entry[i].proto = (unsigned char)6;
                else
                  pkts.entry[i].proto = (unsigned char)17;

                pkts.entry[i].tos = (unsigned char)1;

                pkts.entry[i].src_AS = htons(rand()%100+1);
                pkts.entry[i].dst_AS = htons(rand()%100+1);

                pkts.entry[i].src_netmask_len = htons(24);
                pkts.entry[i].dst_netmask_len = htons(24);

                pkts.entry[i].padding=htons(0);

        }

}
int clifd;

struct sockaddr_in servaddr,cliaddr;

发包函数
send_packet(char *server_addr_string,unsigned int server_port)
{

       if ((clifd = socket(AF_INET,SOCK_DGRAM,0)) < 0)
       {
              printf("create socket error!/n");
              exit(1);
       }
     
       bzero(&cliaddr,sizeof(cliaddr));
       cliaddr.sin_family = AF_INET;
       cliaddr.sin_addr.s_addr = htons(INADDR_ANY);
       cliaddr.sin_port = htons(0);

       bzero(&servaddr,sizeof(servaddr));
       servaddr.sin_family = AF_INET;
       inet_aton(server_addr_string,&servaddr.sin_addr);
       servaddr.sin_port = htons(server_port);

if ((numbytes=sendto(clifd, (char *)&pkts,24+48*FLOWCOUN T, 0, (struct sockaddr *)&servaddr, socklen)) == -1)
{
printf("error send !/n");
printf("Wait Error:%s/n",strerror(errno));
exit(1);
}
}

主程序
int main()
{
create_packet();                   先生成包
send_packet(str_dst_ip,dst_port);  再发包

(yufangbo)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201110/15150.html]
本文出处:blog.csdn.net/yufangbo 作者:yufangbo
顶一下
(1)
50%
踩一下
(1)
50%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容