• NoRTeN (13.04.10 23:52) [0]
    Здравствуйте господа. Стоит задача сформировать ICMP пакет сомостоятельно, тоесть заполнить заголовок IP и ICMP вручную.
    Составление заголовка проблем не вызывает, проблема возникает при его отправке. Когда я пытаюсь отправить свой пакет к ниму приписывается еще один IP заголовок. А мой пакет помещается в поле данных пакета созданного программой. Сле кто сталкивался с этой проблемой подскажите пожалуйста как правельно создать и настроить сокет(я подозреваю дело именно в этом) чтобы можно было отправлять пакет как есть, без добавления дополнительных заголовков. Зарание спасибо. Есле это играет роль, то пишу на Delphi 2009
  • brother © (14.04.10 05:19) [1]
    код где, как ты его заплоняешь?
  • NoRTeN (14.04.10 09:07) [2]
    Я заполняю так:
    //ICMP пакета
    ICMPhead = record
       icmp_type: byte;        //Тип
       icmp_code: byte ;       //Код
       icmp_chksum: word;      //Контрольная сумма
       icmp_id: word;          //Id
       icmp_seq: word;         //Порядок пакета
       icmp_data: array [0..10] of byte; // можно больше а можно и меньше
    end;

    //IP пакет
    //IP Header
    T_IP_Header = record
       ip_verlen_IHL   : Byte;       //Версия протокола  и длина заголовка
       ip_tos          : Byte;       //Тип сервиса
       ip_totallength  : word;       //Общая длина пакета
    //32 бита
       ip_id           : Word;       //Идентификатор пакета
       ip_offset_Smeh  : Word;       //флаги смещение
    //32 бита
       ip_ttl          : Byte;       //Время жизни пакета
       ip_protocol     : Byte;       //Протокол верхнего уровн
       ip_checksum     : Word;       //Контрольная сумма
    //32 бита
       ip_srcaddr      : array [0..3]of byte;  //IP- адрес отправителя
    //32 бита
       ip_destaddr     : array [0..3]of byte;//IP- адрес получателя
    //1001 байт
       ip_ICMP         : ICMPhead//IP Данные
     end;
    Заполняю поля все поля вручную, из эдитов, после заполнения пакет выглядит так:
    IP
    69 0 30 12 12 0 128 1 41103 (192 168 0 6) (192 168 0 6)  
    ICMP
    8 0 65403 1 123
    Это значение полей соответсвующих структур, в скобках указанна поэлементная запись массови, отвечающего за одно поле структуры.

    Теперь проблемное место, создание сокета и отправление. Тут я совсем не уверен.

    var
    FSocket:TSocket;
    Data:WSAdata;
    op,nTimeOver,CheckS,RB,ConRet,pid:word;
    TCPIP: array [0..100] of byte;
    ChecksumSize,TcpHeaderLen,CheckSum:word;
    Adrr:SockAddr_in;
    Packet,PacketICMP: array [0..60] of byte;

    buf:array [0..60] of byte;
    Znach:byte;
    str:string;
     I: Integer;
     arg:integer;
    begin
    // Создание и настройка сокета
    WSAStartup($0202,Data);
    FSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_IP);

    //WSASocket(AF_INET ,SOCK_RAW,IPPROTO_IP,nil,0,SECURITY_PROTOCOL_NONE);
    //op:=1;
    //setsockopt(FSocket,IPPROTO_IP,SO_OOBINLINE,@op,sizeof(op));
    //nTimeOver:=10000;
    //setsockopt(FSocket,SOL_SOCKET,SO_BROADCAST,@nTimeOver,sizeof(nTimeOver));
    //SetSockOpt(FSocket, IPPROTO_IP, IP_HDRINCL, @Op, SizeOf(Op));
    Adrr.sin_family:=AF_INET;
    Adrr.sin_addr.S_addr:=inet_addr('192.168.217.128');
    ConRet:=connect(FSocket, Adrr, sizeof(Adrr));
    //Заполнение IP заголовка
    ......
    if (send(FSocket,IPp,Sizeof(IPp),0)=SOCKET_ERROR)
           then
             listbox1.Items.Add('Send  error')
           else
             listbox1.Items.Add('Send ok');
    я немного поразному создавать и настраивать сокет , в коментариях второй варинт настройки. Особые сомнения у меня вызывает функция конект, нужнали она? есле нет то как без нее использовать send.
  • Сергей М. © (14.04.10 09:43) [3]
    const
      IPPROTO_RAW    = 255;
    ...
    FSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
  • NoRTeN (14.04.10 16:38) [4]
    Не помогло, тот же результат
  • Сергей М. © (14.04.10 16:50) [5]
    Та быть того не могёт)

    У индейцев в IdICMPClient "тот", а у тебя "не тот" ?
  • NoRTeN (14.04.10 16:57) [6]
    Вот выкладывыю перехваченый с пылу-жару пакет.

    45 00 00 50 0C B9 00 00 80 FF F8 A3 C0 A8 D9 80
    C0 A8 D9 80 {45 00 1E 00 0C 00 00 00 80 01 8F A0
    C0 A8 00 06 C0 A8 00 06 08 00 7B FF 01 00 7B 00  
    00 00 00 00 00 00 00 00 00 00 00 00 08 00 7B FF}  

    Фигурными скобками я выделел куда помещается мой пакет, тоесть какраз первые 20 байт были привинчены.
    Делал так
    FSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_RAW );
  • Сергей М. © (14.04.10 17:20) [7]

    > //SetSockOpt(FSocket, IPPROTO_IP, IP_HDRINCL, @Op, SizeOf(Op));


    Зачем закомментарил ?
    Ведь этой строчкой ты как раз и указываешь, что в случае с IPPROTO_IP IP-заголовок ты формируешь сам и ТCP/IP-стек при этом не обязан заботиться о его формировании
  • NoRTeN (14.04.10 17:37) [8]
    Я пробовол поразному, никакой варинт не подошол. Строчку оставил, чтобы показать те методы которые опробовал.
  • Сергей М. © (14.04.10 17:48) [9]
    Странно это ..

    Ну а сто мешает оттрассировать пошагово соотв.код в составе того же IdICMPClient с целью выяснения правильной последовательности с правильными же параметрами вызовов WinsockAPI ?
  • NoRTeN (14.04.10 17:59) [10]
    Пробовал, но не нашол где заполняеться IP заголовок, помоему в этом компаненьте он также заполняется автоматически.
  • NoRTeN (18.04.10 20:33) [11]
    Неужели нет никого кто сталкивался с падобной проблемой?
Есть новые Нет новых   [134437   +29][b:0][p:0]