Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Захват исходящего трафика [D7, WinXP]


Страницы:   1 2

-=Andrey=- ©   (2004-04-02 20:42:00) 

Здраствуйте Мастера. Необходимо перехватывать данные которые выходят с моего компьютера. В частности данные IE. Я посмотрел здесь достаточно много веток на эту тему, но ничего конкретного не нашел, кроме как сылок на библиотеку WinPCap.
Я нашел описание команд этой библиотеки но, я так понял что эта библиотека в основном расчитана на перехват входящих данных.
Пожалуйста подскажите как можно реализовать эту задачу на сетевом уровне, и желательно как на WinSock-етах так и
Raw_Sock-етах.
Заранее благодарен.


Alex Konshin   (2004-04-04 13:21:00) [1]

Как идею могу предложить использовать debug версию ws2_32.dll. Помню, что в документации по Winsock 2 описывалось, как с ней работать. Сам никогда не пробовал, так что вы уж как-нибудь сами разбирайтесь. :)


Verg   (2004-04-04 12:29:00) [2]


> Alex Konshin ©   (04.04.04 09:34) [21]


Точно так же и SOCK_RAW

Если посмотришь на

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/network/hh/network/301int_78mf.asp

то NPF от WinPcap расположен там же, где "Other Protocols"

На этом же уровне или даже выше распологаются все IP сокеты, включая SOCK_RAW.
Принимаемые пакеты как бы проходят снизу вверх через эти уровни, а передаваемые - сверху вниз. И никак не "в стороны"!
То, что сетевые карты в promisc режиме принимаю все пакеты, включая и те, которые сами же передают - это чисто аппаратная фишка конкретной аппаратуры этих сетевых девайсов.

Полный контрль над трафиком могут осуществлять только Intermediate Driver-ры, через которые и проходит весь сетевой трафик в обоих направлениях. Именно с помощью их и реализуются FireWall.


Rezya   (2004-04-04 11:35:00) [3]

Народ Одна просьба, ну скажите вы мне, чем надо воспользоваться что бы с модемом все работало. А то надоело спорить.


Alex Konshin   (2004-04-04 09:34:00) [4]

WinPCap драйвер работает с драйверами NDIS, т.е. с сетевыми картами, с модемам он и не должен работать. Но это IMHO.
Вот с SOCK_RAW может и будет, не знаю.


Rezya   (2004-04-04 02:47:00) [5]

Не понял про боранов но строку покажу но без своего IP-Адреса.
Verg.exe (Ip-Адрес который мне выставляет провайдер).
К примеру: Verg.exe xxx.xxx.xxx.xxx +Enter :-)


Rouse_   (2004-04-04 01:46:00) [6]

Тэкс... вернемся к нашим баранам:
покажи как вызываешь данный Verg-ом код...


Rezya   (2004-04-04 01:33:00) [7]


> Блин - тебе что сказали - ты IP укажи, у тебя он что у момеда
> такой же как и у сетевухи?


У меня нет сетевухи!!!!


> Значит тебе, с твоими модемами, ничего не светит ни с SOCK_RAW
> ни с WinPCAP


А почему с WinPCAP мне ничего не светит????


Verg   (2004-04-03 23:03:00) [8]


> Rezya ©   (03.04.04 20:01) [15]
> Код Verga-а проверен как на XP так и на Win2k-Pro.
> На модеме Rockwell 56000 External Перехват исходящего трафика
> не работает.


Значит тебе, с твоими модемами, ничего не светит ни с SOCK_RAW ни с WinPCAP.

Ищи intermediate драйвер от какого-нибудь firewall-а. На делфи их не пишут, так что....


Rouse_   (2004-04-03 21:13:00) [9]

Блин - тебе что сказали - ты IP укажи, у тебя он что у момеда такой же как и у сетевухи?


Rezya   (2004-04-03 20:01:00) [10]

Код Verga-а проверен как на XP так и на Win2k-Pro.
На модеме Rockwell 56000 External Перехват исходящего трафика не работает.


Verg   (2004-04-03 16:35:00) [11]


> -=Andrey=-   (03.04.04 15:41) [13]


А как вообще используют компоненты? Берут и используют.
Смотрят исходник, пробуют, приспосабливат под "свои цели".
Прочитать про нее и спросить можно у авторов этой компоненты - ты им такой вопрос задай.

Вот, собственно - подсказал :)


-=Andrey=-   (2004-04-03 15:41:00) [12]


> В тех ссылках я наткнулся на компоненту Snoop2 которая использует
> WinpCap. А можно её использовать в моих целях?
> И если можно то как? :-)
> И где можно почитать про эту компоненту?


А с этим не подскажите?


Verg   (2004-04-03 13:41:00) [13]

Работает, перехватывает IP трафик любого класса (исходящий включительно)

Win2K-Pro SP4 сетевай карта Ethernet 10/100


Verg   (2004-04-03 13:38:00) [14]

