阅读:1393回复:1
我想用以下代码修改IP头,不知是否可以?
//计算IP校验和的子程序
unsigned short checksum(unsigned short *buffer,int size) //校验和的求法 { unsigned long cksum=0; while(size>0) //各位求和 { cksum+=*buffer++; size-=sizeof(unsigned short); } if(size) cksum+=*(unsigned char *)buffer; cksum=(cksum>>16)+(cksum & 0xffff); //移位,位与运算 cksum+=(cksum>>16); return (unsigned short)(~cksum); //再取反 } //增加IP选项的子程序 void VeryPacketData( IN OUT PUCHAR pPacketContent, //原始数据,并保存修改后的数据 IN UINT PacketLen, //原始数据包长度 IN PUCHAR pAddedContent, //需要增加的数据 IN UINT AddedLen, //需要增加的数据长度 OUT PUINT pLength) //输出数据长度 { UINT iLen; //连接数据 NdisMoveMemory(pPacketContent+PacketLen,pAddedContent,AddedLen); *pLength=PacketLen+AddedLen; //修改IP格式中的相关字段 P_IP_PACKET p_ip; iLen=AddedLen/4; //要求AddedLen必须是4的整数倍 p_ip = (P_IP_PACKET)(pPacketContent); //获取IP头 p_ip->len+=iLen; //修改IP头长 p_ip->total_len+=AddedLen; //修改数据包总长度 p_ip->checksum=0; //先将检验和置为0 //修改检验和 p_ip->checksum=checksum((USHORT *)&pPacketContent,p_ip->len*4); } 其中pPacketContent是获取的原始包的完整数据。pAddedContent是需要增加的数据,作为IP头的选项,比如一个4字节长的标识字段。修改后的数据仍放在pPacketContent。 请教各位老大,以上代码是否可以达到目的。 |
|
|
沙发#
发布于:2004-09-12 13:00
好象可以
|
|
|