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

Вниз

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

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

Наверх




Память: 0.55 MB
Время: 0.023 c
14-1083268131
Serious Sam
2004-04-29 23:48
2004.05.23
Как написать прогу для мобилы (слышал, что на Делфи можно)


14-1083325598
WondeRu
2004-04-30 15:46
2004.05.23
Глупый вопрос, но....


4-1081150613
rimd
2004-04-05 11:36
2004.05.23
HWND and Path


4-1080839477
Константин
2004-04-01 21:11
2004.05.23
Запуск прогрыммы из Автозапуска


1-1083770988
serg1977
2004-05-05 19:29
2004.05.23
QReport for Delphi 7