Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Вниз

Винсоки. Формирование пакетов   Найти похожие ветки 

 
Energizer ©   (2004-03-27 08:50) [0]

Есть идея написать собственный спуфер. Проблема в том, что на делфях (в сях гораздо проще, но хотелось бы лишний раз убедиться, что они не лучше). Корочь,  вопрос: каким образом можно отправлять ip-пакеты полностью составленные программно (в т.ч. заголовки)? Асмовская лирика принимается.


 
Verg ©   (2004-03-27 12:27) [1]

1. "Есть идея написать собственный спуфер"
- зачем тебе это? Может задачу можно и без спуфера решить.

2. "Проблема в том, что на делфях (в сях гораздо проще, но хотелось бы лишний раз убедиться, что они не лучше). "
- Ты уже пробовал и в "Сях" и в дельфях это делать, раз сравниваешь? Так в чем собственно-то проблема?

3. "Корочь,  вопрос: каким образом можно отправлять ip-пакеты полностью составленные программно (в т.ч. заголовки)?"
-
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winsock/winsock/tcp_ip_raw_sockets_2.asp


 
atruhin ©   (2004-03-31 08:28) [2]

"в сях гораздо проще"
найди хоть одно отличие кроме синтаксиса. А :)


 
Rezya ©   (2004-03-31 16:36) [3]

Приведу код который я как-то откопал здесь. Посмотриего и делай по аналогии.

//******************************************************************** **********\
//  Simple ping utility using SOCK_RAW
//******************************************************************** **********/
program Ping;
{$APPTYPE CONSOLE}
uses
windows, winsock2;
const
      ICMP_ECHO       = 8;
      ICMP_ECHOREPLY  = 0;
      ICMP_MIN        = 8; // minimum 8 byte icmp packet (just header)
      STATUS_FAILED   = $FFFF;
      DEF_PACKET_SIZE = 32;
      MAX_PACKET      = 1024;

type

//  IP header
PIpHeader=^TIpHeader;
TIpHeader = packed record
       VerLen         : byte;
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       : DWORD;
destIP         : DWORD;
end;

// ICMP header
PIcmpHeader=^TIcmpHeader;
TIcmpHeader = packed record
   i_type    : byte;
   i_code    : byte;   // 0 * type sub code */
   i_cksum   : word;  //0
   i_id      : word;
   i_seq     : word;
// This is not the std header, but we reserve space for time
   timestamp : DWORD;
end;

var
  wsaData        : TWSADATA;
  Dest, From     : TSockAddrIn;
  Timeout        : integer;
  FromLen        : integer = SizeOf(From);
  Dest_Ip   : pointer  = nil;
  ICMP_Data : pointer  = nil;
  RecvBuf   : pointer  = nil;
  hp        : PHostEnt = nil;
  Addr   : DWORD  = 0;
  Seq_No : Word = 0;
  sockRaw : TSOCKET;
  BRead, Bwrote ,DataSize : integer;
  error:integer;

procedure fill_icmp_data(icmp_data:pchar; datasize:integer);
var
IcmpHeader:PIcmpHeader;
datapart:pointer;
begin
IcmpHeader := PIcmpHeader(icmp_data);
IcmpHeader^.i_type := ICMP_ECHO;
IcmpHeader^.i_code := 0;
IcmpHeader^.i_id := word(GetCurrentProcessId());
IcmpHeader^.i_cksum := 0;
IcmpHeader^.i_seq := 0;

datapart := icmp_data + sizeof(TIcmpHeader);
FillMemory(datapart, datasize - sizeof(TIcmpHeader),ord("W"));
end;

function  checksum( buffer:pword; size: integer):word;
var
  cksum : DWORD;
begin
cksum:=0;
while( size > 1 ) do
begin
cksum:=cksum + buffer^;
      buffer:=pword(integer(buffer) + sizeof(word));
size :=size-sizeof(word);
end;
if(size<>0 ) then
cksum := cksum + buffer^;
cksum := (cksum shr 16) + (cksum and $ffff);
result:= word(not(cksum + (cksum shr 16)));
end;
procedure decode_resp(buf:pchar;bytes:integer ;var from:TSockAddrIn);
var
IpHeader:PIpHeader;
IcmpHeader:PIcmpHeader;
iphdrlen:word;
begin
IpHeader := PIpHeader(buf);
iphdrlen := (IpHeader^.VerLen and $0F ) * 4 ; // number of 32-bit words *4 = bytes
if (bytes  < iphdrlen + ICMP_MIN) then
      begin
      writeln("Too few bytes from ",inet_ntoa(from.sin_addr));
end;

IcmpHeader := PIcmpHeader(integer(buf) + iphdrlen);

if (IcmpHeader^.i_type <> ICMP_ECHOREPLY) then
      begin
    writeln("non-echo type %d recvd",IcmpHeader^.i_type);
           exit;
