// RawSock.cpp : Defines the entry point for the console application.
//
#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include "stdio.h"
#include "winsock2.h"
#include "ws2tcpip.h" //IP_HDRINCL is here
#include "conio.h"
#pragma comment(lib,"ws2_32.lib") //winsock 2.2 library
#define ADDR_SRC "0.0.0.0"
#define ADDR_DST "0.0.0.0"
typedef unsigned char UInt8;
typedef unsigned short UInt16;
typedef unsigned int UInt32;
typedef struct ip_hdr
{
unsigned char iphVerLen;
unsigned char ip_tos;
unsigned short ip_total_length;
unsigned short ip_id;
unsigned short ipFlags;
unsigned char ipTTL; // Time to live
unsigned char ip_protocol; // Protocol(TCP,UDP etc)
unsigned short ipCheckSum; // IP checksum
unsigned int ipSrc;
unsigned int ipDst;
UInt8 ipRouterAlert;
UInt8 ipRouterLength;
UInt16 ipRouterCode;
} IPHeader;
// TCP header
typedef struct tcp_header
{
UInt8 igmpVerType;
UInt8 igmpNv;//Zero is OK
UInt16 igmpCheckSum;
UInt32 igmpAddr;
} IGMPHeader;
UInt8 igmp_body[] = {
0x03,0x00,0x00,0x00,0xef,0x76,0x00,0x00,
0x03,0x00,0x00,0x00,0xef,0x7e,0x77,0x00,
0x03,0x00,0x00,0x00,0xef,0x7e,0x63,0x73,
0x03,0x00,0x00,0x00,0xef,0x7e,0x6c,0x70,
};
UInt16 CheckSum(UInt8 *pBuf,UInt32 uLen)
{
UInt32 uCheckSum = 0,uLoop = 0;
for(;uLoop < uLen;uLoop++)
{
if(0 == uLoop%2){
uCheckSum += pBuf[uLoop]<<8;
}
else{
uCheckSum += pBuf[uLoop];
}
}
uCheckSum = (uCheckSum>>16)+(uCheckSum&0x0000FFFF);
return (UInt16)(~uCheckSum);
}
void print_log(UInt8 *p,int len)
{
int i = 0 ;
for(;i<len;i++)
{
printf("%02X ",p[i]);
if(15==i%16)
printf("\n");
}
printf("\n");
}
int main()
{
char host[100], buf[1000], *data = NULL;
SOCKET s;
int k = 1;
IPHeader *pIPHeader = NULL;
IGMPHeader *pIgmpHeader = NULL;
SOCKADDR_IN dest;
//Initialise Winsock
WSADATA wsock;
printf("\nInitialising Winsock...");
if (WSAStartup(MAKEWORD(2, 2), &wsock) != 0)
{
fprintf(stderr, "WSAStartup() failed");
exit(EXIT_FAILURE);
}
printf("Initialised successfully.");
//Create Raw TCP Packet
printf("\nCreating Raw IGMP Socket...");
if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)) == SOCKET_ERROR)
{
printf("Creation of raw socket failed.");
return 0;
}
printf("Raw TCP Socket Created successfully.");
//Put Socket in RAW Mode.
printf("\nSetting the socket in RAW mode...");
int optval = 1;
if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&optval, sizeof(optval)) == SOCKET_ERROR)
{
printf("failed to set socket in raw mode.");
return 0;
}
printf("Successful.");
dest.sin_family = AF_INET;
dest.sin_port = htons(0x0000); //your destination port
dest.sin_addr.s_addr = inet_addr(ADDR_DST);
// memcpy(&dest.sin_addr.s_addr, server->h_addr, server->h_length);
printf("Resolved.");
/
pIPHeader = (IPHeader *)buf; //lets point to the ip header portion
pIPHeader->iphVerLen = 0x46;
pIPHeader->ip_tos = 0xc0;
pIPHeader->ip_total_length = htons(sizeof(IPHeader) + sizeof(IGMPHeader) + sizeof(igmp_body));
pIPHeader->ip_id = htons(0x0023);
pIPHeader->ipFlags = htons(0x4000);
pIPHeader->ipTTL = 1;
pIPHeader->ip_protocol = IPPROTO_IGMP;
pIPHeader->ipCheckSum = 1234;
pIPHeader->ipSrc = inet_addr(ADDR_SRC);
pIPHeader->ipDst = inet_addr(ADDR_DST);
pIPHeader->ipRouterAlert = 0x94;
pIPHeader->ipRouterLength = 0x04;
pIPHeader->ipRouterCode = htons(0x0000);
pIgmpHeader = (IGMPHeader *)&buf[sizeof(IPHeader)]; //get the pointer to the tcp header in the packet
pIgmpHeader->igmpVerType = 0x22;
pIgmpHeader->igmpNv = 0x00;
pIgmpHeader->igmpCheckSum = htons(0x0000);
pIgmpHeader->igmpAddr = htonl(sizeof(igmp_body)/8);
// Initialize the TCP payload to some rubbish
data = &buf[sizeof(IPHeader) + sizeof(IGMPHeader)];
memcpy(data,igmp_body,sizeof(igmp_body));
printf("\nSending packet...\n");
pIgmpHeader->igmpCheckSum = htons( CheckSum((UInt8*)pIgmpHeader,sizeof(IGMPHeader) + sizeof(igmp_body)) );
while (!_kbhit())
{
Sleep(1000);
pIPHeader->ipCheckSum = htons(0x0000);
pIPHeader->ipCheckSum = htons( CheckSum((UInt8*)pIPHeader,sizeof(IPHeader)) );
printf(" %d packets send\n", k++);
print_log((UInt8*)buf,sizeof(IPHeader) + sizeof(IGMPHeader) + sizeof(igmp_body));
int err = (sendto(s, buf, sizeof(IPHeader) + sizeof(IGMPHeader) + sizeof(igmp_body), 0,
(SOCKADDR *)&dest, sizeof(dest)));
if ( err == SOCKET_ERROR)
{
printf("Error sending Packet : %d", WSAGetLastError());
break;
}
printf("Error sending Packet : %d", WSAGetLastError());
}
return 0;
}
Win Socket-Raw
最新推荐文章于 2024-07-24 10:57:17 发布