在IP头VB.NET中解析UDP头

时间:2017-07-02 17:43:08

标签: vb.net sockets networking udp ip

我正在制作网络嗅探器。我已经在我的主网络接口(192.168.2.11)上打开了一个原始套接字。代码并不是真的需要,但如果你需要它,我可以提供。然后,我从收到的数据包(应包含一个IP头,后跟一个UDP头,后面跟着一个数据报)创建一个MemoryStream。我将此MemoryStream转换为BinaryReader,并使用以下过程来解析IP标头

Version and header length        BinaryReader.ReadByte() 'As two nibbles make a byte
Type of service                  BinaryReader.ReadByte()
Total length                     BinaryReader.ReadInt16()
Identification                   BinaryReader.ReadInt16()
Flags and offset                 BinaryReader.ReadInt16() 'As 3 bits + 13 bits is 16
Time to live                     BinaryReader.ReadByte()
Protocol                         BinaryReader.ReadByte()
Checksum                         BinaryReader.ReadInt16()
Source address                   BinaryReader.ReadInt32()
Destination address              BinaryReader.ReadInt32()

(对此数据进行了更多处理,但未对BinaryReader进行更改)

然后我查询Version字段以查看它是否为17(UDP),如果是,我继续执行下一步,否则我将丢弃该过程。

现在我检查Internet标头长度(IHL)是否为5(即5 * 32或160位,或20字节)。我这样做是为了确保我的程序不会在不必要的IP选项上跳闸。如果不是5,我将丢弃该过程。

IP头完全解析...现在使用完全相同的BinaryReader,我尝试解析封装的UDP头。我正在使用的代码是

Out("Source port?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Destination port?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Length?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))
Out("Checksum?: " & IPAddress.NetworkToHostOrder(bin.ReadInt16()))

但我总是得到一些荒谬的东西......这是我的控制台应用程序的输出

Source port?: -364
Destination port?: 53
Length?: 35
Checksum?: -7570

目的地看起来不错,53为DNS,然后长度看起来也不错,但来源?港口怎么可能是负面的?校验和可能被允许为负数,我不确定。我的代码出了什么问题?如果你需要IP头输出,它就在这里......

Version: 4 (0100)
Internet header length: 5
    Words (32 bits): 5
    Octets (8 bits): 20
    Bits (1 bit): 160
Type of service: 0x00000000
    Precedence: 000 (Routine)
    Delay: 0 (Normal Delay)
    Throughput: 0 (Normal Throughput)
    Reliability: 0 (Normal Reliability)
Total length: 55
Identification: 2866
Flags: 0x00
    Reserved: False
    Don't Fragment: False
    More Fragments: False
Fragment offset: 0
Time to live: 128
Protocol: 17 (UDP)
Header checksum: -21977
Source address: 184723648 (192.168.2.11)
Destination address: 16951488 (192.168.2.1)
Payload length (bits): 288

1 个答案:

答案 0 :(得分:0)

似乎问题不是我的解析方法(我知道),它是原始套接字返回的数据。当我使用Wireshark提供的十六进制转储时,它很棒。