end;
if IcmpHeader^.i_id <> word(GetCurrentProcessId()) then
      begin
      writeln("someone else""s packet!");
         exit;
end;
write(Bytes," bytes from ", inet_ntoa(From.sin_addr));
write(" icmp_seq = ",IcmpHeader^.i_seq);
writeln(" time: ",GetTickCount()-IcmpHeader^.timestamp," ms ");
end;
begin
TimeOut:=1000;
   if (WSAStartup($202,wsaData) <> 0)then
    begin
         writeln("WSAStartup failed: ",GetLastError());
  ExitProcess(STATUS_FAILED);
    end;
   SockRaw := WSASocket(AF_INET, SOCK_RAW,IPPROTO_ICMP, NIL, 0,WSA_FLAG_OVERLAPPED);
   if (sockRaw = INVALID_SOCKET) then
   begin
         writeln("WSASocket() failed: ",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
   end;
   Bread :=  setsockopt(SockRaw,SOL_SOCKET,SO_RCVTIMEO,pchar(@Timeout),sizeof(Timeo ut));
   if(Bread <> 0) then
   begin
        writeln("failed to set recv timeout: ",WSAGetLastError());
  ExitProcess(STATUS_FAILED);
   end;
   Bread :=  setsockopt(SockRaw,SOL_SOCKET,SO_SNDTIMEO,pchar(@Timeout),sizeof(Timeo ut));
   if(Bread <> 0) then
   begin
        writeln("failed to set send timeout: ",WSAGetLastError());
 ExitProcess(STATUS_FAILED);
   end;
   ZeroMemory(@Dest,sizeof(Dest));
   hp := gethostbyname(PChar(ParamStr(1)));
   Error := GetLastError();
   if (Error <> 0) then
   begin
      writeln("Error in call to gethostbyname().Error code: ",Error);
   end;
   if (hp = nil ) then Addr := inet_addr(PChar(ParamStr(1)));
   if ((hp = nil) and (Addr = INADDR_NONE) ) then
   begin
        writeln("Unable to resolve ",ParamStr(1));
 ExitProcess(STATUS_FAILED);
   end;
  if (hp <> NIL) then Dest.sin_addr := PInAddr(hp^.h_addr_list^)^
      else  Dest.sin_addr.s_addr := Addr;
  if (hp <> NIL) then Dest.sin_family := hp^.h_addrtype
      else Dest.sin_family := AF_INET;
  Dest_ip := inet_ntoa(dest.sin_addr);

  writeln("Pinging " +  hp^.h_name+" ["+ inet_ntoa(dest.sin_addr)+"] ");

 datasize := DEF_PACKET_SIZE;

 datasize := datasize+sizeof(TIcmpHeader);

 GetMem( Icmp_Data, MAX_PACKET);
 GetMem(RecvBuf,MAX_PACKET);
 if (Icmp_Data = nil) or (RecvBuf = nil) then
 begin
writeln("GetMem failed");
ExitProcess(STATUS_FAILED);
 end;

ZeroMemory(icmp_data,MAX_PACKET);
ZeroMemory(recvbuf,MAX_PACKET);

fill_icmp_data(Icmp_Data,DataSize);

  while(True) do
  begin

PIcmpHeader(Icmp_Data)^.i_cksum := 0;
PIcmpHeader(Icmp_Data)^.timestamp := GetTickCount();
PIcmpHeader(Icmp_Data)^.i_seq := Seq_no;
      inc(Seq_no);
PIcmpHeader(Icmp_Data)^.i_cksum := checksum(Icmp_Data,DataSize);

Bwrote := sendto(SockRaw,Icmp_Data^,DataSize,0,Dest, sizeof(Dest));
if (Bwrote = SOCKET_ERROR)then
      begin
 if (WSAGetLastError() = WSAETIMEDOUT) then
           begin
      writeln("timed out");
continue;
        end;
 writeln("sendto failed: ",WSAGetLastError());
 ExitProcess(STATUS_FAILED);
end;
if (Bwrote < DataSize ) then
      begin
 writeln("Wrote ",Bwrote, " bytes");
end;
Bread :=  recvfrom(SockRaw,RecvBuf^,MAX_PACKET,0,TSOCKADDRIN(From),FromLen);
if (Bread = SOCKET_ERROR)then
      begin
 if (WSAGetLastError() = WSAETIMEDOUT) then
      begin
  writeln("timed out");
continue;
      end;
 writeln("recvfrom failed: ",WSAGetLastError());
 ExitProcess(STATUS_FAILED);
end;
decode_resp(RecvBuf,Bread,From);
sleep(3000);
end;

WSACleanUp;
FreeMem(RecvBuf);
FreeMem(ICMP_Data);
end.



 
Rezya ©   (2004-03-31 16:43) [4]

Да и ещё как напашишь поделись кодом. (rezyaboss@mail.ru)


 
Verg ©   (2004-03-31 22:38) [5]


> Rezya ©   (31.03.04 16:43) [4]


Как же ты умеешь нести полный бред с очень умным видом...

Приведу тоже код, который я откопал когда-то где-то:

program spuff;

uses Windows;
begin
 Beep(1000, 100);
 sleep(200);
 Beep(400, 50);
 sleep(3000);
end.


Может и не в тему, но главное ведь - привести код. Пусть и не свой, пусть и где-то когда-то откопанный.

Посмотри его иделай поаналогии.

Не знаю спуфинг ли это или ping, но тоже не работает. Тоже иногда единицу возвращает.

Ладно, закроем тему. У меня все заработало (наверно винды глючные).

Да и ещё как ping напишешь поделись кодом (кунцкамеру надо пополнять). verg@mail.ru


 
VMcL ©   (2004-04-01 00:37) [6]

>>Verg ©  (31.03.04 22:38) [5]

lol :)


 
Rezya ©   (2004-04-01 02:12) [7]

