canoe982
驱动牛犊
驱动牛犊
  • 注册日期2003-04-11
  • 最后登录2005-12-14
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1393回复:1

我想用以下代码修改IP头,不知是否可以?

楼主#
更多 发布于:2004-09-11 15:39
//计算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。
请教各位老大,以上代码是否可以达到目的。
独怜幽草涧边生, 上有黄鹂深树鸣。 春潮带雨晚来急, 野渡无人舟自横。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-12 13:00
好象可以
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部