【问题标题】:Detect QUIC protocol from buffer in Delphi?从 Delphi 的缓冲区中检测 QUIC 协议?
【发布时间】:2022-07-27 00:12:42
【问题描述】:

我在 Delphi 中有一个监控 UDP 流量的应用程序。检测何时使用 QUIC 协议的正确方法是什么?我有一个 TBytes 缓冲区中的数据。

QUIC rfc:https://datatracker.ietf.org/doc/html/rfc9000

【问题讨论】:

  • 谢谢,非常有用!没有通用的方法来区分 QUIC 数据包,但也许有一些解决方法可以实现良好的检测率。
  • 您可以为 cmets 投票 - 考虑使用 tour。不要将“解决方法”与捷径或秘密作弊混为一谈 - 你将无法跳过投入的精力。
  • 到端口 443 的 UDP 流量通常是 QUIC。
  • @AmigoJack 还不能投票(新个人资料),但会在我可以的时候投票。

标签: delphi quic


【解决方案1】:

根据您正在寻找的积极匹配程度,“在公园里散步”和“有点噩梦”之间的努力会有所不同。

QUIC 有一个复杂的握手过程,在此期间会导出加密密钥,然后进入完全加密的应用程序数据阶段。除此之外,该协议还旨在允许在交换期间迁移端点(例如移动设备在 wifi 和移动数据之间跳转),因此仅跟踪 IP 地址和端口并不能捕获所有内容。

如果您只需要对正在启动的 QUIC 连接进行基本检测,那么您需要做的就是寻找初始数据包,这些数据包具有清晰的格式,并且只是经过混淆处理(未加密)。

来自RFC9000

17.2.2.  Initial Packet

   An Initial packet uses long headers with a type value of 0x00.  It
   carries the first CRYPTO frames sent by the client and server to
   perform key exchange, and it carries ACK frames in either direction.

   Initial Packet {
     Header Form (1) = 1,
     Fixed Bit (1) = 1,
     Long Packet Type (2) = 0,
     Reserved Bits (2),
     Packet Number Length (2),
     Version (32),
     Destination Connection ID Length (8),
     Destination Connection ID (0..160),
     Source Connection ID Length (8),
     Source Connection ID (0..160),
     Token Length (i),
     Token (..),
     Length (i),
     Packet Number (8..32),
     Packet Payload (8..),
   }

因此,检测 QUIC 版本 1 初始数据包的一种快速而肮脏的方法是检查以下内容(伪代码):

( packet[ 0 ] & 0xf0 ) == 0xc0
packet[ 1 ] == 0x00
packet[ 2 ] == 0x00
packet[ 3 ] == 0x00
packet[ 4 ] == 0x01

如果你想超越这一点,它很快就会变得更加复杂。

我强烈建议您下载并运行 wireshark 并亲自查看它在网络上的样子。

【讨论】:

    猜你喜欢
    • 2012-02-25
    • 1970-01-01
    • 2011-09-18
    • 2021-12-19
    • 2011-11-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-06
    • 2016-12-19
    相关资源
    最近更新 更多