Serjik

Full Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору 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(); |
|