我正在使用Java语言开发SNMP管理器。我目前正在开发由Netty支持的自定义ASN / BER编解码器。我已经做了一个不错的方法,并且了解了底层的内容,但是我之前从未进行过协议分析。我真的不明白如何从我可以使用的数据包中解密信息。

现在到细节。我知道类型信息以十六进制值编码到数据包中,通过查看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的值,但是他们如何找到应用程序上下文值?我不想参考答案,我想知道如何自己看着包装盒找到答案。

如您所知,我是整个协议分析和网络应用程序领域的新手,因此,如果您有任何其他相关资源,我也很乐意查看:)。

在此先感谢您的帮助!

最佳答案

基本上,APPLICATION值是一个硬编码的常量。 APPLICATION常数的值是从ASN.1 BER编码规范中获得的。在ASN.1 BER编码中,每个值都有一个关联的标记和长度。标签由标签类别和标签编号组成。有四个标签类:通用,应用,特定于上下文,专用。这四个值在标签编码的第一个八位位组的位置8和7上被编码为两位。对应于应用程序类别的位是01(位8和位7),并以十六进制转换后得到0x40位掩码,该掩码在下面用于通过按位运算来计算标记值。

有关BER编码的更多详细信息,请参见例如http://luca.ntop.org/Teaching/Appunti/asn1.html

10-02 05:48