Как можно настроить сокет на прослушку 80 порта? когда я его настрайваю мне пишет что одним портом может пользоваться только одна прога. Но проблема в том что когда я соеденяюсь с гугл, он присылает ответ на 80 порт, хотя мой сокет работает на 181.
Тебе нужно воспользоватся снифером. (например ethereal) http://www.ethereal.com/ А открывать сокет на один и тот же порт нельзя (имхо) Иначе как программа определит что это её пакет? :]
КАК МОЖНО ОТПРАВЛЯТЬ ОТВЕТ ЧЕРЕЗ СОКЕТ??? Можно отправлять IP пакет с TCP фреймом, в котором есть SrcIP DstIP SrcPORT DstPORT В винде хендл - это индекс в таблицах которые храняться в ядре. Хендлы можно копировать из одного процесса в другой, с помощью DuplicateHandle. Сокеты - это ХЕНДЛЫ. Их используют чтобы приложению было легче. Гугл шлет ответ на твой айпи и порт который может быть ЛЮБЫМ. Так что либо ты пишешь драйвер который атачит девайс на \Device\Tcp, либо создаешь RAW сокет, ставишь сетевуху в неразбор. режим и слушаешь все пакеты которые идут. Доступа к Ethernet заголовкам тогда нету.
Как я понял ты имеешь в виду во это: New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified) мне выдает вот что: "Предпринятая операция не поддерживается для выбранного типа объекта" Как бы я не менял настройки, практически всегда мне выдает такую фигню
ascas почитай про перехват апи. Очень хорошие статьи с исходниками на delphi и C++ есть на Wasm.ru - автор Ms-rem. В случае с сокетами перехват лучше реализуется в ring0.
Нет я имею ввиду ф-ии socket, bind, accept из ws2_32.dll и winsock.dll Используя какой язык ты будешь из вызывать - не имеет никакого значения, хоть на вашем дурацком делфи. (Ты спросил - я ответил) Куришь (план) ? Для самых ленивых Code: #include <conio.h> #include <stdio.h> #include <winsock2.h> #define MAX_PACKET_SIZE 0x10000 #define SIO_RCVALL 0x98000001 #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 #define TH_ECNECHO 0x40 /* ECN Echo */ #define TH_CWR 0x80 /* ECN Cwnd Reduced */ #define TH_OFF(th) (((th)->th_offx2 & 0xf0) >> 4) #pragma comment( lib, "wsock32.lib" ) char Buffer[MAX_PACKET_SIZE]; typedef struct IPHeader { UCHAR iph_verlen; UCHAR iph_tos; USHORT iph_length; USHORT iph_id; USHORT iph_offset; UCHAR iph_ttl; UCHAR iph_protocol; USHORT iph_xsum; ULONG iph_src; ULONG iph_dest; } IPHeader; struct tcphdr { USHORT th_sport; /* source port */ USHORT th_dport; /* destination port */ ULONG th_seq; /* sequence number */ ULONG th_ack; /* acknowledgement number */ UCHAR th_offx2; /* data offset, rsvd */ UCHAR th_flags; USHORT th_win; /* window */ USHORT th_sum; /* checksum */ USHORT th_urp; /* urgent pointer */ }; char src[10]; char dest[10]; char ds[15]; unsigned short lowbyte; unsigned short hibyte; USHORT Checksum( PUCHAR Data, USHORT Length ) { ULONG sum=0; USHORT sshort=0; PUSHORT wd=(PUSHORT)Data; USHORT wc=Length >> 1; while(wc--) sum+=*wd++; if(Length & 1) sum+=*(PUCHAR)wd; while( sum >> 16 ) sum = (sum & 0xFFFF) + (sum >> 16); return (sum != 0xFFFF) ? ~sum : sum; } void printbuf( char *buf, int len ) { char str[15]; int k = 0; for (int i = 0; i < len; i++) { memset( str, 0, 15 ); sprintf( str, "%x", abs( buf[i] ) ); if (strlen( str ) == 1) { str[1] = str[0]; str[0] = '0'; } printf( "%s ", str ); if (k == 15) { printf( "\n" ); k = 0; } else k++; } } void main() { WSADATA wsadata; SOCKET s; char name[128]; HOSTENT* phe; SOCKADDR_IN sa; IN_ADDR sa1; char ttl[25]; int i; WORD *wd; ULONG summ; unsigned long flag = 1; IPHeader *hdr; tcphdr *thdr; 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)); ioctlsocket( s, SIO_RCVALL, &flag ); int ai = 0; while( !_kbhit() ) { memset( Buffer, 0, MAX_PACKET_SIZE ); int count; count = recv( s, Buffer, sizeof( Buffer ), 0 ); if (count >= sizeof( IPHeader) ) { //summ=0; hdr = (IPHeader*)Buffer; thdr = (tcphdr*)Buffer + sizeof( IPHeader ); //wd=(WORD *)Buffer; //printf( "%u ", hdr->iph_verlen & 0xF); //printf( "0x%X ", ntohs(hdr->iph_xsum)); //hdr->iph_xsum=0; //printf( "0x%X \n", htons(Checksum((PUCHAR)Buffer, (hdr->iph_verlen & 0xF)*4))); if (hdr->iph_protocol == IPPROTO_TCP) { //printf( "%d.\n", ai ); //printbuf( (char*)hdr, count ); //printf( "\n\n" ); printf( "ACK: %d\n", thdr->th_ack ); for (int j = 0; j <= count; j++) printf( "%c", Buffer[j] ); printf( "\r\n" ); ai++; } } } closesocket( s ); WSACleanup(); }
У тебя есть план? Какие же ф-ии SDT ты будешь перехыватывать чтобы слушать траффик?... Скорее всего было написано что можно поставить фильтр, на Tcp ф-ией IoAttachDeviceToDeviceStack в паре с IoGetDeviceObjectPointer или IoAttachDevice