program Console;
{$APPTYPE CONSOLE}
uses
 Windows,
 SysUtils,
 WinSock2,
 mstcpip;
const
 IP_MAXPACKET = 65535;
type
   PIPHeader = ^TIPHeader;
   TIPHeader = packed record
     verlen : byte;      // âåðñèÿ è äëèíà çàãîëîâêà
     tos    : byte;      // òèï ñåðâèñà
     length : word;      // äëèíà âñåãî ïàêåòà
     id     : word;      // Id
     offset : word;      // ôëàãè è ñìåùåíèÿ
     ttl    : byte;      // âðåìÿ æèçíè
     protocol : byte;    // ïðîòîêîë
     xsum   : word;      // êîíòðîëüíàÿ ñóììà
     src    : TInAddr;   // IP-àäðåñ îòïðàâèòåëÿ
     dst    : TInAddr;   // IP-àäðåñ íàçíà÷åíèÿ
   end;
var
 WSAData : TWSAData;
 Sa : TSockAddrIn;
 Rcvd : integer;
 RS   : TSocket;
 flag : DWORD;
 Buffer : array[0..IP_MAXPACKET] of byte;
 Iph : PIpHeader;
 Info : String;
 Src, Dst : string;

function CtrlHandler(dwCtrlType : DWORD):BOOL; stdcall;
var S : TSocket;
begin
 if RSINVALID_SOCKET then
 begin
   S:= RS;
   RS := INVALID_SOCKET;
   CloseSocket(S);
 end;
end;

function ToOem(const S : string):string;
begin
 Result := S;
 if Result'' then
   CharToOemBuff(pchar(Result), pchar(Result), length(Result));
end;

procedure PrintErr(Err : DWORD; Wt : boolean);
begin
 Writeln(ToOem(SysErrorMessage(Err)));
 if Wt then ReadLn;
end;

procedure ExitErr;
begin
 if WSAGetLastErrorNO_ERROR then
   PrintErr(WSAGetLastError, true);
 if Rs INVALID_SOCKET then
   CloseSocket(RS);
 if WSAData.wVersion 0 then
   WSACleanup;
 halt(0);
end;

function checksocket(Ret : integer):integer;
begin
 Result := Ret;
 if Result = SOCKET_ERROR then
    ExitErr;
end;

function ProtoString(Proto:byte):string;
begin
 result:='';
 case proto of
   IPPROTO_ICMP   : result:='ICMP';
   IPPROTO_TCP    : result:='TCP';
   IPPROTO_UDP    : result:='UDP';
   else
    result := 'other';
 end;
end;

begin
 RS := INVALID_SOCKET;
 if ParamCount 1 then
 begin
   Writeln('Usage: '+ExtractFileName(ParamStr(0))+' ');
   Readln;
   Exit;
 end;
 if WSAStartup(MAKEWORD(2, 2), WSAData) NO_ERROR then
    ExitErr;
 try
   RS := socket(PF_INET, SOCK_RAW, IPPROTO_IP);
   if RS = INVALID_SOCKET then
     ExitErr;
   try
     ZeroMemory( @sa, sizeof(sa) );
     sa.sin_family := AF_INET;
     Dst := ParamStr(1);
     sa.sin_addr.S_addr := inet_addr(pchar(Dst));
     if bind(RS, @sa, sizeof(sa)) = SOCKET_ERROR then
       ExitErr;
     flag:= 1;
     if ioctlsocket(RS, SIO_RCVALL , flag) = SOCKET_ERROR then
       ExitErr;
     writeln('Rcv-len'#9'IP-len'#9'HDR-len'#9'From'#9#9'To'#9#9'Class'#9'Proto');
     SetconsoleCtrlHandler(@CtrlHandler, LongBool(TRUE));
     repeat
       Rcvd := checksocket( recv(RS, Buffer, sizeof(Buffer), 0) );
       if Rcvd = 0 then continue;
       Iph := @Buffer;
       if (Iph^.verlen shr 4) = 4 then
       begin
         Info := '';
         if Iph^.src.S_addr = Sa.sin_addr.S_addr then
           Info := Info + 'O';
         if    (Iph^.dst.S_addr Sa.sin_addr.S_addr)
           and (Iph^.src.S_addr Sa.sin_addr.S_addr) then
           Info := Info + 'G';
         if Iph^.dst.S_addr = htonl( INADDR_BROADCAST ) then
           Info := Info +'Bn';
         Src := inet_ntoa(Iph^.src);
         Dst := inet_ntoa(Iph^.dst);
         Writeln(
            Rcvd, #9,
            ntohs( Iph^.length ),#9,
            (Iph^.verlen and $F) shl 2, #9,
            Src,#9,
            Dst,#9,
            Tooem(Info), #9,
            ProtoString(Iph^.protocol)
         );
       end;
     until Rcvd = 0;
   finally
     closesocket(RS);
   end;
 finally
   WSACleanup;
 end;
end.


Verg   (2004-04-03 13:37:00) [15]

Ага, значит опять не работает.
Давайте испытаем.  Позапускайте Дельфовый аналог

http://epg2000.narod.ru/sniff_2k_xp.shtml.htm

Единственное, что для нее в параметрах нужно прямо указать IP адрес сетвевой карточки, которую будем слушать.

С результатами испытаний укажите
Операционку+сервис.пак.+вид сетвеого адаптера (модем, карта или еще что)


Rouse_   (2004-04-03 11:37:00) [16]

http://epg2000.narod.ru/sniff_2k_xp.shtml.htm


-=Andrey=-   (2004-04-03 02:37:00) [17]

В тех ссылках я наткнулся на компоненту Snoop2 которая использует WinpCap. А можно её использовать в моих целях?
И если можно то как? :-)
И где можно почитать про эту компоненту?
Заранее благодарен Всем.


