Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Написание фаервола под Win32

Автор: EndoR
Дата сообщения: 15.09.2003 08:21
Задача: нужно напистаь сервис, который выполнял бы переват пакетов из сети. А также слушал бы на каком-нить порту. Какая инфа, книги?
Автор: Pupsik
Дата сообщения: 15.09.2003 08:52
В Инете столько информации по этому поводу, удивительно, что ты ничего не смог найти.
Ну вот тебе наводки:
Для всех версий 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: И не забудь, если у тебя сеть построена на коммутаторах, все бесполезно.
Автор: EndoR
Дата сообщения: 15.09.2003 10:35
Pupsik
да я не к тому, что ничего не нашел. просто, может, мысли какие по этому поводу. ссылки эти я видел, но все равно спасибо.
а насчет коммутаторов это почему это бесполезно? ты не сможешь ethernet-пакеты вычислять (вернее, они будут из-за свича одинаковыми), но меня-то интересует и IP, и выше (TCP, ICMP, UDP).

Цитата:
должны быть готовые компоненты...

пасиб, гляну. правда, там может быть .net, а я пока не знаю, как сие заюзать под visual c++.

ЗЫ еще раз уточню задачу - грубо говоря, нужно напистаь фаервол, который будет ловить все, что приходит из сети (Ethernet, IP, 4-ый уровень и т.п.).

Добавлено
Во, один момент...

Код: #include <windows.h>
#include <winsock2.h>
Автор: Arion
Дата сообщения: 15.09.2003 16:39

Цитата:
у меня почему-то идет ругань при компиляции, когда включаю winsock2.h. Когда просто используется windows.h, то все нормально. В чем дело?



Код:
#include <winsock2.h>
#include <windows.h>
Автор: EndoR
Дата сообщения: 15.09.2003 17:25
Arion
не, все равно эффекта ноль...
Автор: UncoNNecteD
Дата сообщения: 15.09.2003 18:43
EndoR
У тебя может не стоять второй винсок, хотя скорее просто нет библиотек для работы с ним.
Кстати параллельный вопрос - как написать файрвол?
То есть со снифингом мне в принципе все понятно, а вот насчет файрвола голова темная - думаю тут надо писать враппер винсоковских dll-ек?
Прав я - аль нет?
Автор: EndoR
Дата сообщения: 15.09.2003 20:00
UncoNNecteD

Цитата:
То есть со снифингом мне в принципе все понятно, а вот насчет файрвола голова темная - думаю тут надо писать враппер винсоковских dll-ек?
Прав я - аль нет?

без понятия предстоит узнать.

Цитата:
У тебя может не стоять второй винсок

Wsock32.dll - 5.00.2195.4874 - оно?
Автор: Arion
Дата сообщения: 15.09.2003 20:45
Хм, странно. А что конкретно пишет?
Автор: EndoR
Дата сообщения: 16.09.2003 09:58
Кучу ошибок выдает из модуля winsock2.h. Например,

Код:
c:\Program Files\Microsoft Visual Studio .NET\Vc7\PlatformSDK\Include\WinSock2.h(109): error C2011: 'fd_set' : 'struct' type redefinition
Автор: odl455
Дата сообщения: 16.09.2003 13:42
видимо winsock2.h уже включён директивами в windows.h
Попробуй просто без #include <winsock2.h>
Автор: mymuss
Дата сообщения: 16.09.2003 14:22
odl455

Цитата:
видимо winsock2.h уже включён директивами в windows.h
Попробуй просто без #include <winsock2.h>

Странно, там во всех заголовочных файлах:
#ifndef _BLAHBLAH_
#define _BLAHBLAH_

...

#endif

Как он может дважды включен быть?

Добавлено
EndoR
А что если попробовать не winsock2.h а winsock.h?

Добавлено
EndoR
И еще, попробуй перегенерить (или отключить) Precompiled headers
Автор: EndoR
Дата сообщения: 16.09.2003 19:30
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
Дата сообщения: 16.09.2003 19:47
EndoR

Цитата:
Код: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
Дата сообщения: 16.09.2003 20:05
а как быть?
Автор: mymuss
Дата сообщения: 16.09.2003 20:11
EndoR

Цитата:
а как быть?

Учить С/С++... Читать Кернигана-Ричи/Страуструпа... )

Попробуй так:

Код:
int mysize;

mysize = sizeof(tcpaddr);

