RE:и снова RAW SOCKETS

From
Kirill Neznamov (2:5025/32.88)
To
Gennady Porev
Date
2002-11-07T14:32:03Z
Area
SU.WINDOWS.NT.PROG
Am 02 Nov 02  19:56:00 schrieb Gennady Porev an All  zum Thema 
<Ё б-Rў  RAW SOCKETS>

GP> Тут я недавно спрашивал по поводу отправки raw TCP-пакетов. Один товарищ 
GP> посоветовал сходить на www.sources.ru и там действительно есть вот что: 
GP> http://www.sources.ru/cpp/cpp_raw_tcp_200.shtml
GP> именно про то, как отправлять сырые TCP-пакеты.

Читай лучше msdn в разделе windows sockets 2 -> windows sockets 2 protocol-specific-annex - > TCP/IP.

GP> Я всё сделал так как там, но опять-таки не ясен вопрос с IP_HDRINCL. 

Ты на какой системе делаешь? IP_HDRINCL проходит только на 2000/XP.
А вот тебе кусок реально работающего кода:

       int WSAerr;
       int on=1;
       sock=WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL, 0,0);
       WSAerr=setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&on, 4);
        if(!WSAerr)
          {
           printf("\nIP_HDRINCL not supported :(");
           ExitProcess(0);
          }

Смотрим теперь твой код:

GP>=== Cut ===
GP>{$APPTYPE CONSOLE}
GP>program RAWS;
GP>uses  WinSock;
GP>const IP_HDRINCL = $02;
GP>var TCPIPPacket : array [0..$2F] of byte =
GP>($45, $00, $00, $30, $12, $34, $40, $00, $7F, $06, $EA, $E8, $C3, $05, $19, GP>$62,
GP> $42, $36, $E0, $0D, $34, $21, $00, $99, $87, $65, $43, $21, $00, $00, $00, GP>$00,
GP> $70, $02, $20, $00, $65, $33, $00, $00, $02, $04, $05, $B4, $01, $01, $04, GP>$02);

Здесь как я понял tcp заголовка нет. Так что уже не правильно.
Если ты окрываешь raw сокет с IPPROTO_IP то ты должен сделать ip заголовок вложить в него tcp заголовок с данными. 

GP> WD : WSAData;
GP> S : TSocket;
GP> i : byte;
GP> Addr : sockaddr_in;
GP> r : Integer;
GP>begin
GP> WSAStartUp(02,WD);
GP> S:=Socket(AF_INET,SOCK_RAW,IPPROTO_IP);
GP> i:=1;
GP> SetSockOpt(S,IPPROTO_IP,IP_HDRINCL,@i,SizeOf(i));

 А вот и ошибка.                          ^^^^^^^^^ 
 sizeof(i) у тебя будет = 1 так как i у тебя байт.
 в msdn сказано что IP_HDRINCL это BOOL.Поэтому:
 SetSockOpt(S,IPPROTO_IP,IP_HDRINCL,@i,4);

GP> Addr.sin_family:=AF_INET;
GP> Addr.sin_port:=0;

 Порт то почему == 0? Ты на какой порт tcp пакет шлешь? 
 Чую тебе надо разобраться с семейством протоколов tcp/ip.

GP> Addr.sin_addr.S_addr:=inet_addr('66.54.224.13'); // { 42 36 E0 0D } - see GP>above
GP> r:=sendto(S,TCPIPPacket,$30,0,Addr,SizeOf(sockaddr_in));
GP> Writeln(r);
GP> Writeln(WSAGetLastError);
GP> CloseSocket(S);
GP> WSACleanUp;
GP>end.
GP>=== Cut ===

GP>Люди! Я понимаю, что легче всего послать в инет или в лес. Но ведь среди вас
GP>точно есть те, кто это уже делал. Не дайте засохнуть!

GP>PS: Win2k, ессно.

Пока ты сам не научишься проверять коды ошибок у виндовых api функций тебе будет
сложно писать проги.


WBR,
    KiR
--- F.I.P.S./32 v1.0r W95/NT [M]
 * Origin: Придумай его сам. (2:5025/32.88)