Форум: "Сети";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
ВнизWinSock Найти похожие ветки
← →
Demetrius2003 (2003-08-26 16:48) [0]Можно ли как- то организовать "прослушивание порта", то есть наблюдать за данными, которые в него входят и выходят(сокет создан чужим приложением ессно)
← →
Digitman (2003-08-26 17:02) [1]можно
← →
Demetrius2003 (2003-08-27 09:27) [2]А как именно ?????
← →
Digitman (2003-08-27 09:30) [3]например, перехват WinsockAPI-ф-ций send[to], recv[from]
← →
Demetrius2003 (2003-08-27 09:34) [4]А-а-а-а, действительно можно попробовать.
Спасибо!!!!!
← →
savva (2003-08-27 13:16) [5]а если использовать promiscuous mode для сокета (будет работать тока для Win2Л и выше)
SIO_RCVALL
Enables a socket to receive all IP packets on the network. The socket handle passed to the WSAIoctl function must be of AF_INET address family, SOCK_RAW socket type, and IPPROTO_IP protocol. The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.
Once the socket is bound and the ioctl set, calls to the WSARecv or recv functions return IP datagrams passing through the given interface. Note that you must supply a sufficiently large buffer. Setting this ioctl requires Administrator privilege on the local computer. SIO_RCVALL is available in Windows 2000 and later versions of Windows.
← →
Digitman (2003-08-27 13:23) [6]
> savva
речь-то идет о "чужом" процессе)
← →
Alex Konshin (2003-08-28 08:13) [7]Sniffer?
← →
savva (2003-08-28 12:00) [8]> Digitman c (27.08.03 13:23) [6]
> речь-то идет о "чужом" процессе)
ну и что? у меня не плохо ловятся данные.
вот код. Возможно он где то неверен, но мои цели я достиг.. Это консольная программа ловит данные проходящие через сетевую (в данном примере читаются тока TCP данные). Так как автор вопроса не акцентировал какой протокол он будет слушать, то я предлагаю свой вариант для IP-based протоколов (ICMP,IGMP,GGP,TCP,PUP,UDP,IDP).
Повторюсь - возможно какую-то тонкость я упустил, но в целом этот код меня на данный момент удовлетворяет...
program Project1;
{$APPTYPE CONSOLE}
uses
windows,
WinSock;
const MAX_PACKET_SIZE = $10000;
const SIO_RCVALL = $98000001;
type
//Структура заголовка IP-пакета
// PIPHeader = ^TIPHeader;
TIPHeader = packed record
iph_ver : byte; // версия заголовка
iph_tos : UCHAR; // тип сервиса
iph_length : SHORT; // длина всего пакета
iph_id : SHORT; // Идентификация
iph_offset : SHORT; // флаги и смещения
iph_ttl : UCHAR; // время жизни пакета
iph_protocol : byte ; // протокол
iph_xsum : SHORT; // контрольная сумма
iph_src : ULONG; // IP-адрес отправителя
iph_dest : ULONG; // IP-адрес назначения
end;
TTCPHeader = record
tcp_src : SHORT;
tcp_dest : SHORT ;
tcp_seq : ULONG ;
tcp_ack : ULONG ;
tcp_Offset : UINT ;
tcp_flags : UCHAR ;
tcp_window: byte ;
tcp_xsum : byte ;
tcp_urgent: byte ;
end;
var
src : string[15];
dest: string[15];
tmp1,tmp2 : string;// временная строка для перекодировки CharToOem
Buffer : PChar; // Буфер для приёма данных
_wsadata : TWSADATA; // Инициализация WinSock.
s : TSocket; // Cлущающий сокет.
name : array[1..128] of char; // Имя хоста (компьютера).
phe : PHOSTENT; // Информация о хосте.
sa : SOCKADDR_IN; // Адрес хоста
sa1 : TInAddr ; // для преобразования адреса отправителя и получателя
flag : u_long= 1; // Флаг PROMISC Вкл/выкл.
count : integer; // скока мы получаем
hdrIP : TIPHeader; // IP заголовок
hdrTCP : TTCPHeader; // TCP заголовок
PortSource , PortDest : WORD; // порт отправителя и получателя
i : integer;// просто счетчик
// чтобы не подключать из-зи одной функции Sysutils
// экономия около 25 кб при текущем размере 19Кб
function SysErrorMessage(ErrorCode: Integer): string;
var
Len: Integer;
Buffer: array[0..255] of Char;
begin
Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or
FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
SizeOf(Buffer), nil);
while (Len > 0) and (Buffer[Len - 1] in [ #0..#32 {, "."}]) do Dec(Len);
SetString(Result, Buffer, Len);
end;
begin
// инициализация
GetMem(Buffer,MAX_PACKET_SIZE);
WSAStartup(MAKEWORD(2,2), _wsadata);
s := socket( AF_INET, SOCK_RAW, IPPROTO_IP );
gethostname(@name, sizeof(name));
phe := gethostbyname( @name );
ZeroMemory( @sa, sizeof(sa) );
sa.sin_family := AF_INET;
sa.sin_addr.s_addr := Integer(Pointer(phe.h_addr^)^);
if bind(s, Tsockaddr(sa), sizeof(TSockAddr))<>0 then begin
tmp1:=(SysErrorMessage(WSAGetLastError));
CharToOem(@tmp1,@tmp2);
Writeln(tmp2);
read;
exit;
end;
// Включение promiscuous mode.
if ioctlsocket(s, SIO_RCVALL, flag)<>0 then begin
tmp1:=(SysErrorMessage(WSAGetLastError));
CharToOem(@tmp1,@tmp2);
Writeln(tmp2);
read;
exit;
end;
// Бесконечный цикл приёма IP-пакетов.
while true do begin
count := recv( s, Buffer^, MAX_PACKET_SIZE, 0 );
IF count =SOCKET_ERROR THEN begin
tmp1:=(SysErrorMessage(WSAGetLastError));
CharToOem(@tmp1,@tmp2);
Writeln("Error :",tmp2);
read;
exit;
end else begin
// обработка IP-пакета
if( count >= sizeof(TIPHeader) ) then begin
CopyMemory(@hdrIP,Buffer,sizeof(TIPHeader));
//Начинаем разбор пакета...
// для примера будем трогать тока TCP пакеты
if hdrIP.iph_protocol<> IPPROTO_TCP then
continue;
//получаем tcp header
Buffer := Pointer(DWord(Buffer) + sizeof(TIPHeader));
CopyMemory(@hdrTcp,Buffer,sizeof(TTCPHeader));
Buffer := Pointer(DWord(Buffer) + sizeof(TTCPHeader));
// порты отправителя и получателя
PortSource := ntohs( hdrTcp.tcp_src ) ;
PortDest := ntohs( hdrTcp.tcp_dest ) ;
// начинаем помаленьку выводить данные
src:="Пакет: ";
CharToOem(@src,@dest);
write(dest," id=",hdrIP.iph_id);
// Вычисляем протокол. Полный список этих констант
// содержится в файле winsock2.h
write(" Protocol: ");
case hdrIP.iph_protocol of
IPPROTO_ICMP : write("ICMP "); { control message protocol }
IPPROTO_IGMP : write("IGMP "); { group management protocol }
IPPROTO_GGP : write("GGP "); { gateway^2 (deprecated) }
IPPROTO_TCP : write("TCP "); { tcp }
IPPROTO_PUP : write("PUP "); { pup }
IPPROTO_UDP : write("UDP "); { user datagram protocol }
IPPROTO_IDP : write("IDP "); { xns idp }
end;
// Вычисляем размер. Так как в сети принят прямой порядок
// байтов, а не обратный, то прийдётся поменять байты местами.
write(" Size: ",ntohs(hdrIP.iph_length));
// Вычисляем время жизни пакета.
write(" TTL: ",hdrIP.iph_ttl,#13#10);
// Преобразуем в понятный вид адрес отправителя.
sa1.s_addr := hdrIP.iph_src;
write(" From ",inet_ntoa(sa1)," port ",PortSource," ==>>>> ");
// Преобразуем в понятный вид адрес получателя.
sa1.s_addr := hdrIP.iph_dest;
writeln(" To ",inet_ntoa(sa1)," port ",PortDest);
// теперь выводим данные
if (hdrIP.iph_length-(sizeof(TIPHeader)+sizeof(TTCPHeader)))>0 then begin
write("Data: ");
for i:=(sizeof(TIPHeader)+sizeof(TTCPHeader)) to hdrIP.iph_length do
// выводим тока печатаемые символы и сиволы конца и перевода строки
if (ord(Buffer[i])>=32) or ( ord(Buffer[i]) in [10,13]) then
write(Buffer[i]);
// отделим все пустой строкой
write(#13#10);
end;
end;
end;
end;
closesocket( s );
WSACleanup();
readln;
end.
← →
savva (2003-08-28 12:12) [9]закралась ошибка:))
// теперь выводим данные
if ( ntohs(hdrIP.iph_length)-(sizeof(TIPHeader)+sizeof(TTCPHeader)) )>0 then begin
write("Data: ");
for i:=(sizeof(TIPHeader)+sizeof(TTCPHeader)) to ntohs(hdrIP.iph_length) do
Страницы: 1 вся ветка
Форум: "Сети";
Текущий архив: 2003.10.23;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c