Re: sniff
От: MrFlash  
Дата: 14.10.03 21:44
Оценка:
Здравствуйте, matros, Вы писали:

M>что я делаю не так???


M>ловит пакеты приходящие

M>только ко мне
На то он и RECVALL, чтобы ловить приходящие пакеты.
Чтобы ловить все пакеты надо писать фильтр-драйвер TDI или NDIS.
В NTDDK эти уровни хорошо описаны.

M>только репли на пинг

Чтобы ловились нормально все пакеты, нужен большой буффер,
а не однобайтовый (Note that you must supply a sufficiently large buffer)
Иначе даже пинги приходят с длиной -1 .
Кстати, а зачем один байт выделять в куче???
я 64K на стеке выделил и даже не задумался, еще бессмыслена строка
hdr = new IPHeader, судя по коду значение все равно потеряется.

Еще нужно выбрать тот интерфейс, который хочется прослушивать,
например INADDR_ANY заменить на *(unsigned long *) gethostbyname(NULL)->h_addr
The socket also must be bound to an explicit local interface, which means that you cannot bind to INADDR_ANY.

А вообще повнимательней читайте документацию. Ниже приведен код, ловящий приходящие IP-датаграммы (DevStudio.NET 2003).


#include <stdio.h>
#include <winsock2.h>
#include <mstcpip.h>

void main(int argc, char* argv[])
{  
  SOCKET s;

  do
  {
    WSADATA d;
    if (WSAStartup(0x0101, &d))
    {
      puts("Could not find a usable version of Windows Sockets");
      break;
    }

    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    if (s == SOCKET_ERROR)
      break;

    hostent *he = gethostbyname(NULL);
    if (!he)
      break;

    sockaddr_in addr;
    memset(&addr, 0, sizeof(addr));
    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = *(unsigned long *) he->h_addr;
    if (bind(s, (sockaddr *) &addr, sizeof(addr)) == SOCKET_ERROR)
    {
      puts("Failed to bind socket");
      break;
    }

    unsigned long argp;
    if (ioctlsocket(s, SIO_RCVALL, &argp) == SOCKET_ERROR)
    {
      puts("Failed to change I/O mode");
      break;
    }

    char buf[65536];
    while (1)
    {
      int count = recv(s, buf, sizeof(buf), 0);
      if (count == SOCKET_ERROR)
        break;

      for (int i = 0; i < count; i++)
        putchar(buf[i] >= ' ' ? buf[i] : ' ');

      putchar('\n');
      putchar('\n');
    }    
  }
  while (0);

  if (s != SOCKET_ERROR)
    closesocket(s);

  WSACleanup();
}




M>
M>int main(int argc, char* argv[])
M>{
M>    char *Buffer = new char; 
M>    SOCKET      Sock;
M>    HOSTENT*    hostinfo;       
M>    SOCKADDR_IN Addr;
M>    SOCKADDR_IN rAddr;
M>    long        flag = 1;  
M>  WSADATA WSAData;
M>  if(WSAStartup(0x0101,&WSAData)) 
M>  {
M>   cout << "cannot init WSADATA\n";
M>   _getch();
M>   exit(0);
M>  }
M>  if ( (Sock = WSASocket (AF_INET,    SOCK_RAW,    IPPROTO_IP,    NULL, 0,0)) == SOCKET_ERROR)
M>  {
M>      cout << "cocket errror\n";
M>  }
M>  ZeroMemory( &Addr, sizeof(Addr) );
M>  Addr.sin_family = AF_INET;
M>  Addr.sin_addr.s_addr = INADDR_ANY;
M>  bind(Sock, (SOCKADDR *)&Addr, sizeof(SOCKADDR));
M>  ioctlsocket(Sock, SIO_RCVALL, (unsigned long*)&flag);
M>  IPHeader* hdr = new IPHeader;
M>  while( !_kbhit() )
M>  {
M>    int count;
M>    count = recv( Sock, Buffer, sizeof(Buffer), 0 );

M>    if( count >= sizeof(IPHeader) )
M>    {
M>       hdr = (IPHeader *)Buffer;
M>.....
M>    }
    
M>  }
M>  closesocket( Sock );
M>  WSACleanup();
M>return 0;
M>}
M>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.