僞造IP發送數據(UDP)

 

#include <iostream>
#include <winsock2.h>
#include <cstdio>
#include <windows.h>
#include <WS2tcpip.h>
#include "protoinfo.h"
#pragma comment (lib,"ws2_32.lib")
using namespace std;
#define SOURCEPORT 65432
#define DESTPORT   65431
USHORT CheckSum(PUSHORT buf,int size)
{
  ULONG  sum=0;
  while(size>1)
  {
    sum+=*buf;
	buf++;
	size-=2;
  }
  if(size)
	  sum+=*(char *)buf;
  sum=(sum>>16)+(sum&0xffff);
  sum+=sum>>16;
  return (~sum);
 
}
 
int main()
{
	char szDestIp[]="119.75.218.70";
    char szSourceIp[]="192.168.1.102";
	char szMsg[]="Hello ,Can you receive my message!";
	int  msgLen=sizeof(szMsg);
	int ret;
	WSADATA wsaData;
	if(WSAStartup(MAKEWORD(2,2),&wsaData)!=0)
	{
	  return -1;
	}
	SOCKET sockRaw;
	sockRaw=socket(AF_INET,SOCK_RAW,IPPROTO_RAW);
	int h_incl=1;
	ret=setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&h_incl,sizeof(h_incl));
	//創建並填充IP首部
	char buf[1024]={0};
	IPHeader  *pIpHead=(IPHeader *)buf;
	pIpHead->iphVerLen=4<<4|(sizeof(IPHeader)/sizeof(ULONG));
	pIpHead->ipLength=htons(sizeof(IPHeader)+sizeof(UDPHeader));
	pIpHead->ipTTL=128;
	pIpHead->ipProtocol=IPPROTO_UDP;
	pIpHead->ipSource=inet_addr(szSourceIp);
	pIpHead->ipDestination=inet_addr(szDestIp);
	pIpHead->ipChecksum=CheckSum((PUSHORT)pIpHead,sizeof(IPHeader));//IP 首部的校驗和只需要校驗IP首部
    //填充UDP首部
	UDPHeader *pUdpHeader=(UDPHeader *)&buf[sizeof(IPHeader)];
	pUdpHeader->sourcePort=htons(SOURCEPORT);
	pUdpHeader->destinationPort=htons(DESTPORT);
	pUdpHeader->len=htons(sizeof(UDPHeader)+sizeof(szMsg));
	pUdpHeader->checksum=0;
	//填充UDP數據
	char *pData;
	pData=&buf[sizeof(IPHeader)+sizeof(UDPHeader)];
	memcpy(pData,szMsg,sizeof(szMsg));
	//計算UDP校驗和
	UDPFakeHead mUDPFakeHead;
	mUDPFakeHead.sourceIp=pIpHead->ipSource;
	mUDPFakeHead.destIp=pIpHead->ipDestination;
	mUDPFakeHead.filling=0;
	mUDPFakeHead.protocalType=IPPROTO_UDP;
	mUDPFakeHead.UDPLength=htons(sizeof(UDPHeader)+sizeof(szMsg));
 
	//設置szBuffer目的是計算UDP校驗和
	char szBuffer[1024];
	memcpy(szBuffer,&mUDPFakeHead,sizeof(UDPFakeHead));
	memcpy(&szBuffer[sizeof(UDPFakeHead)],pUdpHeader,sizeof(UDPHeader));
	memcpy(&szBuffer[sizeof(UDPFakeHead)+sizeof(UDPHeader)],szMsg,sizeof(szMsg));
	pUdpHeader->checksum=CheckSum((PUSHORT)szBuffer,sizeof(UDPFakeHead)+sizeof(UDPHeader)+sizeof(szMsg));
	//設置目的地址
	sockaddr_in addrDest;
	addrDest.sin_family=AF_INET;
	addrDest.sin_addr.S_un.S_addr=inet_addr(szDestIp);
	addrDest.sin_port=htons(DESTPORT);
	for(int i=0;i<5;i++)
	{
		ret=sendto(sockRaw,buf,sizeof(UDPFakeHead)+sizeof(UDPHeader)+sizeof(szMsg),0,(sockaddr *)&addrDest,sizeof(addrDest));
		if(ret==SOCKET_ERROR)
		{
		  cout<<"發送失敗"<<endl;
		  break;
		}
		else
			cout<<"發送字節數"<<ret<<endl;
		Sleep(1000);
	
	}
	closesocket(sockRaw);
	WSACleanup();
	return 0;
 
	//發送五個同樣的UDP數據包
	 
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章