-
Здравствуйте господа. Стоит задача сформировать ICMP пакет сомостоятельно, тоесть заполнить заголовок IP и ICMP вручную. Составление заголовка проблем не вызывает, проблема возникает при его отправке. Когда я пытаюсь отправить свой пакет к ниму приписывается еще один IP заголовок. А мой пакет помещается в поле данных пакета созданного программой. Сле кто сталкивался с этой проблемой подскажите пожалуйста как правельно создать и настроить сокет(я подозреваю дело именно в этом) чтобы можно было отправлять пакет как есть, без добавления дополнительных заголовков. Зарание спасибо. Есле это играет роль, то пишу на Delphi 2009
-
код где, как ты его заплоняешь?
-
Я заполняю так: //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.
-
const IPPROTO_RAW = 255; ... FSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
-
Не помогло, тот же результат
-
Та быть того не могёт)
У индейцев в IdICMPClient "тот", а у тебя "не тот" ?
-
Вот выкладывыю перехваченый с пылу-жару пакет.
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 );
-
> //SetSockOpt(FSocket, IPPROTO_IP, IP_HDRINCL, @Op, SizeOf(Op));
Зачем закомментарил ? Ведь этой строчкой ты как раз и указываешь, что в случае с IPPROTO_IP IP-заголовок ты формируешь сам и ТCP/IP-стек при этом не обязан заботиться о его формировании
-
Я пробовол поразному, никакой варинт не подошол. Строчку оставил, чтобы показать те методы которые опробовал.
-
Странно это ..
Ну а сто мешает оттрассировать пошагово соотв.код в составе того же IdICMPClient с целью выяснения правильной последовательности с правильными же параметрами вызовов WinsockAPI ?
-
Пробовал, но не нашол где заполняеться IP заголовок, помоему в этом компаненьте он также заполняется автоматически.
-
Неужели нет никого кто сталкивался с падобной проблемой?
|