Неее, теперь пошли наезды по полной..... :-[[[[[[
Я может и плохо разбирался в той теме которой я всех достал, ладно стерплю... но формирование в ручную и отправлении пакетов, я "собаку съел". И сам написал спуфер как  на ICMP пакеты так и на Tcp и  Udp так что не надо умничать по этому поводу....
И начинал  разбираться именно с этого кода.
Так что вместо того чтобы тут "Понты кидать" (Извини за грубость)лучше человеку помог бы.
И по поводу того что это программа ping-а, я прекрасно знаю..
Но а если ты напишешь свои структуры как на tcp так и на Udp и на IP то получешь тоже самое.
Так что харош тут умничать и лучше людям помогай.!!!!!!!!!!!!!!


 
Rezya ©   (2004-04-01 02:20) [8]

Да....
И ещё....
По поводу

> Да и ещё как напашишь поделись кодом.

Мне просто интересно как он смог реализовать эту задачу.


 
Verg ©   (2004-04-01 06:40) [9]


> Rezya ©   (01.04.04 02:12) [7]


Вместо того, чтобы топать ногами, лучше вдумайся - что в этой ветке происходит.
Некоему Энерджайзеру понадобилось отправлять IP-пакеты, прописывая в качестве адреса отправителя какой-нибудь левый адрес (прятаться хочет). Т.е. ему надо самому формировать всю датаграмму, включая IP-заголовок.
Ping и ICMP вообще, здесь - как корове седло.
Если уж пинговать, то пиговать - в разделе "Статьи" здесь была статья на эту тему - почитай, полезно будет.
К спуфингу это не имеет ровно никакого отношения.
Зачем автору понадобилось - это делать? Не знаю.
Сам как думаешь, цели его благородны? ;)))

Теперь насчет WinPCAP
Вот, поройся здесь:

http://www.mail-archive.com/winpcap-users@winpcap.polito.it/msg01582.html

http://www.misalpina.com/ghost3k/

А там посмотрим что из этого выйдет.


 
Verg ©   (2004-04-01 06:50) [10]


> И сам написал спуфер как  на ICMP пакеты так и на Tcp и
> Udp так что не надо умничать по этому поводу....


:)))


 
Rezya ©   (2004-04-01 16:37) [11]

Теперь посмотри код внимательнее и ты увидешь структуру TIpHeader. (Формируем IP заголовок).
Теперь если хочешь отослать TCP пакет то читаешь RFC про TCP и
прописываешь структуры соответствующую этому протоколу затем склеиваешь эти две структуры и отсылаешь.
В чем проблема.
P.S. За ссылку огромное Спасибо.


 
Verg ©   (2004-04-01 17:05) [12]


> (Формируем IP заголовок).


Где?
Конкретно, где там идет формирование IP заголовка перед отправкой?


 
BiN ©   (2004-04-01 17:14) [13]

более того если из проекта убрать объявление TIpHeader, то ничего не измениться :).

А слюной ведь так и брызжет-то...


 
Rezya ©   (2004-04-01 18:53) [14]

Удалено модератором
Примечание: Оффтоп...


 
BiN ©   (2004-04-01 20:38) [15]

Удалено модератором
Примечание: Оффтоп...



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

Форум: "Сети";
Текущий архив: 2004.05.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.062 c
6-1081166378
Makhanev A.S.
2004-04-05 15:59
2004.05.23
Sockets: ESysError, code=5; AV...


6-1081284805
Rander
2004-04-07 00:53
2004.05.23
Http Encode


11-1072250148
PVOzerski
2003-12-24 10:15
2004.05.23
Новости от FPC Team


11-1072174683
zeddy
2003-12-23 13:18
2004.05.23
Link MASM coff .obj files


1-1084343258
MakNik
2004-05-12 10:27
2004.05.23
FloatToStr(Sums)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский