Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.05.23;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.086 c
7-1081883007
Mozzzila
2004-04-13 23:03
2004.05.23
Слежение за обращением к реестру


1-1083872000
Lena19
2004-05-06 23:33
2004.05.23
размер буквы


1-1083865549
MAXHO-1
2004-05-06 21:45
2004.05.23
Как можно сделать следующее:


14-1083217242
han_malign
2004-04-29 09:40
2004.05.23
WebFile.ru - открылся прикольный сервис...


3-1083253108
Mister
2004-04-29 19:38
2004.05.23
обработка False