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

Вниз

Захват исходящего трафика   Найти похожие ветки 

 
-=Andrey=-   (2004-04-02 20:42) [0]

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


 
Verg ©   (2004-04-02 21:30) [1]

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

У WinPCap-а есть тоже несколько режимов аппаратной фильрации, в числе которых имеется и NDIS_PACKET_TYPE_PROMISCUOUS , при котором он тоже принимает абсолютно все, входящее, исходящее, свое и чужое и не только IP протоколы сетевой карты, но вообще все, в сыром виде, короче просто Все.

Так же он работает и на XP системах? - это тебе и карты в руки: попробуй, проверь - он тебе больше нужно, на сколько я понимаю :))


 
Rouse_ ©   (2004-04-02 21:51) [2]

>  В частности данные IE.
ИМХО можно обойтись простым прокси :)


 
-=Andrey=-   (2004-04-02 22:19) [3]


> У WinPCap-а есть тоже несколько режимов аппаратной фильрации,
> в числе которых имеется и NDIS_PACKET_TYPE_PROMISCUOUS ,

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


> можно обойтись простым прокси

А можно маленький кусочек кода :-)))


 
Rezya ©   (2004-04-02 22:21) [4]

Вот вот меня тоже эта прблема волнует. Если можно про прокси поподробнее. :-)


 
Verg ©   (2004-04-02 22:30) [5]


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


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


 
Verg ©   (2004-04-02 22:30) [6]

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


 
Rezya ©   (2004-04-03 02:31) [7]

По поводу:

> Во всяком случае на 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.


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

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


 
Rouse_ ©   (2004-04-03 11:37) [9]

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


 
Verg ©   (2004-04-03 13:37) [10]

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

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

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

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


 
Verg ©   (2004-04-03 13:38) [11]

program Console;
{$APPTYPE CONSOLE}
uses
 Windows,
 SysUtils,
 WinSock2,
 mstcpip;
const
 IP_MAXPACKET = 65535;
type
   PIPHeader = ^TIPHeader;
   TIPHeader = packed record
     verlen : byte;      // &#226;&#229;&#240;&#241;&#232;&#255; &#232; &#228;&#235;&#232;&#237;&#224; &#231;&#224;&#227;&#238;&#235;&#238;&#226;&#234;&#224;
     tos    : byte;      // &#242;&#232;&#239; &#241;&#229;&#240;&#226;&#232;&#241;&#224;
     length : word;      // &#228;&#235;&#232;&#237;&#224; &#226;&#241;&#229;&#227;&#238; &#239;&#224;&#234;&#229;&#242;&#224;
     id     : word;      // Id
     offset : word;      // &#244;&#235;&#224;&#227;&#232; &#232; &#241;&#236;&#229;&#249;&#229;&#237;&#232;&#255;
     ttl    : byte;      // &#226;&#240;&#229;&#236;&#255; &#230;&#232;&#231;&#237;&#232;
     protocol : byte;    // &#239;&#240;&#238;&#242;&#238;&#234;&#238;&#235;
     xsum   : word;      // &#234;&#238;&#237;&#242;&#240;&#238;&#235;&#252;&#237;&#224;&#255; &#241;&#243;&#236;&#236;&#224;
     src    : TInAddr;   // IP-&#224;&#228;&#240;&#229;&#241; &#238;&#242;&#239;&#240;&#224;&#226;&#232;&#242;&#229;&#235;&#255;
     dst    : TInAddr;   // IP-&#224;&#228;&#240;&#229;&#241; &#237;&#224;&#231;&#237;&#224;&#247;&#229;&#237;&#232;&#255;
   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 RS<>INVALID_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 WSAGetLastError<>NO_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))+" <IP address>");
   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:41) [12]

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

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


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


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


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


 
Verg ©   (2004-04-03 16:35) [14]


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


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

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


 
Rezya ©   (2004-04-03 20:01) [15]

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


 
Rouse_ ©   (2004-04-03 21:13) [16]

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


 
Verg ©   (2004-04-03 23:03) [17]


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


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

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


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


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


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


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


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


 
Rouse_ ©   (2004-04-04 01:46) [19]

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


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

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


 
Alex Konshin ©   (2004-04-04 09:34) [21]

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


 
Rezya ©   (2004-04-04 11:35) [22]

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


 
Verg ©   (2004-04-04 12:29) [23]


> 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.


 
Alex Konshin ©   (2004-04-04 13:21) [24]

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



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

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

Наверх




Память: 0.54 MB
Время: 0.045 c
3-1082742571
HPR
2004-04-23 21:49
2004.05.23
Реструктуризация таблицы


4-1080878640
Tornado
2004-04-02 08:04
2004.05.23
Сообщения Windows


6-1081180609
OSokin
2004-04-05 19:56
2004.05.23
WinPopup


14-1083326823
Тимохов
2004-04-30 16:07
2004.05.23
Советы Рихтера не пользоватся ExitThread.


8-1078786855
ПсихЪ
2004-03-09 02:00
2004.05.23
TDirectDrawSurface из DelphiX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский