Задача: нужно напистаь сервис, который выполнял бы переват пакетов из сети. А также слушал бы на каком-нить порту. Какая инфа, книги?
» Написание фаервола под Win32
В Инете столько информации по этому поводу, удивительно, что ты ничего не смог найти.
Ну вот тебе наводки:
Для всех версий Windows (включая 95) ищи драйвера WinPCap (http://winpcap.polito.it/)
Для версий Windows 2000/XP смотри волшебные слова "promiscuous mode"
Ну и для начала посмотри это:
http://www.rsdn.ru/article/net/sniffer.xml
http://www.ntndis.com/articles/firewall.htm
http://www.ethereal.com/
Хотя наверняка на torry.net должны быть готовые компоненты...
PS: И не забудь, если у тебя сеть построена на коммутаторах, все бесполезно.
Ну вот тебе наводки:
Для всех версий Windows (включая 95) ищи драйвера WinPCap (http://winpcap.polito.it/)
Для версий Windows 2000/XP смотри волшебные слова "promiscuous mode"
Ну и для начала посмотри это:
http://www.rsdn.ru/article/net/sniffer.xml
http://www.ntndis.com/articles/firewall.htm
http://www.ethereal.com/
Хотя наверняка на torry.net должны быть готовые компоненты...
PS: И не забудь, если у тебя сеть построена на коммутаторах, все бесполезно.
Pupsik
да я не к тому, что ничего не нашел. просто, может, мысли какие по этому поводу. ссылки эти я видел, но все равно спасибо.
а насчет коммутаторов это почему это бесполезно? ты не сможешь ethernet-пакеты вычислять (вернее, они будут из-за свича одинаковыми), но меня-то интересует и IP, и выше (TCP, ICMP, UDP).
Цитата:
пасиб, гляну. правда, там может быть .net, а я пока не знаю, как сие заюзать под visual c++.
ЗЫ еще раз уточню задачу - грубо говоря, нужно напистаь фаервол, который будет ловить все, что приходит из сети (Ethernet, IP, 4-ый уровень и т.п.).
Добавлено
Во, один момент...
Код: #include <windows.h>
#include <winsock2.h>
да я не к тому, что ничего не нашел. просто, может, мысли какие по этому поводу. ссылки эти я видел, но все равно спасибо.
а насчет коммутаторов это почему это бесполезно? ты не сможешь ethernet-пакеты вычислять (вернее, они будут из-за свича одинаковыми), но меня-то интересует и IP, и выше (TCP, ICMP, UDP).
Цитата:
должны быть готовые компоненты...
пасиб, гляну. правда, там может быть .net, а я пока не знаю, как сие заюзать под visual c++.
ЗЫ еще раз уточню задачу - грубо говоря, нужно напистаь фаервол, который будет ловить все, что приходит из сети (Ethernet, IP, 4-ый уровень и т.п.).
Добавлено
Во, один момент...
Код: #include <windows.h>
#include <winsock2.h>
Цитата:
у меня почему-то идет ругань при компиляции, когда включаю winsock2.h. Когда просто используется windows.h, то все нормально. В чем дело?
Код:
#include <winsock2.h>
#include <windows.h>
Arion
не, все равно эффекта ноль...
не, все равно эффекта ноль...
EndoR
У тебя может не стоять второй винсок, хотя скорее просто нет библиотек для работы с ним.
Кстати параллельный вопрос - как написать файрвол?
То есть со снифингом мне в принципе все понятно, а вот насчет файрвола голова темная - думаю тут надо писать враппер винсоковских dll-ек?
Прав я - аль нет?
У тебя может не стоять второй винсок, хотя скорее просто нет библиотек для работы с ним.
Кстати параллельный вопрос - как написать файрвол?
То есть со снифингом мне в принципе все понятно, а вот насчет файрвола голова темная - думаю тут надо писать враппер винсоковских dll-ек?
Прав я - аль нет?
UncoNNecteD
Цитата:
без понятия предстоит узнать.
Цитата:
Wsock32.dll - 5.00.2195.4874 - оно?
Цитата:
То есть со снифингом мне в принципе все понятно, а вот насчет файрвола голова темная - думаю тут надо писать враппер винсоковских dll-ек?
Прав я - аль нет?
без понятия предстоит узнать.
Цитата:
У тебя может не стоять второй винсок
Wsock32.dll - 5.00.2195.4874 - оно?
Хм, странно. А что конкретно пишет?
Кучу ошибок выдает из модуля winsock2.h. Например,
Код:
c:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\WinSock2.h(109): error C2011: 'fd_set' : 'struct' type redefinition
Код:
c:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\WinSock2.h(109): error C2011: 'fd_set' : 'struct' type redefinition
видимо winsock2.h уже включён директивами в windows.h
Попробуй просто без #include <winsock2.h>
Попробуй просто без #include <winsock2.h>
odl455
Цитата:
Странно, там во всех заголовочных файлах:
#ifndef _BLAHBLAH_
#define _BLAHBLAH_
...
#endif
Как он может дважды включен быть?
Добавлено
EndoR
А что если попробовать не winsock2.h а winsock.h?
Добавлено
EndoR
И еще, попробуй перегенерить (или отключить) Precompiled headers
Цитата:
видимо winsock2.h уже включён директивами в windows.h
Попробуй просто без #include <winsock2.h>
Странно, там во всех заголовочных файлах:
#ifndef _BLAHBLAH_
#define _BLAHBLAH_
...
#endif
Как он может дважды включен быть?
Добавлено
EndoR
А что если попробовать не winsock2.h а winsock.h?
Добавлено
EndoR
И еще, попробуй перегенерить (или отключить) Precompiled headers
odl455
mymuss
работает при <windows.h> и <winsock.h> (либо вместе, либо только первый). но я где-то вычитал, что нужно юзать winsock2.h
Тут еще вопрос встречный... есть такое:
Код:
SOCKADDR_IN tcpaddr;
tcpaddr.sin_family = sock_addr_fam;
tcpaddr.sin_port = htons(sock_port);
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sSocket, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
listen(sSocket,SOMAXCONN);
_cputs("Waiting for connection...");
accept(sSocket, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
_cputs("Connection accepted.");
mymuss
работает при <windows.h> и <winsock.h> (либо вместе, либо только первый). но я где-то вычитал, что нужно юзать winsock2.h
Тут еще вопрос встречный... есть такое:
Код:
SOCKADDR_IN tcpaddr;
tcpaddr.sin_family = sock_addr_fam;
tcpaddr.sin_port = htons(sock_port);
tcpaddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(sSocket, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
listen(sSocket,SOMAXCONN);
_cputs("Waiting for connection...");
accept(sSocket, (SOCKADDR *)&tcpaddr, sizeof(tcpaddr));
_cputs("Connection accepted.");
EndoR
Цитата:
Дык, что ж ты хочешь:
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
там указатель на int надо передавать а не собственно размер.
Цитата:
Код:error C2664: 'accept' : cannot convert parameter 3 from 'size_t' to 'int *'
Подскажите, как быть?
Дык, что ж ты хочешь:
SOCKET accept(
SOCKET s,
struct sockaddr FAR *addr,
int FAR *addrlen
);
там указатель на int надо передавать а не собственно размер.
а как быть?
EndoR
Цитата:
Учить С/С++... Читать Кернигана-Ричи/Страуструпа... )
Попробуй так:
Код:
int mysize;
mysize = sizeof(tcpaddr);
...
accept(sSocket, (SOCKADDR *)&tcpaddr, &mysize);
Цитата:
а как быть?
Учить С/С++... Читать Кернигана-Ричи/Страуструпа... )
Попробуй так:
Код:
int mysize;
mysize = sizeof(tcpaddr);
...
accept(sSocket, (SOCKADDR *)&tcpaddr, &mysize);
не проще ли все это будет под C#?
EndoR
Цитата:
Говорят: "Хорошая дорога -- знакомая дорога".
Для меня легче на С/С++. Для тебя, вполне возможно, наоборот.
Только о кросплатформенных приложениях на С#, конечно, можешь забыть.
Цитата:
не проще ли все это будет под C#
Говорят: "Хорошая дорога -- знакомая дорога".
Для меня легче на С/С++. Для тебя, вполне возможно, наоборот.
Только о кросплатформенных приложениях на С#, конечно, можешь забыть.
А возможно ли реализовать такую схему:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается.
Добавлено
Цитата:
ошибки вылечились путем добавления WS2_32.Lib в проект
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается.
Добавлено
Цитата:
у меня почему-то идет ругань при компиляции, когда включаю winsock2.h. Когда просто используется windows.h, то все нормально. В чем дело?
ошибки вылечились путем добавления WS2_32.Lib в проект
А возможно ли реализовать такую схему:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается. может, еще есть свежие идеи по поводу, как такое реализовать?
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается. может, еще есть свежие идеи по поводу, как такое реализовать?
Цитата:
ошибки вылечились путем добавления WS2_32.Lib в проект
Цитата:
посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается
А в чем проблема? Конструкцию if вроде никто не отменял . В зависимости от "развесистости" программы, от bool до event/mutex etc.
Если вопрос как отрубить/приостановить фильтрацию, то - исходники в студию. Смотря что отрубать...
EndoR
Цитата:
Что это в итоге должно из себя представлять? Если ты хочешь создать что-то вроде файрвола, с удаленным управление, то это одно, если управляемый снифер на клиентской машине, это другое, а если что еще, то расскажи, иначе помочь ничем не смогу.
Цитата:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается. может, еще есть свежие идеи по поводу, как такое реализовать?
Что это в итоге должно из себя представлять? Если ты хочешь создать что-то вроде файрвола, с удаленным управление, то это одно, если управляемый снифер на клиентской машине, это другое, а если что еще, то расскажи, иначе помочь ничем не смогу.
Serjik
Цитата:
угу. это тема моего диплома. чем раньше начну писать, тем что-то более рабоспособное будет к защите.
этот фаервол должен содержать 2 модуля - собссно, сервис, который слушает подключения удаленного управления и фильтрует трафик, и удаленное управление (запуск/остановка фильтрации, отображение трафика, управление логами и т.д. и т.п.)
Цитата:
Если ты хочешь создать что-то вроде файрвола
угу. это тема моего диплома. чем раньше начну писать, тем что-то более рабоспособное будет к защите.
этот фаервол должен содержать 2 модуля - собссно, сервис, который слушает подключения удаленного управления и фильтрует трафик, и удаленное управление (запуск/остановка фильтрации, отображение трафика, управление логами и т.д. и т.п.)
EndoR
какие моменты в написании программы не понятны? на пример - получить список устройств, или перехват пакетов и т.д.
какие моменты в написании программы не понятны? на пример - получить список устройств, или перехват пакетов и т.д.
Serjik
Цитата:
да. именно этот момент. просто сейчас примерно представляю, как все организовать:
удаленный интерфейс, который подключается к сервису.
сервис, в котором два потока - один слушает подключения, а второй фильтрует.
интересно, как бы получше организовать фильтрацию. и можно ли как-нибудь фильтровать ethernet? хотелось бы и это тоже реализовать.
Цитата:
перехват пакетов
да. именно этот момент. просто сейчас примерно представляю, как все организовать:
удаленный интерфейс, который подключается к сервису.
сервис, в котором два потока - один слушает подключения, а второй фильтрует.
интересно, как бы получше организовать фильтрацию. и можно ли как-нибудь фильтровать ethernet? хотелось бы и это тоже реализовать.
EndoR
Цитата:
в современных сокетах это делается просто, даже не нужны дополнительные драйвера у меня где-то есть листинг проги, которая перехватывает все пакеты, и пишет служебную инфу в файл, занимает меньше страницы кода на VC++.
вроде это, проверь... щас просто времени нет...
Код:
char BBB[0x10000];
CDatabase mDB;
mDB.OpenEx(_T("DSN=sniffer"), CDatabase::noOdbcDialog);
SYSTEMTIME st;
CFile cf;
cf.Open("c:\\sniff.log", CFile::modeWrite | CFile::shareExclusive | CFile::modeCreate, NULL);
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.
char *bbb="\0";
// инициализация
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 = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
int count;
char buff[20];
unsigned long ul=0;
CString ss, sql;
while( ul<10000 )
{
count = recv( s, (char*)BBB, sizeof(BBB), 0 );
GetLocalTime(&st);
if( count >= sizeof(IPHeader) )
{
ul++;
IPHeader* hdr = (IPHeader *)BBB;
ss = long2char(hdr->id)+"\t"+long2IPchar(hdr->src)+"\t"+long2IPchar(hdr->dest)+"\t"+long2char(count)+"\n";
sql = "insert into log(dt, src, dst, protocol, tos, ttl, size) values('"+time2str(st)+"', '"+long2IPchar(hdr->src)+"', '"+long2IPchar(hdr->dest)+"', "+long2char(hdr->protocol)+", "+long2char(hdr->tos)+", "+long2char(hdr->ttl)+", "+long2char(count)+")";
mDB.ExecuteSQL(sql);
cf.Write(ss, ss.GetLength());
m_e.SetWindowText(long2char(ul));
m_e.RedrawWindow();
}
}
closesocket( s );
WSACleanup();
mDB.Close();
cf.Close();
Цитата:
перехват пакетов
в современных сокетах это делается просто, даже не нужны дополнительные драйвера у меня где-то есть листинг проги, которая перехватывает все пакеты, и пишет служебную инфу в файл, занимает меньше страницы кода на VC++.
вроде это, проверь... щас просто времени нет...
Код:
char BBB[0x10000];
CDatabase mDB;
mDB.OpenEx(_T("DSN=sniffer"), CDatabase::noOdbcDialog);
SYSTEMTIME st;
CFile cf;
cf.Open("c:\\sniff.log", CFile::modeWrite | CFile::shareExclusive | CFile::modeCreate, NULL);
WSADATA wsadata; // Инициализация WinSock.
SOCKET s; // Cлущающий сокет.
char name[128]; // Имя хоста (компьютера).
HOSTENT* phe; // Информация о хосте.
SOCKADDR_IN sa; // Адрес хоста
unsigned long flag = 1; // Флаг PROMISC Вкл/выкл.
char *bbb="\0";
// инициализация
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 = ((struct in_addr *)phe->h_addr_list[0])->s_addr;
bind(s, (SOCKADDR *)&sa, sizeof(SOCKADDR));
// Включение promiscuous mode.
ioctlsocket(s, SIO_RCVALL, &flag);
int count;
char buff[20];
unsigned long ul=0;
CString ss, sql;
while( ul<10000 )
{
count = recv( s, (char*)BBB, sizeof(BBB), 0 );
GetLocalTime(&st);
if( count >= sizeof(IPHeader) )
{
ul++;
IPHeader* hdr = (IPHeader *)BBB;
ss = long2char(hdr->id)+"\t"+long2IPchar(hdr->src)+"\t"+long2IPchar(hdr->dest)+"\t"+long2char(count)+"\n";
sql = "insert into log(dt, src, dst, protocol, tos, ttl, size) values('"+time2str(st)+"', '"+long2IPchar(hdr->src)+"', '"+long2IPchar(hdr->dest)+"', "+long2char(hdr->protocol)+", "+long2char(hdr->tos)+", "+long2char(hdr->ttl)+", "+long2char(count)+")";
mDB.ExecuteSQL(sql);
cf.Write(ss, ss.GetLength());
m_e.SetWindowText(long2char(ul));
m_e.RedrawWindow();
}
}
closesocket( s );
WSACleanup();
mDB.Close();
cf.Close();
EndoR
Тяжелую ты взял тему для диплома.
Заметь как мало хороших решений файрвола под win существует.
И это не просто так...
Тяжелую ты взял тему для диплома.
Заметь как мало хороших решений файрвола под win существует.
И это не просто так...
UncoNNecteD
сам уже в шоке... но делать нечего, поздняк метаться...
Serjik
пасиб. ща поковыряю...
сам уже в шоке... но делать нечего, поздняк метаться...
Serjik
пасиб. ща поковыряю...
gg
А вот еще вопрос. Прослушивание сети идет великолепно. А как определить транзитные пакеты? Т.е. те пакеты которые попадают из локальной сети на внутренний интерфейс и потом передаются дальше, и наоборот, пакеты которые приходят извне и адресованы через NAT во внутреннюю сеть. Т.е. задача пассивного монитора сети с подсчетом траффика по ИП-адресам
zorrack
А что, по адресам src-dst никак?
А что, по адресам src-dst никак?
Предыдущая тема: Поиск по таблице в DELPHI
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.