Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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
14-74388
Карелин Артем
2003-10-02 17:36
2003.10.23
Про FreePascal


3-73994
Velvet
2003-09-30 22:10
2003.10.23
предложение DELETE в SQL


14-74397
Lony
2003-10-06 11:55
2003.10.23
Пароль на вход в Windows2000


7-74517
Zilog
2003-08-11 12:39
2003.10.23
COM порт:


8-74325
wara
2003-06-21 13:24
2003.10.23
Понижение числа точек в JPG- файле





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