Форум: "Сети";
Текущий архив: 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; // âåðñèÿ è äëèíà çàãîëîâêà
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 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.038 c