Задать вопрос
@NastyaG

Не работает сниффер на С++, как исправить?

Здравствуйте. Пытаюсь разобраться с написанием сниффера.
Вот мой код:
#include "stdafx.h"
#include <cstdlib>
#include <iostream>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
#include <process.h>
 
#define SIO_RCVALL         0x98000001
using namespace std;
 
 
typedef struct IPHeader
{
    unsigned char  ip_header_len:4;  // 4-bit header length (in 32-bit words) normally=5 (Means 20 Bytes may be 24 also)
    unsigned char  ip_version   :4;  // 4-bit IPv4 version
    unsigned char  ip_tos;           // IP type of service
    unsigned short ip_total_length;  // Total length
    unsigned short ip_id;            // Unique identifier 
    unsigned char  ip_frag_offset   :5;        // Fragment offset field
    unsigned char  ip_more_fragment :1;
    unsigned char  ip_dont_fragment :1;
    unsigned char  ip_reserved_zero :1;
    
    unsigned char  ip_frag_offset1;    //fragment offset
    
    unsigned char  ip_ttl;           // Time to live
    unsigned char  ip_protocol;      // Protocol(TCP,UDP etc)
    unsigned short ip_checksum;      // IP checksum
    unsigned int   ip_srcaddr;       // Source address
    unsigned int   ip_destaddr;      // Source address
};
 
 
int main(int argc, char *argv[])
{
    cout<<"Start...\n";
    WSAData WSData;
    WSAStartup(0x202,&WSData);
    WSADATA     wsadata;  
    SOCKET      s;         
    char        name[128];
    HOSTENT*    phe;      
    SOCKADDR_IN sa;        
    IN_ADDR sa1;        
    unsigned long        flag = 1;  
	//создаем сокет
    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
    ioctlsocket(s, SIO_RCVALL, &flag);
    

    
    while( 1 )
    {
        int count=0;
        char Buffer[1024];
        count = recv( s, Buffer, sizeof(Buffer), 0 );
 
        if( count >= sizeof(IPHeader) )
        {
            IPHeader* hdr = (IPHeader *)Buffer;
      
            sa1.s_addr = hdr->ip_srcaddr;
			cout<<"Src:";
			printf(inet_ntoa(sa1));
			cout<<endl;
			cout<<"Dest:";
			sa1.s_addr = hdr->ip_destaddr;
			printf(inet_ntoa(sa1));
			cout<<endl;
			if(hdr->ip_protocol == IPPROTO_TCP) printf("TCP ");
            if(hdr->ip_protocol == IPPROTO_UDP) printf("UDP ");
 
        }
    }

 
    WSACleanup ();
    system("PAUSE");
    return EXIT_SUCCESS;
}

Вроде ничего сложного не должно быть. В цикле пытаюсь ловить все входящие пакеты и выводить информацию по ним.
Но при запуске получаю следующие ( рис.1).

Подключил Wireshark, там пакеты поступают.

В чем может быть проблема? Помогите, пожалуйста . Заранее спасибо!
ed4882047d06424ab1e59313dc97a283.PNG04b722ae37f54f609d9c99d5c10c1a08.PNG
  • Вопрос задан
  • 643 просмотра
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
Он и не будет полноценным сниффером, перехватить может только исходящие пакеты, запускать его если Windows Vista или новее нужно от имени администратора, Src должен быть вашим локальным IP типа 192.168.x.x, рабочих примеров таких "снифферов" в интернете полно, если вы удосужитесь вычленить из кода характерную конструкцию и воспользоваться Гуглом не забыв отключить в своем мозге опцию "капризность к эстетическому виду результатов поиска и соответствию их языка вашему любимому языку", то вы их найдете.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы