Снифер

Тема в разделе "WASM.NETWORKS", создана пользователем spa, 17 окт 2008.

  1. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Код (Text):
    1. #define MAX_PACKET_SIZE 65525
    2. #define BIND2IP "10.20.3.119"  //Put you'r IP in her
    3.  
    4. #include <stdio.h>
    5. #include <winsock2.h>
    6. #include <mstcpip.h>
    7. #include <ws2tcpip.h>
    8.  
    9. typedef struct iphdr
    10. {
    11.     unsigned char VerIHL; //Version and IP Header Length
    12.     unsigned char Tos;
    13.     unsigned short Total_len;
    14.     unsigned short ID;
    15.     unsigned short Flags_and_Frags; //Flags 3 bits and Fragment offset 13 bits
    16.     unsigned char TTL;
    17.     unsigned char Protocol;
    18.     unsigned short Checksum;
    19.     unsigned long SrcIP;
    20.     unsigned long DstIP;
    21.     //unsigned long Options_and_Padding;
    22. } IpHeader;
    23.  
    24. typedef struct port
    25. {
    26.     unsigned short SrcPort;
    27.     unsigned short DstPort;
    28. } TcpUdpPort;
    29.  
    30. void ProcessPacket(char* Buffer, int Size)
    31. {
    32.     IpHeader *iphdr;
    33.     TcpUdpPort *port;
    34.     struct sockaddr_in SockAddr;
    35.     unsigned short iphdrlen;
    36.     char C;
    37.  
    38.     iphdr = (IpHeader *)Buffer;
    39.  
    40.     iphdrlen = (iphdr->VerIHL << 4);
    41.     memcpy(&C, &iphdrlen, 1);
    42.     iphdrlen = (C >> 4) * 4; //20
    43.  
    44.  
    45.     memset(&SockAddr, 0, sizeof(SockAddr));
    46.     SockAddr.sin_addr.s_addr = iphdr->SrcIP;
    47.     printf("Packet From: %s ", inet_ntoa(SockAddr.sin_addr));
    48.     memset(&SockAddr, 0, sizeof(SockAddr));
    49.     SockAddr.sin_addr.s_addr = iphdr->DstIP;
    50.     printf("To: %s ", inet_ntoa(SockAddr.sin_addr));
    51.  
    52.     switch (iphdr->Protocol)
    53.     {
    54.     case 1:
    55.         printf("Protocol: ICMP ");
    56.         break;
    57.     case 2:
    58.         printf("Protocol: IGMP ");
    59.         break;
    60.     case 6:
    61.         printf("Protocol: TCP ");
    62.         if (Size > iphdrlen)
    63.         {
    64.             port = (TcpUdpPort *)(Buffer + iphdrlen);
    65.             printf("From Port: %i To Port: %i ", ntohs(port->SrcPort), ntohs(port->DstPort));
    66.         }
    67.         break;
    68.     case 17:
    69.         printf("Protocol: UDP ");
    70.         if (Size > iphdrlen)
    71.         {
    72.             port = (TcpUdpPort *)(Buffer + iphdrlen);
    73.             printf("From Port: %i To Port: %i ", ntohs(port->SrcPort), ntohs(port->DstPort));
    74.         }
    75.         break;
    76.     default:
    77.         printf("Protocol: %i ", iphdr->Protocol);
    78.     }
    79.  
    80.     printf("\n");
    81. }
    82.  
    83. void StartSniffing(SOCKET Sock)
    84. {
    85.     char *RecvBuffer = (char *)malloc(MAX_PACKET_SIZE + 1);
    86.     int BytesRecv, FromLen;
    87.     struct sockaddr_in From;
    88.  
    89.     if (RecvBuffer == NULL)
    90.     {
    91.         printf("malloc() failed.\n");
    92.         exit(-1);
    93.     }
    94.  
    95.     FromLen = sizeof(From);
    96.  
    97.     do
    98.     {
    99.         memset(RecvBuffer, 0, MAX_PACKET_SIZE + 1);
    100.         memset(&From, 0, sizeof(From));
    101.  
    102.         BytesRecv = recvfrom(Sock, RecvBuffer, MAX_PACKET_SIZE, 0, (sockaddr *)&From, &FromLen);
    103.        
    104.         if (BytesRecv > 0)
    105.         {
    106.             ProcessPacket(RecvBuffer, BytesRecv);
    107.         }
    108.         else
    109.         {
    110.             printf( "recvfrom() failed.\n");
    111.         }
    112.  
    113.     } while (BytesRecv > 0);
    114.  
    115.  
    116.     free(RecvBuffer);
    117. }
    118.  
    119. int main()
    120. {
    121.     WSAData wsaData;
    122.     SOCKET Sock;
    123.     struct sockaddr_in SockAddr;
    124.     DWORD BytesReturned;
    125.     int I = 1;
    126.  
    127.     try
    128.     {
    129.  
    130.         if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
    131.         {
    132.             printf("WSAStartup() failed.\n");
    133.             exit(-1);
    134.         }
    135.  
    136.         Sock = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
    137.  
    138.         if (Sock == INVALID_SOCKET)
    139.         {
    140.             printf("socket() failed.\n");
    141.             exit(-1);
    142.         }
    143.  
    144.         memset(&SockAddr, 0, sizeof(SockAddr));
    145.         SockAddr.sin_addr.s_addr = inet_addr(BIND2IP);
    146.         SockAddr.sin_family = AF_INET;
    147.         SockAddr.sin_port = 0;
    148.  
    149.         if (bind(Sock, (sockaddr *)&SockAddr, sizeof(SockAddr)) == SOCKET_ERROR)
    150.         {
    151.             printf("bind(%s) failed.\n", BIND2IP);
    152.             exit(-1);
    153.         }
    154.  
    155.         if (WSAIoctl(Sock, SIO_RCVALL, &I, sizeof(I), NULL, NULL, &BytesReturned, NULL, NULL) == SOCKET_ERROR)
    156.         {
    157.             printf("WSAIoctl() failed.\n");
    158.             exit(-1);
    159.         }
    160.  
    161.         StartSniffing(Sock);
    162.     }
    163.     catch (...)
    164.     {
    165.         printf("CRASH\n");
    166.     }
    167.  
    168.     closesocket(Sock);
    169.     WSACleanup();
    170.  
    171.     return 0;
    172. }
    Пробовал вот так, но(!) если ip впн интерфейса отлавливаю только ваходящие, как с этим справиться?

    PS код не мой, но я прочитал его несколько раз. И почти уверен что это не ошибка в программе а именно какое то ограничение.
     
  2. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    PS ща пробую INADDR_ANY
     
  3. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    если поставить SockAddr.sin_addr.s_addr = INADDR_ANY;//inet_addr(BIND2IP);
    то WSAIoctl возвращает ошибку, если использовать ioctlsocket то проходят редкие пакеты с протоколом 47.
     
  4. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Одним словом чуть чуть начал разбираться. Встал вопрос выбора на что сделать упор. Мне как я уже говорил нужно просто отслеживание трафика (без его изменения). Как я понял для этого мс рекомендует NDIS Intermediate Driver, какие еще есть варианты? какой пример из ддк лучше изучить? (можно даже так "какому примеру следует придать больше внимания"). И если не сложно то какой пример к какой технологии относиться. Одним словом необходимо снова выбрать куда идти дальше. Желательна аргументация советов, но буду благодарен за все.
     
  5. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    http://www.wasm.ru/article.php?article=netfilter
    ЗЫ гугл рулит .. следующие слова были удалены модератором, во избежании флейма. Предупреждение
     
  6. mansurv

    mansurv New Member

    Публикаций:
    0
    Регистрация:
    19 авг 2009
    Сообщения:
    38
    Для просто перехвата подойдёт Ndis Protocol Driver, пример DDK-WDK ndisuio или ndisprot, как модифицировать - тут:http://ndis.com.
     
  7. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Нырыл в процессе изучения , но вот что мне не понятно откуда берутся ошибки:
    Ошибка 1 error C2061: syntax error : identifier 'IPAddr' c:\winddk\7600.16385.0\inc\ddk\pfhook.h 44
    и главное что с ними делать. Я бы уже и забил на этот пример, но мне прям интересно стало что за фигня )
    И так уже не могу заснуть, пробовал всяко на ошибку глянуть, но пока безуспешно.


    Код (Text):
    1. extern "C" {
    2. #include <ntddk.h>
    3. #include <pfhook.h>
    4. };
    5.  
    6.  
    7.  
    8. void spSniffUnload(IN PDRIVER_OBJECT DriverObject);
    9.  
    10. #ifdef __cplusplus
    11. extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath);
    12. #endif
    13.  
    14. TCHAR drvsmbl[]=TEXT("\\Device\\IPFILTERDRIVER");
    15.  
    16. NTSTATUS Status=STATUS_SUCCESS;
    17. PFILE_OBJECT fileobject=NULL;
    18. PDEVICE_OBJECT devobject=NULL;
    19.  
    20. PF_SET_EXTENSION_HOOK_INFO hook_info;
    21. IO_STATUS_BLOCK isb;
    22. PIRP myirp=NULL;
    23.  
    24.  
    25. VOID Unload(IN PDRIVER_OBJECT DriverObject);
    26. PF_FORWARD_ACTION hook_fn(IN unsigned char  *PacketHeader,IN unsigned char  *Packet,
    27.                           IN unsigned int  PacketLength,  IN unsigned int  RecvInterfaceIndex,
    28.                           IN unsigned int  SendInterfaceIndex, IN IPAddr  RecvLinkNextHop,
    29.                           IN IPAddr  SendLinkNextHop};
    30. NTSTATUS Set_Hook(PacketFilterExtensionPtr hook_fn);
    31. //===================================================================================
    32.  
    33.  
    34. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING  RegistryPath)
    35. {
    36.    
    37.     DbgPrint("DriverEntry()\n");
    38.  
    39.     Status=Set_Hook(hook_fn);
    40.  
    41.     if(Status!=STATUS_SUCCESS)
    42.         return Status;
    43.  
    44.     DriverObject->DriverUnload=Unload;
    45.  
    46.     return Status;
    47. }
    48. //===================================================================================
    49. VOID Unload(IN PDRIVER_OBJECT DriverObject)
    50. {
    51.     Set_Hook(0);
    52. }
    53. //===================================================================================
    54. NTSTATUS Set_Hook(PacketFilterExtensionPtr hook_fn)
    55. {
    56.     NTSTATUS status=IoGetDeviceObjectPointer(drvsmbl,STANDART_RIGHTS_ALL, &fileopject,&devobject);
    57.  
    58.     if(status!=STATUS_SUCCESS)
    59.         return status;
    60.  
    61.     hook_info.ExtensionPointer=hook_fn;
    62.  
    63.     myirp=IoBuildDeviceIoControlRequest(IOCTL_PF_SET_EXTENSION_POINTER,devobject,&hook_info,
    64.         sizeof(hook_info),NULL,0,FALSE,NULL,&isb);
    65.  
    66.     status=IoCallDriver(devobject,myirp);
    67.  
    68.     return status;
    69. }
    70. //===================================================================================
    71. PF_FORWARD_ACTION hook_fn(IN unsigned char  *PacketHeader,IN unsigned char  *Packet,
    72.                           IN unsigned int  PacketLength,  IN unsigned int  RecvInterfaceIndex,
    73.                           IN unsigned int  SendInterfaceIndex, IN IPAddr  RecvLinkNextHop,
    74.                           IN IPAddr  SendLinkNextHop}
    75.  
    76. {
    77.     return PF_DROP;
    78. }
    79. //===================================================================================
     
  8. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    Может я не о том, но в этом варианте можно снимать с Afd, посредством перехвата NtDeviceIoControlFile из ntdll.dll
     
  9. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    а где же
    ?
     
  10. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    пардон, не о том подумал
    кстати есть ключ /TC
     
  11. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Короче я индус ((
    pfhook.h копипастнул себе и заменил IPAddr на ULONG
     
  12. Shadovv13

    Shadovv13 Андрей

    Публикаций:
    0
    Регистрация:
    27 июл 2008
    Сообщения:
    65
    Адрес:
    Украина
    А WinPCAP c VPN РАБОТАЕТ НА УРА!!!!!!
     
  13. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Shadovv13
    может последние версии начали, надо глянут.
     
  14. Shadovv13

    Shadovv13 Андрей

    Публикаций:
    0
    Регистрация:
    27 июл 2008
    Сообщения:
    65
    Адрес:
    Украина
    Стоп!! WinPCAP работает с NDIS и значит, все чем рулит NDIS доступно и WinPCAP.
    Ну протокол VPN как уж своими силами разбирать!
     
  15. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    Shadovv13
    те все-таки не работает с впн :derisive:
     
  16. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Что ты понимаешь под словом "работает". Для расшифровки пакетов нужен ключ. Ключ для исходящих пакетов известен только на сервере. Т.е. ловить нужно выше, до использования ВПН при посылке или после расшифровки на приеме.
    ВПН и был сделан для того, чтобы сниффер не мог смотреть трафик.
     
  17. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    valterg
    но коментс, ведь мы на текущей машине хотим сниферить. А это значит что как минимум можно перехватить send/recv мы же говорим не про сниферинг в лок сети. И впн не для этого был создан. Для чего у него в названии "виртуальная частная сеть"
     
  18. Shadovv13

    Shadovv13 Андрей

    Публикаций:
    0
    Регистрация:
    27 июл 2008
    Сообщения:
    65
    Адрес:
    Украина
    ОПА! Так тебе не снифер нужен а ХУК на send/recv. Но ВПН? Незнаю-незнаю, скорей всиво send/recv работают с RAW сокетами, и оправляют\принимают зашыврованые пакеты!!!
     
  19. spa

    spa Active Member

    Публикаций:
    0
    Регистрация:
    9 мар 2005
    Сообщения:
    2.240
    лолшто? ладно забей