...
accept(sSocket, (SOCKADDR *)&tcpaddr, &mysize);
Автор: EndoR
Дата сообщения: 16.09.2003 20:29
не проще ли все это будет под C#?
Автор: mymuss
Дата сообщения: 17.09.2003 15:17
EndoR

Цитата:
не проще ли все это будет под C#

Говорят: "Хорошая дорога -- знакомая дорога".
Для меня легче на С/С++. Для тебя, вполне возможно, наоборот.
Только о кросплатформенных приложениях на С#, конечно, можешь забыть.
Автор: EndoR
Дата сообщения: 17.09.2003 20:33
А возможно ли реализовать такую схему:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается.

Добавлено

Цитата:
у меня почему-то идет ругань при компиляции, когда включаю winsock2.h. Когда просто используется windows.h, то все нормально. В чем дело?

ошибки вылечились путем добавления WS2_32.Lib в проект
Автор: EndoR
Дата сообщения: 22.09.2003 20:51
А возможно ли реализовать такую схему:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается. может, еще есть свежие идеи по поводу, как такое реализовать?
Автор: EAS
Дата сообщения: 25.09.2003 02:37

Цитата:
ошибки вылечились путем добавления WS2_32.Lib в проект



Цитата:
посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается

А в чем проблема? Конструкцию if вроде никто не отменял . В зависимости от "развесистости" программы, от bool до event/mutex etc.
Если вопрос как отрубить/приостановить фильтрацию, то - исходники в студию. Смотря что отрубать...
Автор: Serjik
Дата сообщения: 25.09.2003 03:00
EndoR

Цитата:
висит сервис и слушает порт. удаленная программа подключается к этому порту и посылает специальное сообещение. сервис выключается, вернее, фильтрация прекращается. может, еще есть свежие идеи по поводу, как такое реализовать?

Что это в итоге должно из себя представлять? Если ты хочешь создать что-то вроде файрвола, с удаленным управление, то это одно, если управляемый снифер на клиентской машине, это другое, а если что еще, то расскажи, иначе помочь ничем не смогу.
Автор: EndoR
Дата сообщения: 25.09.2003 07:57
Serjik

Цитата:
Если ты хочешь создать что-то вроде файрвола

угу. это тема моего диплома. чем раньше начну писать, тем что-то более рабоспособное будет к защите.
этот фаервол должен содержать 2 модуля - собссно, сервис, который слушает подключения удаленного управления и фильтрует трафик, и удаленное управление (запуск/остановка фильтрации, отображение трафика, управление логами и т.д. и т.п.)
Автор: Serjik
Дата сообщения: 25.09.2003 08:26
EndoR
какие моменты в написании программы не понятны? на пример - получить список устройств, или перехват пакетов и т.д.
Автор: EndoR
Дата сообщения: 27.09.2003 09:54
Serjik

Цитата:
перехват пакетов

да. именно этот момент. просто сейчас примерно представляю, как все организовать:
удаленный интерфейс, который подключается к сервису.
сервис, в котором два потока - один слушает подключения, а второй фильтрует.
интересно, как бы получше организовать фильтрацию. и можно ли как-нибудь фильтровать ethernet? хотелось бы и это тоже реализовать.
Автор: Serjik
Дата сообщения: 27.09.2003 11:05
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();
Автор: UncoNNecteD
Дата сообщения: 28.09.2003 14:11
EndoR
Тяжелую ты взял тему для диплома.
Заметь как мало хороших решений файрвола под win существует.
И это не просто так...
Автор: EndoR
Дата сообщения: 29.09.2003 18:21
UncoNNecteD
сам уже в шоке... но делать нечего, поздняк метаться...
Serjik
пасиб. ща поковыряю...
Автор: UncoNNecteD
Дата сообщения: 30.09.2003 00:47
gg
Автор: zorrack
Дата сообщения: 30.09.2003 21:15
А вот еще вопрос. Прослушивание сети идет великолепно. А как определить транзитные пакеты? Т.е. те пакеты которые попадают из локальной сети на внутренний интерфейс и потом передаются дальше, и наоборот, пакеты которые приходят извне и адресованы через NAT во внутреннюю сеть. Т.е. задача пассивного монитора сети с подсчетом траффика по ИП-адресам
Автор: UncoNNecteD
Дата сообщения: 30.09.2003 21:37
zorrack
А что, по адресам src-dst никак?

Страницы: 12

Предыдущая тема: Поиск по таблице в DELPHI


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.