Rezya   (2004-04-03 02:31:00) [18]

По поводу:

> Во всяком случае на W2K, в режиме SIO_RCVALL перехватывает
> любой IP трафик с сетвой(ых) карты - входящий, исходящий,
> свой, чужой.
> По сети ходит информация о проблемах перехвата именно исходящего
> трафика и только на системах XP. Раз ты изучал разговоры
> здесь об этом, то это должно быть тебе известно


Потратил 1 час. Специально поставил Win2k. Да бы проверить работу SIO_RCVALL. И опять у меня ничего не вышло. Приведу код может в нем ошибка.

procedure WWW.Execute;
var
verr:integer;
begin
{----Вычисление IP-адреса}

WSAStartup(MAKEWORD(2,2), SAData);
GetHostName(name, $FF);
p := GetHostByName(Name);
while (p.h_addr_list^ <> nil) do
begin
  Synchronize(Message1);
  ApAddres:=inet_ntoa(PInAddr(p.h_addr_list^)^);
  Inc(p.h_addr_list);
end;
{------------------------------------}

Sock:=Socket(Af_Inet,SOCK_RAW,IPPROTO_IP);
If Sock=Invalid_Socket then Synchronize(error1);

Addr.sin_family :=AF_INET;
Addr.sin_addr.s_addr :=inet_addr(PChar(ApAddres));

if bind(Sock, Addr, SizeOf(Addr)) <> 0 then Synchronize(error2);

IOCTLFlag:=1;
if ioctlsocket(Sock, SIO_RCVALL,IOCTLFlag)<>0 then Synchronize(error3);

repeat
begin
res:=recv(Sock, Buffer, SizeOf(Buffer), 0);
if res >= SizeOf(IPHeader) then
begin
Version:=inttostr((IPHeader((@Buffer)^).VerLen AND $F0) shr 4);
IPHdrLen :=IPHeader((@Buffer)^).VerLen AND $0F;
StTl:=Inttostr(IPHeader((@Buffer)^).TTL);
SIPHdrLen:=Inttostr(Res);
//Synchronize(Message7);
//Synchronize(Message9);
if IPHdrLen >= 5 then
begin
{Адреса}
{----------------------------}
SrcIP :=IPHeader((@Buffer)^).IPSrc;
SIpSrt:=inet_ntoa(TInAddr(SrcIP));
//Synchronize(Message5);

DstIP :=IPHeader((@Buffer)^).IPDst;
SIpDst:=inet_ntoa(TInAddr(DstIP));
//Synchronize(Message6);
{Протоколы}
case IPHeader((@Buffer)^).Proto of
IPPROTO_ICMP: begin Protokol:='ICMP'; Synchronize(Message2); FICMP;   end;
IPPROTO_IGMP: begin Protokol:='IGMP'; Synchronize(Message2); FIGMP;   end;
IPPROTO_GGP: begin Protokol:='GGP' ; Synchronize(Message2); FGGP; end;
IPPROTO_TCP: begin Protokol:='TCP'; Synchronize(Message2); FTCP;  end;
IPPROTO_PUP: begin Protokol:='PUP'; Synchronize(Message2); FPUP;  end;
IPPROTO_UDP: begin Protokol:='UDP'; Synchronize(Message2); FUDP;  end;
IPPROTO_IDP: begin Protokol:='IDP'; Synchronize(Message2); FIDP;  end;
IPPROTO_ND: begin  Protokol:='ND'; Synchronize(Message2); FND;   end;
end;

end;
end;
//Synchronize(Message4);
end;

{----------------------------}
//Synchronize(Message2);

until flag=1;
Synchronize(Message3);
WSACleanup;
end;

end.


Verg   (2004-04-02 22:30:00) [19]

Я имел ввиду "просмотр многих веток".


Verg   (2004-04-02 22:30:00) [20]


> А можно маленький кусочек кода с использованием NDIS_PACKET_TYPE_PROMISCUOUS.


Так примерчики есть прямо в тех ссылках, которые я приводил, там даже есть пример класса - снифер, называется class Zniffer.
Может все же "повторить"? -


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо