Форум: "Сети";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Внизотправка сообщения icmp - reply под Windows XP Найти похожие ветки
← →
zag2art (2006-01-07 16:29) [0]Подскажите пожалуйса.
Пытаюсь отправить несколько сообщений icmp - reply (тип 0) в сеть под Виндовс ХР - не выходит не как. (делаю это при помощи сырых сокетов). меняю тип на 8 - то есть на icmp - реквест все работает... Может винда как-то запрещает мне их отсылать??? С чем вобще это может быть связано???
код прилогаю
TIcmp = packed record
icmp_type: byte; // Type of message
icmp_code: byte; // Type "sub code" (zero for echos)
icmp_cksum: word; // 1"s complement checksum
icmp_id: Word; // Unique ID (the instance handle)
icmp_seq: Word; // Tracks multiple pings
icmp_data: array [0 .. 0] of Char; // The start of optional data
end;
PIcmp = ^TIcmp;
implementation
// контрольная сумма
function cksum(P: Pointer; L: Integer): Word;
var
ck: LongWord;
begin
ck:=0;
while (l>1) do
begin
ck:=ck + PWord(P)^;
inc(Integer(P),2);
dec(l,2);
end;
if l=1 then ck:=ck+PByte(P)^;
ck:=(ck shr 16) + (ck and $ffff);
ck:=ck+(ck shr 16);
result:=not Word(ck);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
raw_sock, icmpsize, i: Integer;
WSAData: TWSAData;
eIcmp: PIcmp;
sockaddr: TSockAddr;
const
optval: integer = 1;
begin
if (WSAStartup($202, WSAData) = 0) then
begin
//сооздаем сырой сокет
raw_sock:=socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
if (raw_sock<>-1) then
begin
// формируем пакет
GetMem(eIcmp,1024);;
eIcmp^.icmp_type:=0; //тип пакета
eIcmp^.icmp_code:=0; //код - всегда ноль для типа реплай
eIcmp^.icmp_cksum:=0;//контрольная сумма вычисляется позднее (по проверенному алгоритму)
eIcmp^.icmp_id:=0012; // идентификаторы пакета могут быть любыми
eIcmp^.icmp_seq:=0010;// см. выше
// данные берутся из эдита1
for i:=0 to length(edit1.Text)-1 do PChar(@eIcmp^.icmp_data)[i]:=edit1.Text[i+1];
icmpsize:=8+length(edit1.text);
eIcmp^.icmp_cksum:=cksum(eIcmp,icmpsize);
sockAddr.sin_family := AF_INET;
sockAddr.sin_addr.S_addr:=inet_addr("192.168.7.12");
icmpsize:=sendto(raw_sock, eIcmp^, icmpsize, 0, @sockaddr, SizeOf(sockaddr));
// здесь возвращает отправленое число байт
// причем говорит что отправил все как надо, хотя ВинДамп говорит, что нет...
memo1.Lines.Add(IntToStr(icmpsize));
end;
end;
end;
← →
Fay © (2006-01-07 16:42) [1]А что в настройках брендмауэра?
← →
isasa © (2006-01-08 12:57) [2]Ну раз ICMP, то что говорит?
ping 192.168.7.12
← →
Fay © (2006-01-08 13:27) [3]2 isasa © (08.01.06 12:57) [2]
ping.exe может иметь персональную индульгенцию 8)
← →
zag2art (2006-01-09 08:50) [4]пинг говорит все ок, да и вооще дело не в том работает ли пинг..
пинг работает по схеме:
1 пингующий комп посылает icmp - реквест
2 комп который пингуют, получая этот реквест, отсылает обратно пакет icmp реплай
мне же нужно отсылать на другой комп именно пакеты icmp РЕПЛАЙ (тип 0)... причем нужно отсылать много и без всяких предварительных рекветсов... Именно для этого и нужны сырые сокеты.
Теперь о том, что и как получается:
Когда я посылаю реквест (для тестирования) - я естественно получаю ответ... (то есть я вижу как мой покет выходит, так сказать, с моего компа и наблюдаю реакцию, то бишь ответ от 192.168.7.12)
Но как только я меняю тип пакета на 0 (реплай), то пакет даже не покидает моего компа... Именно в этом и есть вся загвоздка....
← →
Fay © (2006-01-09 09:17) [5]2 zag2art (09.01.06 8:50) [4]
У меня такое ощущение, что Вам на ксакеп.ру.
З.Ы.
An application must call one WSACleanup call for every successful WSAStartup
← →
zag2art (2006-01-10 15:09) [6]насчет wsacleanup да и closesocket согласен... ну и бог с ними, дело было не в них... оказывается дело то в версии винды... У меня XP SP2, а во втором сервиспаке (да и в 2003) M$ очень урезала сырые сокеты... теперь все исходящие пакеты подверкаются строгой проверке... и то что не нравиться M$ в сеть не выпускается... ;(
Проблема разрешилась при помощи патча на TCPIP.SYS, нашел инфу на рсдн.ру
Но всем все-равно спасибо...
З.Ы.
Fay> а есть какая-нибудь "конкретная" ссылочка на хакере.ру на данную тематику?
← →
Fay © (2006-01-10 15:22) [7]2 zag2art (10.01.06 15:09) [6]
Я хотел сказать, что не знаю других применений сабжа, кроме DoS-атак, а на данном форуме такие потуги обычно не имею поддержки.
← →
Bakset (2006-01-12 22:34) [8]Люди а дайте пожалуйста пример работающего пинга на RAW сокетах все перерыл нету нормальной инфы под дельфи. Нужно использовать в многопоточном приложении. Indy не пашет нифига во много потоков...
← →
Fay © (2006-01-13 14:40) [9]2 Bakset (12.01.06 22:34) [8]
> нету нормальной инфы под дельфи
Под что есть?
> Indy не пашет нифига во много потоков...
В смысле?
← →
Bakset (2006-01-15 11:48) [10]встречал под с++ но так как у меня от него несварение желудка :) то он отпадает... а насчет инди то при создании в каждом потоке нифига не работает... говорит что не пингуется хотя все ок... если же не делать во много потоков а последовательно то все работает. Но последовательно сами понимаете не подходит... даже CriticalSection не помогает, хрень вощем.
вот код:
if DataIpClass.DataNeedPing=true then
begin
CriticalSection.Enter;
IdIcmpClient:=TIdIcmpClient.Create(Application);
IdIcmpClient.Host:=DataIpClass.IPAdress;
IdIcmpClient.ReceiveTimeout:=wait_for_ping_response;
stat:=0;
c:=0;
repeat
IdIcmpClient.Ping;
if IdIcmpClient.ReplyStatus.FromIpAddress=DataIpClass.IPAdress then
stat:=1;
inc(c);
until (stat=1) or (c>=1);
IdIcmpClient.Free;
CriticalSection.Leave;
end
← →
Fay © (2006-01-15 12:04) [11]2 Bakset (12.01.06 22:34) [8]
Не ку?
http://www.ladia.ru/cpp/network/zdrt31.php
← →
Bakset (2006-01-15 14:33) [12]блин опять си... :) ну не люблю я его... :) C# допустим это другое дело...
а на дельфях не у кого нет?
← →
Fay © (2006-01-15 14:36) [13]2 Bakset (15.01.06 14:33) [12]
MSDN Вы тоже в переводе на Delphi читаете?
← →
Bakset (2006-01-15 14:39) [14]не будем здесь устраивать перепалку... понятно что если уж совсем заклин то деватся некуда приходится разбиратся и переводить под дельфи но вопрос то этот стандартный решений полно вот и спрашиваю...
← →
Fay © (2006-01-15 14:42) [15]2 Bakset (15.01.06 14:39) [14]
Может оно Вам и не надо вовсе? Неделя прошла, а у Вас всё ещё "несварение желудка"...
← →
Bakset (2006-01-15 18:49) [16]ну не неделю :) вопрос такой вяло текущий... просто пинг во многих случаях не работает, файрвол, нат и прочие вещи, иногда думаю совсем от него отказатся... но как опция наверно пусть всеже будет...
← →
Bakset (2006-01-17 22:13) [17]Вот код, если кому понадобится... немного подправил проверил все работает... так что тема закрыта.
function Ping(Host:string;TimeOut:longint):boolean;
var
ICMPHeader : Record
i_type : Byte;
i_code : Byte;
i_chksum : Word;
i_id : Longword;
i_seq : Word;
i_timestamp : Longword;
i_data : array[1..5] of byte;
end;
IPHeader : Record
VersionAndLen : Byte; //lower 4 bits = version , higher 4 bits size of header in 32 bits words}
tos : Byte; // Type of service
total_len : Word; // total length of the packet
ident : Word; // unique identifier
frag_and_flags : Word; // flags
ttl : Byte;
proto : Byte; // protocol (TCP, UDP etc)
checksum : Word; // IP checksum
sourceIP : longint;
destIP : longint;
// rest is ICMP protocol
i_type : Byte;
i_code : Byte;
i_chksum : Word;
i_id : Longword;
i_seq : Word;
i_timestamp : Longword;
i_data : array[1..5] of byte;
end;
lwsaData : WSAData;
Sck: TSocket;
DestLen: Integer;
Dest: TSockAddr ;
HostEnt: PHostEnt;
function CheckCRC(var Addr;Size:word):word;
var Ptr:^word;
begin
Result:=0;
Ptr:=@Addr;
while Size > 1 do begin
Result:=Result+Ptr^;
Inc(Longword(Ptr),2);
Dec(Size,2);
end;
if Size > 0 then Result:= Result+Byte(Ptr^);
Result := Result shr 16 + Result and $0FFFF;
Result := Result + Result shr 16;
Result := NOT Word(Result);
end;
begin
Result:=false;
// if not IsWinsockPresent then Exit; // winsock not loaded
// open socket
if WSAStartup($0101,lwsaData)<>0 then
exit;
Sck := Socket(AF_INET,SOCK_RAW,IPPROTO_ICMP);
if Sck = INVALID_SOCKET then
begin
WSACleanup;
Exit;
end;
// wait for socket 1000 ms
if SetSockOpt(Sck,SOL_SOCKET,SO_RCVTIMEO,PAnsiChar(@TimeOut),SizeOf(TimeOut))=SOCKET_ERROR then
begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
// fill up structure
FillChar(ICMPHeader,SizeOf(ICMPHeader),#0);
with ICMPHeader do begin
i_type := 8;
i_code := 0;
i_id := Longword(HInstance);
i_seq := 0;
i_data[1]:=Ord("A");i_data[2]:=Ord("L");i_data[3]:=Ord("O");
i_data[4]:=Ord("H");i_data[5]:=Ord("A");
i_timeStamp:=0; {nelze pouzit ??? }
i_chksum := 0;
i_chksum:=CheckCRC(ICMPHeader,SizeOf(ICMPHEader));
end;
DestLen := SizeOf(Dest);
Dest.sin_family := AF_INET;
Dest.sin_port := htons(7);
// recognition - address in 192.168.1.47 or computername format
Dest.sin_addr.s_addr := Inet_Addr(PChar(Host));
if Dest.sin_addr.s_addr = SOCKET_ERROR then begin
HostEnt := GetHostByName(PChar(Host));
if HostEnt <> nil then
begin
Dest.sin_addr.S_un_b.s_b1 := HostEnt^.h_addr_list^[0];
Dest.sin_addr.S_un_b.s_b2 := HostEnt^.h_addr_list^[1];
Dest.sin_addr.S_un_b.s_b3 := HostEnt^.h_addr_list^[2];
Dest.sin_addr.S_un_b.s_b4 := HostEnt^.h_addr_list^[3];
end
else
begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
end;
if SendTo(Sck,ICMPHeader,SizeOf(ICMPHeader),0,Dest,SizeOf(Dest))=SOCKET_ERROR then
begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
if RecvFrom(Sck,IPHeader,SizeOf(IPHeader),0,Dest,DestLen)=SOCKET_ERROR then
begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
if IPHeader.i_type <> 0 then
begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
if IPHeader.i_id <> Longword(HInstance) then begin
CloseSocket(Sck);
WSACleanup;
Exit;
end;
CloseSocket(Sck);
WSACleanup;
Result := true;
end;
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c