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

📄 as_tcpip.h

📁 实现了在arp欺骗环境下
💻 H
字号:
#ifndef __AS_TCPIP_H__
#define __AS_TCPIP_H__

//////////////////////////////////////////////////////////////////////////
//计算效验和函数,先把IP首部的效验和字段设为0(IP_HEADER.checksum=0)
//然后计算整个IP首部的二进制反码的和。
//////////////////////////////////////////////////////////////////////////
u_int16 checksum(u_int16 *buffer, u_int32 size)
{
       u_int32 cksum=0;
       while (size >1) {
              cksum+=*buffer++;
              size-=2;
       }
       if (size) cksum += *(u_int8*) buffer;
       cksum = (cksum >> 16) + (cksum&0xffff);
       cksum += (cksum >> 16);
       return (u_int16) (~cksum); 
}

//////////////////////////////////////////////////////////////////////////
// 计算TCP检验和的函数
//////////////////////////////////////////////////////////////////////////
void ComputeTcpPseudoHeaderChecksum(IPHeader *pIphdr, TCPHeader *pTcphdr,
    u_int8 *payload, u_int32 payloadlen)
{
	
	u_int8 *buff = (u_int8 *) malloc(1024+payloadlen);
	u_int8 *ptr=buff;

	u_int32 chksumlen = 0;
	u_int32 zero = 0;
	
	// 伪头
	// 包含源IP地址和目的IP地址
	memcpy(ptr, &pIphdr->ipSource, sizeof(pIphdr->ipSource));
	ptr += sizeof(pIphdr->ipSource);
	chksumlen += sizeof(pIphdr->ipSource);

	memcpy(ptr, &pIphdr->ipDestination, sizeof(pIphdr->ipDestination));
	ptr += sizeof(pIphdr->ipDestination);
	chksumlen += sizeof(pIphdr->ipDestination);

	// 包含8位0域
	memcpy(ptr, &zero, 1);
	ptr += 1;
	chksumlen += 1;

	// 协议
	memcpy(ptr, &pIphdr->ipProtocol, sizeof(pIphdr->ipProtocol));
	ptr += sizeof(pIphdr->ipProtocol);
	chksumlen += sizeof(pIphdr->ipProtocol);

	// TCP长度
	u_int16 tcp_len = htons(sizeof(TCPHeader) + payloadlen);
	memcpy(ptr, &tcp_len, sizeof(tcp_len));
	ptr += sizeof(tcp_len);
	chksumlen += sizeof(tcp_len);

		// TCP头
	memcpy(ptr, pTcphdr, sizeof(TCPHeader));
	ptr += sizeof(TCPHeader);
	chksumlen += sizeof(TCPHeader);

		// 净荷
	memcpy(ptr, payload, payloadlen);
	ptr += payloadlen;
	chksumlen += payloadlen;

	// 补齐到下一个16位边界
	for(u_int32 i=0; i < payloadlen % 2; i++)
	{
		*ptr = 0;
		ptr ++;
		chksumlen ++;
	}

	// 计算这个校验和,将结果填充到TCP头
	pTcphdr->cksum = checksum((u_int16*) buff, chksumlen);
}

//////////////////////////////////////////////////////////////////////////
// 计算UDP检验和的函数
//////////////////////////////////////////////////////////////////////////
void ComputeUdpPseudoHeaderChecksum(IPHeader *pIphdr, UDPHeader *pUdphdr,
									char *payload, int payloadlen)
{

	u_int8 *buff = (u_int8 *) malloc(1024+payloadlen);
	u_int8 *ptr=buff;

	u_int32 chksumlen = 0;
	u_int32 zero = 0;

	// 伪头
	// 包含源IP地址和目的IP地址
	memcpy(ptr, &pIphdr->ipSource, sizeof(pIphdr->ipSource));
	ptr += sizeof(pIphdr->ipSource);
	chksumlen += sizeof(pIphdr->ipSource);

	memcpy(ptr, &pIphdr->ipDestination, sizeof(pIphdr->ipDestination));
	ptr += sizeof(pIphdr->ipDestination);
	chksumlen += sizeof(pIphdr->ipDestination);

	// 包含8位0域
	memcpy(ptr, &zero, 1);
	ptr += 1;
	chksumlen += 1;

	// 协议
	memcpy(ptr, &pIphdr->ipProtocol, sizeof(pIphdr->ipProtocol));
	ptr += sizeof(pIphdr->ipProtocol);
	chksumlen += sizeof(pIphdr->ipProtocol);

	// UDP长度
	u_int16 udp_len = htons(sizeof(UDPHeader) + payloadlen);
	memcpy(ptr, &udp_len, sizeof(udp_len));
	ptr += sizeof(udp_len);
	chksumlen += sizeof(udp_len);

	// UDP头
	memcpy(ptr, pUdphdr, sizeof(UDPHeader));
	ptr += sizeof(UDPHeader);
	chksumlen += sizeof(UDPHeader);

	// 净荷
	memcpy(ptr, payload, payloadlen);
	ptr += payloadlen;
	chksumlen += payloadlen;

	// 补齐到下一个16位边界
	for(int i=0; i < payloadlen % 2; i++)
	{
		*ptr = 0;
		ptr ++;
		chksumlen ++;
	}

	// 计算这个校验和,将结果填充到UDP头
	pUdphdr->cksum = checksum((u_int16*) buff, chksumlen);
}
#endif

⌨️ 快捷键说明

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