python udp伪造ip_使用Python计算IP、TCP、UDP校验和

IP数据报的校验:

IP数据报只需要对数据头进行校验,步骤如下:

将接收到的数据的checksum字段设置为0

把需要校验的字段的所有位划分为16位(2字节)的字

把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上,举例,0xBB5E+0xFCED=0x1 B84B,则将1放到最低位,得到结果是0xB84C

将所有字相加得到的结果应该为一个16位的数,将该数取反则可以得到检验和checksum。

上述第2步中也可以不用每次把进位加到低位,可以等所有数据计算结束再将高位16个字依次加到低位,直到最后结果是两个字节为止,例如所有数据相加后为0xb6e51c2a3,首先将其低位2个字节和剩余的高位字节相加0xB6E51+0xC2A3=0xC30F4,对得到的再次将低2个字节和剩余的高位相加:0x30F4+0XC=0X3100

TCP/UDP数据报的校验

一、下面的图是一个UDP的检验和所需要用到的所有信息,包括三个部分:

UDP伪首部

UDP首部

UDP的数据部分

首先解释下伪首部的概念,伪首部的数据都是从IP数据报头获取的。其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。

还有一个概念十分重要,那就是16位UDP总长度,该长度是UDP头和数据的总长度。剩下的校验算法和IP数据报的校验方法一致了。

例子

import struct

def check(data):

sum=0

for i in range(0,len(data),4):

val = int(data[i:i+4],16)

sum = sum + val

sum = sum & 0xffffffff

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

if sum > 65535:

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

return 65535-sum

a = '4500003c00004000400652c00a1a1a163afb88d1'

ip_check = check(a)

print('ip_check:',hex(ip_check))

a='9bd327105919fa3e17da3cbf8018014dd59000000101080a0024a9d043dcc85d5459504520490d0a' #will

length = struct.pack('>H',len(a)//2).hex()

print(length)

if len(a)%4 !=0:

a=a+'00'

b='c0a8c8010a1a1a16'+'0006'+length+a

tcp_check= check(b)

print('tcp_check:',hex(tcp_check))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值