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)