Есть прога WPE PRO. Помимо того что это прикольный сниффер, он умеет отсылать пакеты от лица другого приложения с возможеостью отредактировать сам пакет. Вот эта возможность меня сильно заинтересовала. Возможно ли подобное совершить на Delphi? Наставьте на путь истинный, желательно с примерами.
Кхмм... Кхмм... Значится так начнем сначала. Что из себя представляет TCP пакет. Грубо говоря это массив байтов. Люди так между собой договорились что по определеному смещению в этом масиве они кладут так называемую служебную информацию в которою входит и адрес отправителя и получателя (если не ошибаюсь то в самом начале подробнее о формате TCP пакета см гугл). Когда ты открываешь сокет и посылаешь по этому сокету какую либо информацию, формирование служебной инфорации берет на себя библиотека (через сколько именно библиотек это проходит в дельфи не знаю). Для того что бы самому сформировать всю служебную информацию (в том числе адрес отправителя и получателя) необходимо воспользоватся так называемыми сырыми сокетами. Подробно это было в статье Криса Касперски "Игра на сырых сокетах". Вот собсно и все. Извиняюсь за то что так длинно просто хочу помочь понять суть проблемы.
Function StrToBuf(Str:String):String; var i:integer; str1: String; begin Result := ''; Str1 := ''; for I := 1 to Length(Str) do begin if Str = ' ' then begin Result := Result + Chr(StrToInt('$'+Str1)); Str1:=''; end Else Str1 := Str1 + Str; end; end; procedure TForm1.Button3Click(Sender: TObject); var vwsadata : twsadata; vsocket : tsocket; vsockaddr : tsockaddr; buf : string; str,str2: string; I : Integer; begin flag:=1; if wsastartup($101,vwsadata)<>0 then halt(1); vsocket := socket(AF_INET, SOCK_RAW, IPPROTO_IP); if vsocket = invalid_socket then halt(1); fillchar(vsockaddr,sizeof(tsockaddr),0); vsockaddr.sin_family := af_inet; vsockaddr.sin_addr.s_addr := Inet_Addr('192.168.0.15'); vsockaddr.sin_port:=HtoNS(3801); if connect(vsocket,vsockaddr,sizeof(tsockaddr)) = socket_error then halt(1); str2 := '3A 29 00 00 08 00 01 08 27 03 00 6A 21 04 00 '; Str := StrToBuf(str2); for I := 1 to Length(str) do Buffer := Str; send(vsocket,Buffer,length(Buffer),0); closesocket(vsocket); wsacleanup; end; вот тут я пытаюсь передать набор данных, с помощью сниффера узнаю что передаются совершенно другие данные. Почему?