VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1763|回复: 0

[分享] 求助:原始套接字伪造A的TCP数据包发送给B(类似TCP SYN扫描)

[复制链接]
03_avatar_middle
在线会员 发表于 2017-3-3 14:28:24 | 显示全部楼层 |阅读模式
本帖最后由 00011011 于 2017-3-3 14:39 编辑

下面是我写的代码有问题,初学者脑子有点乱。。。。主要是在
if (setsockopt(sendsocket, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR)
        {
                printf("setsocketopt error in IP_HDRINCL !\n %d \n", WSAGetLastError());
                exit(1);
        }
报错
开发环境win10 VS2015       
再就是我这有两张路线图,各位前辈看看对不对





    #include "stdafx.h"

    #include <WinSock2.h>

    #pragma warning(disable:4996)       

    #include <stdio.h>

    #include <string.h>

    #include <WS2tcpip.h>

    #include "mstcpip.h"               

    #include <time.h>

    #pragma comment(lib,"ws2_32.lib")


    #define MAXDATASIZE 1024                                                //缓冲区大小
    #define SOURCE_SOCKET_IN_PORT 12345                                //所伪造的socket通信端口号
    #define TARGET_SOCKET_IN_PORT 54321                                //目标的socket通信端口号
    #define ATTACTER_RECV_PORT 5555                                //本机接收数据包端口号
    #define SOURCEPORT 999                                                //attacker探测zombie初始IPID序列号时所用端口号
    #define TARGETPORT 888                                                //zombie接受attacker初次探测IPID值时所用端口号
    #define SEQ 0x00000001                                                //自定义所伪造zombie的IP地址的序列号
    #define RST 0x04
    #define ACK 0x10
    #define SYN 0x02

    char  *CHAR_SOURCE_IP = "111.37.1.44";                        //所伪造的IP地址
    char  *CHAR_TARGET_IP = "192.168.1.120";                        //目标的IP地址

                                                                                                            //重定义IP数据包头部
    typedef struct ip_header
    {
            unsigned char head_ver_len;        
            unsigned char tos;                                 )
            unsigned short total_len;               
            unsigned short ident;                        
            unsigned short frag_and_flags;  

            unsigned char ttl;                                
            unsigned char proto;                        
            unsigned short checksum;               
            unsigned int sourceIP;                        
            unsigned int destIP;                        
    }IP_HEADER;

    //重定义TCP数据包首部
    typedef struct tcp_header
    {
            USHORT th_sport;                                                //16位源端口
            USHORT th_dport;                                                //16位目的端口
            unsigned int th_seq;                                        //32位序列号seq-----------------------这个是本程序判断的关键
            unsigned int th_ack;                                        //32位确认号        
            unsigned char th_lenres;                                //4位首部长度/6位保留字
            unsigned char th_flag;                                //6位标志位
            USHORT th_win;                                                //16位窗口大小
            USHORT th_sum;                                                //16位校验和
            USHORT th_urp;                                                //16位紧急数据偏移量
    }TCP_HEADER;

    //定义TCP伪首部
    typedef struct psd_tcp_header
    {
            unsigned long saddr; //源地址
            unsigned long daddr; //目的地址
            char mbz; char ptcl; //协议类型
            unsigned short tcpl; //TCP长度
    }PSD_TCP_HEADER;

    //计算首部校验和的函数
    unsigned short checksum(unsigned short * buffer, int size)
    {
            unsigned long cksum = 0;
            unsigned short answer = 0;
            while (size > 1)
            {
                    cksum += *buffer++;                                                                                //cksum=cksum+(*(buffer++)
                    size -= sizeof(USHORT);
            }
            if (size == 1)
            {
                    *(char *)&answer = *(char *)buffer;
                    cksum += answer;
            }
            while (cksum >> 16)
                    cksum = (cksum >> 16) + (cksum & 0xffff);
            return (USHORT)(~cksum);
    }

    /*
    利用RAW SOCKET伪造Zombie的IP地址和端口号向Target发送数据包。
    */
    int attacker2target(int port)        //port:要扫描的端口号
    {
            SOCKET sendsocket;

            struct in_addr sourceaddr;
            char HostName[255];
            SOCKADDR_IN addr_in;
            char SocketSendBuffer[200] = { 0 };                        //发送缓冲区
            char TcpData[] = "hellow world !";

           
            WSADATA wsa;       
            if (WSAStartup(MAKEWORD(2, 2), &wsa) == SOCKET_ERROR)
            {
                    printf("发送套接字,初始化失败!\n%d\n", GetLastError());
                    exit(1);
            }


            if ((sendsocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0, WSA_FLAG_OVERLAPPED)) == INVALID_SOCKET)
            {
                    printf("WSASocket failed with error !\n%d\n", GetLastError());
                    exit(1);
            }

            bool bOpt = true;

            if (setsockopt(sendsocket, IPPROTO_IP, IP_HDRINCL, (char *)&bOpt, sizeof(bOpt)) == SOCKET_ERROR)
            {
                    printf("setsocketopt error in IP_HDRINCL !\n %d \n", WSAGetLastError());
                    exit(1);
            }


            char sourcebuf[20];
            for (int x = 0; x < 20; x++)
            {
                    sourcebuf[x] = CHAR_SOURCE_IP[x];
            }

            struct sockaddr_in source_sockaddr_in, target_sockaddr_in;

            source_sockaddr_in.sin_addr.S_un.S_addr = inet_pton(AF_INET, sourcebuf, CHAR_SOURCE_IP);
            ;

            char targetbuf[20];
            for (int x = 0; x < 20; x++)
            {
                    targetbuf[x] = CHAR_TARGET_IP[x];
            }

            //目标IP地址结构设置
            target_sockaddr_in.sin_family = AF_INET;
            target_sockaddr_in.sin_port = htons(TARGET_SOCKET_IN_PORT);
            target_sockaddr_in.sin_addr.S_un.S_addr = inet_pton(AF_INET, targetbuf, CHAR_TARGET_IP);
           
            IP_HEADER ipheader;
            //设置IP首部
            ipheader.head_ver_len = (4 << 4 | sizeof(ipheader) / sizeof(unsigned long));        //版本号、首部长度
            ipheader.tos = 0;                                                                                                                                //分区服务
            ipheader.total_len = htons(sizeof(IP_HEADER) + sizeof(TCP_HEADER));                                //首部和数据总长度
            ipheader.ident = 0;                                                                                                                                //分片标识
            ipheader.frag_and_flags = 0;                                                                                                        //分片标志(3bit)
            ipheader.ttl = 128;                                                                                                                                //生存时间
            ipheader.proto = IPPROTO_TCP;                                                                                                        //IP包头携带的协议
            ipheader.checksum = 0;                                                                                                                        //首部校验和
            ipheader.sourceIP = source_sockaddr_in.sin_addr.S_un.S_addr;                                        //IP包源地址
            ipheader.destIP = inet_pton(AF_INET, targetbuf, CHAR_TARGET_IP);                                                //IP包目的地址
                                                                                                                                                                                            //ipheader.destIP = target_sockaddr_in.sin_addr.S_un.S_addr;                                                //IP包目的地址

            TCP_HEADER tcpheader;
            //设置TCP首部
            tcpheader.th_sport = htons(SOURCE_SOCKET_IN_PORT);                                                                //源端口号
            tcpheader.th_dport = htons(port);                                                                                                        //目的端口号
            tcpheader.th_seq = htonl(SEQ);                                                                                                        //SYN序列号
            tcpheader.th_ack = 0;                                                                                                                                //ACK序列号置为0
            tcpheader.th_lenres = (sizeof(TCP_HEADER) / 4 << 4 | 0);                                                //TCP长度和保留位
            tcpheader.th_flag = 2;                                                                                                                        //SYN 标志
            tcpheader.th_win = htons(17000);                                                                                                //窗口大小
            tcpheader.th_urp = 0;                                                                                                                                //偏移
            tcpheader.th_sum = 0;                                                                                                                        //校验和        

            PSD_TCP_HEADER psdtcpheader;                                                                                                                        //填充TCP伪首部
            psdtcpheader.saddr = ipheader.sourceIP;
            psdtcpheader.daddr = ipheader.destIP;
            psdtcpheader.mbz = 0;
            psdtcpheader.ptcl = IPPROTO_TCP;
            psdtcpheader.tcpl = htons(sizeof(tcpheader));

                                                                                                      
            char sendbuf[MAXDATASIZE] = { 0 };
            int datasize;
           
            memcpy(sendbuf, &psdtcpheader, sizeof(PSD_TCP_HEADER));
           
            memcpy(sendbuf + sizeof(PSD_TCP_HEADER), &tcpheader, sizeof(tcpheader));
           
            tcpheader.th_sum = checksum((USHORT *)sendbuf, sizeof(PSD_TCP_HEADER) + sizeof(tcpheader));

           

           
            memcpy(sendbuf, &ipheader, sizeof(ipheader));
           
            memcpy(sendbuf + sizeof(ipheader), &tcpheader, sizeof(tcpheader));
           
            memset(sendbuf + sizeof(ipheader) + sizeof(tcpheader), 0, 4);

            datasize = sizeof(ipheader) + sizeof(tcpheader);
           
            ipheader.checksum = checksum((USHORT *)sendbuf, datasize);


            if ((sendto(sendsocket, sendbuf, datasize, 0,
                    (struct sockaddr*)&target_sockaddr_in, sizeof(target_sockaddr_in)) == SOCKET_ERROR))
            {
                    printf("伪造IP数据包发送失败!\t %d \n", WSAGetLastError());
            }

            closesocket(sendsocket);
            WSACleanup();
            return port;                       
    }


    int main()
    {
            int port;
            printf("please enput port number=\n");
            scanf("%d", &port);
            attacker2target(port);
            return 0;
    }




上一篇:国外牛人-微软MVP-PJ Naughter
下一篇:AptitudeSystem 2.0(2017-03-07)
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-7-22 06:05

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表