java - 如何破译 ASN/BER 数据包

标签 java networking protocols netty asn.1

我正在使用 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/

相关文章:

networking - 网络分析器 - 处理捕获的 pcap 文件

ios - 尝试调用通用函数参数时出现错误,swift

compare - 如何实现 Swift 的 Comparable 协议(protocol)?

Java:单击按钮时将矩形形状更改为其他形状

java - 准备 MediaPlayer 播放自定义文件时出现问题

服务器可以从不同的进程和套接字发送响应吗?

protocols - 如何在 Clojurescript 中使用 deftype 实现关联结构

java - JSF - 变量中的托管 bean?

java - 使用 FloatMath 或 Math 和类型转换?

java - 在java中通过网络压缩和发送图像?