【问题标题】:ASN.1 unmarshalling wireshark hex code using go structsASN.1 使用 go 结构解组wireshark 十六进制代码
【发布时间】:2018-04-23 05:41:55
【问题描述】:

我正在尝试从 tcp 转储中解码以下十六进制代码。 18001c3080a080800106830200e20000a28080010181010d00008301650000

我尝试解码的 ASN.1 定义格式如下:

ConnectionEstablishedReply  ::= SEQUENCE {
message         MessageFields,
nackReason      NackReason OPTIONAL,
interfaceVersion    InterfaceVersion,
mediatorId      INTEGER (1..65535),
waitForCommit       BOOLEAN OPTIONAL,
...
}

MessageFields       ::= SEQUENCE {
messageSequence     INTEGER (1..65535),
bsId    INTEGER (1..65535) OPTIONAL,
neID        INTEGER(0..16777216) OPTIONAL, -- unsigned int
nelementID  INTEGER(0..16777216) OPTIONAL, -- unsigned int
...
}

InterfaceVersion        ::= SEQUENCE {
major           INTEGER (1..100),
minor           INTEGER (0..100)
}

据我了解,来自 tcp 转储的 ConnectionEstablishedReply 的标签或类型是 24,而序列的标签是 16。这些标签中的不匹配是导致错误的原因:

解组时出错:asn1:结构错误:标签不匹配(16 vs {class:0 tag:24 length:0 isCompound:false}){optional:false explicit:false application:false defaultValue: tag: stringType :0 timeType:0 set:false omitEmpty:false} ConnectionEstablishedReply @2

这些元素对应的go结构是:

type ConnectionEstablishedReply struct {
    Message          MessageFields    
    NackReason       NackReason       `asn1:"optional"`
    InterfaceVersion InterfaceVersion 
    MediatorId       int              
    WaitForCommit    bool             `asn1:"optional"`
}

对于其他元素也是如此。

解组代码:

res := structs.ConnectionEstablishedReply{}
data, _ := hex.DecodeString("18001c3080a080800106830200e20000a28080010181010d00008301650000")
_, err := asn1.Unmarshal(data, &res)
if err != nil {
    fmt.Println("Error while unmarshalling: ", err)
}
fmt.Println(res)

在之前的问题 (ASN.1 Unmarshalling using go structs gives tags don't match error) 中,我被告知我应该对这些结构使用隐式 asn.1 标记。但是,这些标签不适用于这些特定于应用程序的元素。

仅供参考,当仅将上述十六进制流的3080a080800106830200e20000a28080010181010d00008301650000(消息部分)输入http://asn1-playground.oss.com/时,解码成功。然而,在 go 代码中使用相同的流时给出:

找到不定长度(不是 DER)

在这些 go 结构中应该使用哪些 asn.1 标签才能成功解组?

【问题讨论】:

  • 模块定义格式如下: Module-Name DEFINITIONS AUTOMATIC TAGS := etc...
  • 有这个实现BER编码/解码的库。它基于“encoding/asn1”包:github.com/Logicalis/asn1。这对我有帮助。

标签: go asn.1


【解决方案1】:

标签不是问题。这是您的库解码无限长度的能力的问题。 对于构造类型(例如序列),您可以使用:

标签长度值(也称为定长形式)

标记'80'H 值'0000'H(也叫不定长形式)

您收到的消息对所有序列都使用不定长度。 您的 lib 不支持它,因为它遵守不允许这种形式的可分辨编码规则 (DER)。 如果您的库支持它,您的消息部分将像这样解码......

T: 30 (CONSTRUCTED_UNIVERSAL_16) 
L: 80 (indefinite)   
   T: a0 (CONSTRUCTED_CONTEXT_0)
   L: 80 (indefinite)
     T: 80 (PRIMITIVE_CONTEXT_0)
     L: 1
     V: 06
     T: 83 (PRIMITIVE_CONTEXT_3)
     L: 2
     V: 00 e2
   0000: end of content

   T: a2 (CONSTRUCTED_CONTEXT_2)   
   L: 80 (indefinite)
      T: 80 (PRIMITIVE_CONTEXT_0)
      L: 1
      V: 01
      T: 81 (PRIMITIVE_CONTEXT_1)
      L: 1
      V: 0d
   0000: end of content 

   T: 83 (PRIMITIVE_CONTEXT_3)   
   L: 1   
   V: 65 
0000: end of content

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 2020-02-26
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多