我正在使用 Java 语言开发 SNMP 管理器。我目前正在开发一个由 Netty 的强大功能支持的自定义 ASN/BER 编解码器。我已经很好地了解并理解了底层的东西,但我以前从未使用过协议(protocol)分析。我真的不明白如何从我可以使用的数据包中解密信息。
现在讨论具体细节。据我所知,类型信息以十六进制值编码到数据包中,我已经能够通过查看 SNMP 陷阱数据包的 Wireshark 输出来识别数据包中存在的类型。我不明白的是如何找到上下文信息?就像这样:
(取自 JoeSnmp)
public static final byte OCTETSTRING = (byte) 0x04;
public static final byte APPLICATION = (byte) 0x40;
public static final byte SMI_IPADDRESS = (ASN1.APPLICATION | 0x00);
我已经能够通过查看 SMI RFC 找到 OCTET_STRING 的值,但是他们是如何找到应用程序上下文值的?我不想引用答案,我想知道如何自己查看数据包找到答案。
正如您可能知道的那样,我对整个协议(protocol)分析和网络应用领域都是新手,因此如果您有任何其他相关资源,我也很乐意查看这些资源:)。
预先感谢您的帮助!
最佳答案
基本上,APPLICATION 值是一个硬编码常量。 APPLICATION 常量的值是从 ASN.1 BER 编码规范中获得的。在 ASN.1 BER 编码中,每个值都有一个关联的标签和长度。标签由标签类别和标签编号组成。有四种标记类别:通用、应用程序、上下文特定、私有(private)。这四个值在标签编码的第一个八位位组的位置 8 和 7 上被编码为两个位。与应用程序类相对应的位是 01(位 8 和位 7),并以十六进制转换,这给出了 0x40 位掩码,下面使用它通过按位运算来计算标签值。
有关 BER 编码的更多详细信息,请参阅示例 http://luca.ntop.org/Teaching/Appunti/asn1.html .
关于java - 如何破译 ASN/BER 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21940467/