伪造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;
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值