![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Захват исходящего трафика [D7, WinXP]
-=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.
Может все же "повторить"? -