Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2014.03.16;
Скачать: CL | DM;

Вниз

Raw socket   Найти похожие ветки 

 
NoRTeN   (2010-04-13 23:52) [0]

Здравствуйте господа. Стоит задача сформировать ICMP пакет сомостоятельно, тоесть заполнить заголовок IP и ICMP вручную.
Составление заголовка проблем не вызывает, проблема возникает при его отправке. Когда я пытаюсь отправить свой пакет к ниму приписывается еще один IP заголовок. А мой пакет помещается в поле данных пакета созданного программой. Сле кто сталкивался с этой проблемой подскажите пожалуйста как правельно создать и настроить сокет(я подозреваю дело именно в этом) чтобы можно было отправлять пакет как есть, без добавления дополнительных заголовков. Зарание спасибо. Есле это играет роль, то пишу на Delphi 2009


 
brother ©   (2010-04-14 05:19) [1]

код где, как ты его заплоняешь?


 
NoRTeN   (2010-04-14 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.


 
Сергей М. ©   (2010-04-14 09:43) [3]

const
  IPPROTO_RAW    = 255;
...
FSocket:= Socket(AF_INET, SOCK_RAW, IPPROTO_RAW);


 
NoRTeN   (2010-04-14 16:38) [4]

Не помогло, тот же результат


 
Сергей М. ©   (2010-04-14 16:50) [5]

Та быть того не могёт)

У индейцев в IdICMPClient "тот", а у тебя "не тот" ?


 
NoRTeN   (2010-04-14 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 );


 
Сергей М. ©   (2010-04-14 17:20) [7]


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


Зачем закомментарил ?
Ведь этой строчкой ты как раз и указываешь, что в случае с IPPROTO_IP IP-заголовок ты формируешь сам и ТCP/IP-стек при этом не обязан заботиться о его формировании


 
NoRTeN   (2010-04-14 17:37) [8]

Я пробовол поразному, никакой варинт не подошол. Строчку оставил, чтобы показать те методы которые опробовал.


 
Сергей М. ©   (2010-04-14 17:48) [9]

Странно это ..

Ну а сто мешает оттрассировать пошагово соотв.код в составе того же IdICMPClient с целью выяснения правильной последовательности с правильными же параметрами вызовов WinsockAPI ?


 
NoRTeN   (2010-04-14 17:59) [10]

Пробовал, но не нашол где заполняеться IP заголовок, помоему в этом компаненьте он также заполняется автоматически.


 
NoRTeN   (2010-04-18 20:33) [11]

Неужели нет никого кто сталкивался с падобной проблемой?



Страницы: 1 вся ветка

Текущий архив: 2014.03.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.005 c
2-1369308195
delphistorm
2013-05-23 15:23
2014.03.16
странная проблема с отображение картинки


2-1369971321
smokeslim
2013-05-31 07:35
2014.03.16
Вопрос по проге


15-1380391129
электроник
2013-09-28 21:58
2014.03.16
ps2 keyboard as usb-hid


2-1369321524
shadow_hawk
2013-05-23 19:05
2014.03.16
DevExpress cxGrid


15-1380519516
Els
2013-09-30 09:38
2014.03.16
Роскомнадзор