Прослушивание 80 порта

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ascas, 1 Mar 2006.

  1. ascas

    ascas Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Как можно настроить сокет на прослушку 80 порта? когда я его настрайваю мне пишет что одним портом может пользоваться только одна прога. Но проблема в том что когда я соеденяюсь с гугл, он присылает ответ на 80 порт, хотя мой сокет работает на 181.
     
  2. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Тебе нужно воспользоватся снифером. (например ethereal)
    http://www.ethereal.com/

    А открывать сокет на один и тот же порт нельзя (имхо)
    Иначе как программа определит что это её пакет? :]
     
  3. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    да
    нет
     
  4. ascas

    ascas Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    А куда он отправляет ответ? Через тот же самый сокет который я открываю мне назад ничего не приходит :confused:
     
  5. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    КАК МОЖНО ОТПРАВЛЯТЬ ОТВЕТ ЧЕРЕЗ СОКЕТ???
    Можно отправлять IP пакет с TCP фреймом, в котором есть
    SrcIP
    DstIP
    SrcPORT
    DstPORT

    В винде хендл - это индекс в таблицах которые храняться в ядре. Хендлы можно копировать из одного процесса в другой, с помощью DuplicateHandle. Сокеты - это ХЕНДЛЫ. Их используют чтобы приложению было легче.
    Гугл шлет ответ на твой айпи и порт который может быть ЛЮБЫМ.
    Так что либо ты пишешь драйвер который атачит девайс на \Device\Tcp,
    либо создаешь RAW сокет, ставишь сетевуху в неразбор. режим и слушаешь все пакеты которые идут. Доступа к Ethernet заголовкам тогда нету.
     
  6. F1reF0x

    F1reF0x Elder - Старейшина

    Joined:
    13 Nov 2004
    Messages:
    14
    Likes Received:
    9
    Reputations:
    10
    Вот так вот слушаешь 80 порт
     
    1 person likes this.
  7. ascas

    ascas Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Как я понял ты имеешь в виду во это:
    New Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Unspecified)
    мне выдает вот что:

    "Предпринятая операция не поддерживается для выбранного типа объекта"

    Как бы я не менял настройки, практически всегда мне выдает такую фигню
     
  8. ascas

    ascas Elder - Старейшина

    Joined:
    19 Jan 2006
    Messages:
    56
    Likes Received:
    4
    Reputations:
    2
    Спасибо конечно, в будущем пригодиться, но я не на delphi счас пишу :)
     
  9. drmist

    drmist Member

    Joined:
    8 Oct 2005
    Messages:
    307
    Likes Received:
    94
    Reputations:
    80
    ascas
    почитай про перехват апи.
    Очень хорошие статьи с исходниками на delphi и C++ есть на Wasm.ru - автор Ms-rem.
    В случае с сокетами перехват лучше реализуется в ring0.
     
  10. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    Нет я имею ввиду ф-ии 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();
    }
    
     
    #10 KEZ, 9 Mar 2006
    Last edited: 9 Mar 2006
  11. drmist

    drmist Member

    Joined:
    8 Oct 2005
    Messages:
    307
    Likes Received:
    94
    Reputations:
    80
  12. KEZ

    KEZ Ненасытный школьник

    Joined:
    18 May 2005
    Messages:
    1,604
    Likes Received:
    754
    Reputations:
    397
    У тебя есть план? Какие же ф-ии SDT ты будешь перехыватывать чтобы слушать траффик?... Скорее всего было написано что можно поставить фильтр, на Tcp ф-ией IoAttachDeviceToDeviceStack в паре с IoGetDeviceObjectPointer или IoAttachDevice
     
    #12 KEZ, 10 Mar 2006
    Last edited: 10 Mar 2006
    1 person likes this.