⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 checksum.cpp

📁 DES算法及其在VC++6.0下的实现,编译时需要WinPcap开发包,您可以从http://www.vckbase.com/tools下载 WinPcap Developer s pack
💻 CPP
字号:
#include "stdafx.h"
#include "PIPMasq.h"


///// CheckSumCalc ///////

unsigned short 
CheckSumCalc::in_cksum(unsigned short *addr, int len)
{
	int				nleft = len;
	int				sum = 0;
	unsigned short	*w = addr;
	unsigned short	answer = 0;

	while (nleft > 1)
	{
		sum += *w++;
		nleft -= 2;
	}

	if (nleft == 1)
	{
		*(unsigned char *)(&answer) = *(unsigned char *)w;
		sum += answer;
	}

	sum = (sum >> 16) + (sum & 0xffff);
	sum += (sum >> 16);

	answer = ~sum;

	return(answer);
};


unsigned short
CheckSumCalc::tcpchecksum(
	struct tcphdr *_tcphdr, struct iphdr *_iphdr, int tcpDataLenInPacket)
{
	_tcphdr->check = 0;	  // Checksum should be set "0" first.

	unsigned char buf[MAX_ETH_SIZE];
	memset(buf, 0, MAX_ETH_SIZE);
	
	int buflen = 0;
	struct pesudeIphdr _pesudeIphdr;

	// make pesude IP header
	_pesudeIphdr.saddr = _iphdr->saddr;
	_pesudeIphdr.daddr = _iphdr->daddr;
	_pesudeIphdr.zero = 0;	// should be 0
	_pesudeIphdr.protocol = _iphdr->protocol;
	_pesudeIphdr.len = htons(sizeof(struct tcphdr) + tcpDataLenInPacket);

	memcpy(buf, &_pesudeIphdr, sizeof(struct pesudeIphdr));
	buflen += sizeof(struct pesudeIphdr);	

	// copy packet for TCP to buf
	memcpy(buf + buflen, _tcphdr, sizeof(struct tcphdr));
	buflen += sizeof(struct tcphdr);

	unsigned char *testP = (unsigned char *)_tcphdr;
	testP += sizeof(struct tcphdr);

	memcpy((buf+buflen), testP , tcpDataLenInPacket);
	buflen += tcpDataLenInPacket;


	return in_cksum((unsigned short *)buf, buflen);
}


unsigned short
CheckSumCalc::udpchecksum(
	struct udphdr *_udphdr, struct iphdr *_iphdr, int udpDataLenInPacket)
{
	_udphdr->check = 0;  // Checksum should be set "0" first.

	unsigned char buf[MAX_ETH_SIZE];
	memset(buf, 0, MAX_ETH_SIZE);
	
	int buflen = 0;

	struct pesudeIphdr _pesudeIphdr;

	// make pesude IP header
	_pesudeIphdr.saddr = _iphdr->saddr;
	_pesudeIphdr.daddr = _iphdr->daddr;
	_pesudeIphdr.zero = 0;	// should be 0
	_pesudeIphdr.protocol = _iphdr->protocol;
	_pesudeIphdr.len = _udphdr->len;

	memcpy(buf, &_pesudeIphdr, sizeof(struct pesudeIphdr));
	
	buflen += sizeof(struct pesudeIphdr);

	// copy packet for udp to buf
	memcpy(buf + buflen, _udphdr, sizeof(struct udphdr));
	buflen += sizeof(struct udphdr);

	unsigned char *testP = (unsigned char *)_udphdr;
	testP += sizeof(struct udphdr);

	memcpy((buf+buflen), testP , udpDataLenInPacket);
	buflen += udpDataLenInPacket;

	return in_cksum((unsigned short *)buf, buflen);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -