Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты.
Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
Здравствуйте Leader, Вы писали:
L>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты. L>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
Есть кое что такое.
Под 2000 сокетами можно ловить пакеты все подряд.
Твоя задача — разобрать пакет по простому —
Определить тип пакета и тип протокола
Выдрать из IP пакета соответсвующий TCP/UDP
Определить входящий/исходящий адрес/порт
Здравствуйте old Dutchman, Вы писали:
OD>Есть кое что такое. OD>Под 2000 сокетами можно ловить пакеты все подряд.
OD>Твоя задача — разобрать пакет по простому -
OD>Определить тип пакета и тип протокола OD>Выдрать из IP пакета соответсвующий TCP/UDP OD>Определить входящий/исходящий адрес/порт
OD>Все...
Но как это сделать?? Я даже не знаю с чего начать, в каком направлении копаться...
К тому же для сети ничего почти раньше не писал....
Хм...Ну а если свести задачу к более простой — тупо считать весь интернет трафик целиком без углубления в дебри протоколов?? Может так будет легче??
Здравствуйте JazzzMan, Вы писали:
OD>>Твоя задача — разобрать пакет по простому -
OD>>Определить тип пакета и тип протокола OD>>Выдрать из IP пакета соответсвующий TCP/UDP OD>>Определить входящий/исходящий адрес/порт
OD>>Все...
JM>Но как это сделать?? Я даже не знаю с чего начать, в каком направлении копаться... JM>К тому же для сети ничего почти раньше не писал....
JM>Хм...Ну а если свести задачу к более простой — тупо считать весь интернет трафик целиком без углубления в дебри протоколов?? Может так будет легче??
Фи...
Тут писанины на две недели максимум вместе разбиранием с апи и протоколами и компиляцией и пивом и тд.
L>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты. L>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
можно заити на ввв.сф.нет и там поискатъ по слову траффиc , будет много проектов среди них что то вроде траффиc он линуx, его пишет русскии паренъ, скачаи соурcес посмотри , что не понятно будет наверно можно будет аск его где об етом прочитат. Еше можно взят соурcес тcпдумп и винпcап ...
Здравствуйте Leader, Вы писали:
L>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты. L>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
Кушайте на здоровье, — сам недавно писал.
#include"IpHlpApi.h"#include"WinSock2.h"#define MAX_SIZE 65535
SOCKADDR_IN addr; //адрес куда ты сокет будешь биндитьint nactive = TRUE;
IN_ADDR NetworkAddr; //адрес локальной сети, нужен если ты не хочешь считать пакеты из локалки
IN_ADDR NetworkMask; //маска локалки, - нужна для того жеtypedef struct _tagippacket {
unsigned long l1;
unsigned long l2;
unsigned long l3;
IN_ADDR Src;
IN_ADDR Dst;
unsigned long l6;
} IPHEADER;
int MatchNetwork(IN_ADDR Ip, IN_ADDR Mask, IN_ADDR Net) //определяет принадлежит ли пакет локалке
{
return (Ip.S_un.S_addr & Mask.S_un.S_addr) == Net.S_un.S_addr;
}
UINT TrafThread(LPVOID p)
{
int Traffic=0;
WORD wVersionRequested;
int err;
DWORD dwCByte, dwFlag=0;
WSADATA wsaData;
SOCKET sock;
WSABUF wsabuf;
IPHEADER *pIP;
BYTE *lBuf;
int nIndex;
NetworkAddr.S_un.S_addr = 0;
NetworkMask.S_un.S_addr = 0;
wVersionRequested = MAKEWORD(2,0);
err = WSAStartup(wVersionRequested,&wsaData); //инициализируем WinSockif (err != 0)
return 0;
if ( LOBYTE( wsaData.wVersion ) != 2 )
{
WSACleanup( );
return 0;
}
sock = WSASocket(AF_INET,SOCK_RAW,IPPROTO_IP,NULL,0,0);//Создаем сокет, -
//ответственный момент ибо здесь мы наделяем сокет способностью ловить ВСЕ пакеты,
//проходящие через сетевую плату.if (sock == INVALID_SOCKET)
{
WSACleanup( );
return 0;
}
addr.sin_family = AF_INET;
addr.sin_port = htons(0);
MIB_IPADDRTABLE AdapterInfo;
unsigned long dwBytes=100;
if (GetIpAddrTable(&AdapterInfo,&dwBytes,true)!=NO_ERROR)
{
closesocket(sock);
WSACleanup( );
ErrorBox(GetLastError(),"GetIpTab");
return 0;
}
addr.sin_addr.S_un.S_addr=AdapterInfo.table[0].dwAddr;//тут будет твой ИП
NetworkAddr.S_un.S_un_b.s_b1=ххх;
NetworkAddr.S_un.S_un_b.s_b2=ххх;
NetworkAddr.S_un.S_un_b.s_b3=ххх;
NetworkAddr.S_un.S_un_b.s_b4=ххх;
NetworkMask.S_un.S_un_b.s_b1=ххх;
NetworkMask.S_un.S_un_b.s_b2=ххх;
NetworkMask.S_un.S_un_b.s_b3=ххх;
NetworkMask.S_un.S_un_b.s_b4=ххх;
if (bind(sock,(SOCKADDR *)&addr,sizeof(addr)) == SOCKET_ERROR)//привязываем сокет к адресу и порту
{
closesocket(sock);
WSACleanup( );
return 0;
}
err=1;
if (WSAIoctl(sock,SIO_RCVALL,&err,sizeof(err),NULL,0,&dwCByte,NULL,NULL) == SOCKET_ERROR) //здесь мы говорим сокету, чтобы ловил все пакеты
{
closesocket(sock);
WSACleanup( );
return 0;
}
wsabuf.len = MAX_SIZE;
wsabuf.buf = (char *) malloc(MAX_SIZE*sizeof(char));
while (nactive)
{ if (WSARecv(sock,&wsabuf,1,&dwCByte,&dwFlag,NULL,NULL)!=SOCKET_ERROR)
{
pIP=(IPHEADER *)wsabuf.buf;
lBuf=(BYTE *)wsabuf.buf;
if ( (MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && !MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) ||
(!MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) )
{
Traffic +=(ntohl(pIP->l1)&0x0000FFFFL);
}
}
}
if (wsabuf.buf)
free(wsabuf.buf);
closesocket(sock);
WSACleanup();
return 0;
}
Вот и все, — запускаешь такое нитью и в Traffic будет твой траффик.
Не забудь вколючить прект либы к тем двум хедерам
Здравствуйте, Corvin, Вы писали:
L>>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты. L>>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
C>Кушайте на здоровье, — сам недавно писал.
[skip] C>Вот и все, — запускаешь такое нитью и в Traffic будет твой траффик.
МНе кажеться или этот код ловит только входящий трафик? А исходящий?
Здравствуйте, Spider84, Вы писали:
S>МНе кажеться или этот код ловит только входящий трафик? А исходящий?
Ну почему же?
if ( (MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && !MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr))
|| (!MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) )
Если источник пакета в локалке, а направление не в локалке, (исходящий траффик) или источник не в локалке, а направление в локалке, (входящий траффик) то пакет считаем
Здравствуйте, Corvin, Вы писали:
S>>МНе кажеться или этот код ловит только входящий трафик? А исходящий? C>Ну почему же?
if ( (MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && !MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr))
|| (!MatchNetwork(pIP->Src,NetworkMask,NetworkAddr) && MatchNetwork(pIP->Dst,NetworkMask,NetworkAddr)) )
C>Если источник пакета в локалке, а направление не в локалке, (исходящий траффик) или источник не в локалке, а направление в локалке, (входящий траффик) то пакет считаем
Я этот кусок вообще опустил и пишу в лог все пакеты, потом посмотрел, и обнаружил одну странную вещь. Все Dst имеют мой ИП ни одного Src == MyIP
Народ я ничего не понимаю!!!!
Реализую код этого сниффера в Visual Studio .NET — всё нормально
делаю тоже самое в Visual Studio 6.0 — сокет не инициализируется!!??
Здравствуйте, Leader, Вы писали:
L>Недавно был топик про программу слежения за расходом сетевого трафика (NetXRay) под разные порты. L>Дело в том, что мне надо написать точно такую же программу самому (курсовая), а я нигде не могу найти инфу по этой теме. Если у кого есть примеры реализации такой проги (язык значения не имеет) или нормальная документация, поделитесь плиз....
всё разобрался, там почему-то надо было сначала считать IP из APR таблицы а потом сокет инициализировать ????!!!
Здравствуйте, Corvin, Вы писали:
C>Кушайте на здоровье, — сам недавно писал.
Пытаюсь пустить под ВСВ 6.0 и ловлю ошибку на
ccode]
if (WSAIoctl(sock,SIO_RCVALL,&err,sizeof(err),NULL,0,&dwCByte,NULL,NULL) == SOCKET_ERROR) //здесь мы говорим сокету, чтобы ловил все пакеты
[/ccode]
"An invalig argument has supplied" (1447)
Может это ио-за того, что неправильно вписал
NetworkAddr.S_un.S_un_b.s_b1=192;
NetworkAddr.S_un.S_un_b.s_b2=168;
NetworkAddr.S_un.S_un_b.s_b3=0;
NetworkAddr.S_un.S_un_b.s_b4=15;