Thread: Winsock RAW ICMP PING PROBLEM

  1. #1
    Registered User
    Join Date
    Jul 2011
    Posts
    1

    Winsock RAW ICMP PING PROBLEM

    Hi guys here is my problem.I am trying to send ICMP packets to a HOST using WINSOK.So here is my code:

    Code:
    #define WIN32_LEAN_AND_MEAN
        #include <winsock2.h>
        #include <ws2tcpip.h>
        #include <stdio.h>
        #include <stdlib.h>
         
        #define IP_RECORD_ROUTE 0x7
        //
        // IP header structure
        //
        typedef struct _iphdr
        {
        unsigned int h_len:4; // Length of the header
        unsigned int version:4; // Version of IP
        unsigned char tos; // Type of service
        unsigned short total_len; // Total length of the packet
        unsigned short ident; // Unique identifier
        unsigned short frag_and_flags; // Flags
        unsigned char ttl; // Time to live
        unsigned char proto; // Protocol (TCP, UDP, etc.)
        unsigned short checksum; // IP checksum
         
        unsigned int sourceIP;
        unsigned int destIP;
        } IpHeader;
         
        #define ICMP_ECHO 8
        #define ICMP_ECHOREPLY 0
        #define ICMP_MIN 8 // Minimum 8-byte ICMP packet (header)
         
        //
        // ICMP header structure
        //
        typedef struct _icmphdr
        {
        BYTE i_type;
        BYTE i_code; // Type sub code
        USHORT i_cksum;
        USHORT i_id;
        USHORT i_seq;
        // This is not the standard header, but we reserve space for time
        ULONG timestamp;
        } IcmpHeader;
         
        //
        // IP option header--use with socket option IP_OPTIONS
        //
        typedef struct _ipoptionhdr
        {
        unsigned char code; // Option type
        unsigned char len; // Length of option hdr
        unsigned char ptr; // Offset into options
        unsigned long addr[9]; // List of IP addrs
        } IpOptionHeader;
         
        #define DEF_PACKET_SIZE 32 // Default packet size
        #define MAX_PACKET 1024 // Max ICMP packet size
        #define MAX_IP_HDR_SIZE 60 // Max IP header size w/options
         
        BOOL bRecordRoute;
        int datasize;
        char *lpdest;
         
        void FillICMPData(char *icmp_data, int datasize)
        {
        IcmpHeader *icmp_hdr = NULL;
        char *datapart = NULL;
         
        icmp_hdr = (IcmpHeader*)icmp_data;
        icmp_hdr->i_type = ICMP_ECHO; // Request an ICMP echo
        icmp_hdr->i_code = 0;
        icmp_hdr->i_id = (USHORT)GetCurrentProcessId();
        icmp_hdr->i_cksum = 0;
        icmp_hdr->i_seq = 0;
         
        datapart = icmp_data + sizeof(IcmpHeader);
        //
        // Place some junk in the buffer
        //
        memset(datapart,'I', datasize - sizeof(IcmpHeader));
        }
         
         
        USHORT checksum(USHORT *buffer, int size)
        {
        unsigned long cksum=0;
         
        while (size > 1)
        {
        cksum += *buffer++;
        size -= sizeof(USHORT);
        }
        if (size)
        {
        cksum += *(UCHAR*)buffer;
        }
        cksum = (cksum >> 16) + (cksum & 0xffff);
        cksum += (cksum >>16);
        return (USHORT)(~cksum);
        }
         
        int main()
        {
         
        WSADATA wsaData;
        SOCKET sockRaw = INVALID_SOCKET;
        struct sockaddr_in dest,from;
        int bread,
        fromlen = sizeof(from),
        timeout = 1000,
        ret;
        char *icmp_data = "AAAA",
        *recvbuf = NULL;
        unsigned int addr = 0;
        USHORT seq_no = 0;
        struct hostent *hp = NULL;
        IpOptionHeader ipopt;
         
         
        if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
        {
        printf("WSAStartup() failed: %d\n", GetLastError());
        return -1;
        }
         
         
        sockRaw = WSASocket (AF_INET, SOCK_RAW, IPPROTO_ICMP, NULL, 0,WSA_FLAG_OVERLAPPED);
        if (sockRaw == INVALID_SOCKET)
        {
        printf("WSASocket() failed: %d\n", WSAGetLastError());
        return -1;
        }
        if (bRecordRoute)
        {
        // Setup the IP option header to go out on every ICMP packet
        //
        ZeroMemory(&ipopt, sizeof(ipopt));
        ipopt.code = IP_RECORD_ROUTE; // Record route option
        ipopt.ptr = 4; // Point to the first addr offset
        ipopt.len = 39; // Length of option header
         
        ret = setsockopt(sockRaw, IPPROTO_IP, IP_OPTIONS, (char *)&ipopt, sizeof(ipopt));
        if (ret == SOCKET_ERROR)
        {
        printf("setsockopt(IP_OPTIONS) failed: %d\n", WSAGetLastError());
        }
        }
        // Set the send/recv timeout values
        //
        bread = setsockopt(sockRaw, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
        if(bread == SOCKET_ERROR)
        {
        printf("setsockopt(SO_RCVTIMEO) failed: %d\n", WSAGetLastError());
        return -1;
        }
        timeout = 1000;
        bread = setsockopt(sockRaw, SOL_SOCKET, SO_SNDTIMEO, (char*)&timeout, sizeof(timeout));
        if (bread == SOCKET_ERROR)
        {
        printf("setsockopt(SO_SNDTIMEO) failed: %d\n", WSAGetLastError());
        return -1;
        }
        memset(&dest, 0, sizeof(dest));
        //
        // Resolve the endpoint's name if necessary
        //
        char *lpdest = "192.168.157.128";
        dest.sin_family = AF_INET;
        if ((dest.sin_addr.s_addr = inet_addr(lpdest)) == INADDR_NONE)
        {
        if ((hp = gethostbyname(lpdest)) != NULL)
        {
        memcpy(&(dest.sin_addr), hp->h_addr, hp->h_length);
        dest.sin_family = hp->h_addrtype;
        printf("dest.sin_addr = %s\n", inet_ntoa(dest.sin_addr));
        }
        else
        {
        printf("gethostbyname() failed: %d\n",
        WSAGetLastError());
        return -1;
        }
        }
         
        //
        // Create the ICMP packet
        //
        datasize += sizeof(IcmpHeader);
         
        icmp_data = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,MAX_PACKET);
        if (!icmp_data)
        {
        printf("HeapAlloc() failed: %d\n", GetLastError());
        return -1;
        }
        memset(icmp_data,0,MAX_PACKET);
        FillICMPData(icmp_data,datasize);
        //
        // Start sending/receiving ICMP packets
        //
        while(1)
        {
        static int nCount = 0;
        int bwrote;
         
        if (nCount++ == 1)
        break;
         
        ((IcmpHeader*)icmp_data)->i_cksum = 0;
        ((IcmpHeader*)icmp_data)->timestamp = GetTickCount();
        ((IcmpHeader*)icmp_data)->i_seq = seq_no++;
        ((IcmpHeader*)icmp_data)->i_cksum = checksum((USHORT*)icmp_data, datasize);
         
        bwrote = sendto(sockRaw, icmp_data, datasize, 0, (struct sockaddr*)&dest, sizeof(dest));
        if (bwrote == SOCKET_ERROR)
        {
        if (WSAGetLastError() == WSAETIMEDOUT)
        {
        printf("timed out\n");
        continue;
        }
        printf("sendto() failed: %d\n", WSAGetLastError());
        return -1;
        }
        if (bwrote < datasize)
        {
        printf("Wrote %d bytes\n", bwrote);
        }
         
        Sleep(1000);
        }
        // Cleanup
        //
        if (sockRaw != INVALID_SOCKET)
        closesocket(sockRaw);
        HeapFree(GetProcessHeap(), 0, recvbuf);
        HeapFree(GetProcessHeap(), 0, icmp_data);
         
        WSACleanup();
        return 0;
        }
    If you see the sniffed traffic (a screen shot i have attached)you can see that the program is also sending some trailer (some 00 s)with the ICMP packet.
    Can anyone please tell me what changes i should made to the code to remove the trailer part of the packet??And send my desired data(payload) with the ICMP packet.
    Attached Images Attached Images Winsock RAW ICMP PING PROBLEM-trlr-jpg 

  2. #2
    and the Hat of Guessing tabstop's Avatar
    Join Date
    Nov 2007
    Posts
    14,336
    Where do you set datasize?

  3. #3
    and the hat of int overfl Salem's Avatar
    Join Date
    Aug 2001
    Location
    The edge of the known universe
    Posts
    39,660
    I'm assuming from the complete lack of indentation that this is just copy and paste code
    Perhaps you should click the "contact me" at the bottom of the page, if that is indeed where you copied this from.
    If you dance barefoot on the broken glass of undefined behaviour, you've got to expect the occasional cut.
    If at first you don't succeed, try writing your phone number on the exam paper.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. ICMP ping network without specifying destination hosts
    By Yehuda in forum Networking/Device Communication
    Replies: 3
    Last Post: 04-27-2011, 05:48 PM
  2. IPv6 ping in windows...problem..lots of ode:(
    By Neill KElly in forum C Programming
    Replies: 3
    Last Post: 04-27-2009, 11:50 PM
  3. Ping problem
    By bladerunner627 in forum C++ Programming
    Replies: 12
    Last Post: 02-02-2005, 12:54 PM
  4. Ipv6 ping problem
    By Sang-drax in forum Tech Board
    Replies: 3
    Last Post: 05-14-2004, 04:30 PM
  5. Ping problem
    By patricksky in forum Tech Board
    Replies: 1
    Last Post: 09-02-2002, 07:42 PM

Tags for this Thread