反向工程串行数据包

时间:2015-04-11 01:17:23

标签: serial-port protocols reverse-engineering

我有一台设备连接到PC vie串口(rs-232)。 该设备从串口接收到命令后发送数据,我通过端口嗅探数据流,几乎完全找到了数据包结构,但至少有两个重要的字段我无法确定。

第一个示例数据包(十六进制) - 内部有2个有效负载数据包:

0baa00000200039540330137732904020033000005534d6c07a567a73e15040701125600043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070113020004fd1d040342155500000000e940406f0002009d0a03004a3030313733353530303830343630303830373131313030323415040701210801001035390000000000000000d3a7226c287472874b2a216a000000000000000000ab04

第二个示例数据包(十六进制) - 内部有6个有效负载数据包:

0b6601000600039540330137732904020033000005534d6c07a567a73e15040701125600043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070113020004fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040702174901043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070218010104fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040703301002043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070331280204fd1d040342155500000000e940406f000600a10a03004a303031373335353030383034363030383037313131303032341504071152520100103539000000000000000094b5d2c94a11672acaa0abec0000000000000000006a85

我确定的数据包结构(第一个数据包为例): Packet structure

提交标记为??? - 我不知道它是什么,需要猜测。 有效载荷数据包可能会有所不同。 如果我编辑内部数据包中的任何字节并重新计算最后一个CRC16,程序将接受数据包,但有消息说它已损坏。如果我在没有CRC16重新计算的情况下编辑任何字节,程序将拒绝该数据包。

我需要什么?例如,我需要编辑 - 添加或删除一些内部有效负载数据包。

如果有任何帮助,我将非常感激。

更新1

两个具有不同请求时间字段的相同数据包:

0b6601000600039540330137732904020033000005534d6c07a567a73e15040701125600043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070113020004fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040702174901043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070218010104fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040703301002043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070331280204fd1d040342155500000000e940406f000600a10a03004a303031373335353030383034363030383037313131303032341504081008320100103539000000000000000021c3e1c0e04d909a7cf512b20000000000000000008b61

0b6601000600039540330137732904020033000005534d6c07a567a73e15040701125600043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070113020004fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040702174901043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070218010104fd1d040342155500000000e940406f00039540330137732904020033000005534d6c07a567a73e15040703301002043853048a5c085500000000e940406f00039540330058388900020033000005534d6c07b501b4f01504070331280204fd1d040342155500000000e940406f000600a10a03004a303031373335353030383034363030383037313131303032341504071152520100103539000000000000000094b5d2c94a11672acaa0abec0000000000000000006a85

2 个答案:

答案 0 :(得分:0)

在这种情况下,除非您的时间几乎空闲,否则您只需去购买规格即可。如果你有几千美元要布置,你绝对应该成为 DLMS-UA(他们的用户协会)的成员,这样你就可以访问所谓的“彩色书籍”—— DLMS 组织本身。

彩色书籍的摘录是freely available。这些应该涵盖一些基础知识。

感兴趣的核心书籍是蓝皮书和绿皮书,它们通过 ISO/IEC 标准化流程向非成员“开放”。引用DLMS International Standardization page,相关的国际标准是:

<块引用>
  • IEC 62056-5-3,DLMS/COSEM 应用层。 3.0版(2017)与绿皮书8.3版一致;
  • IEC 62056-6-2,COSEM 接口类。 3.0 版(2017 年)与 Blue Book 12.2 版一致;
  • IEC 62056-6-1,OBIS 对象识别系统 3.0 版(2017 年)与 Blue Book 12.2 版一致。

X.25 是一项开放的 ITU 建议。

HDLC 成帧的基本知识在 IETF RFC1662 PPP in HDLC-like Framing 中有解释。

答案 1 :(得分:-1)

我不能对此有所了解,但我可以提供这么多。

您显示的每个数据包似乎都有以下布局:

<start><length><data><zeros><checksum>

其中:

  • <start>为1个字节(0b)。

  • <length>是2个字节(aa006601)。这是<data>的大小,以小端(0x00AA为170,0x0166为358)。

  • <data>以2字节项目计数(00020006)开头,大端(0x0002为2,0x0006为6),其余为内容主要遵循您的分析。

  • <zeros>00字节的可变长度块。

  • <checksum>是2个字节。

您显示的数据包将因此崩溃:

0b
aa00
  0002
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 011256 0004 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 011302 0004 fd1d04034215 5500000000e940406f
  0002 009d 0a0300 4a303031373335 35303038303436303038303731313130303234 150407 012108 0100103539 0000000000000000 d3a7226c287472874b2a216a
000000000000000000
ab04

0b
6601
  0006
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 011256 0004 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 011302 0004 fd1d04034215 5500000000e940406f
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 021749 0104 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 021801 0104 fd1d04034215 5500000000e940406f
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 033010 0204 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 033128 0204 fd1d04034215 5500000000e940406f
  0006 00a1 0a0300 4a303031373335 35303038303436303038303731313130303234 150407 115252 0100103539 0000000000000000 94b5d2c94a11672acaa0abec 00000000
0000000000
6a85

您会注意到,在第二个数据包中,00末尾有额外的<data>个字节,而<zeros>小于第一个数据包。如果这些额外的00字节被移动到<zeros>,则两个数据包在<zeros>中将有9个字节:

0b
aa00
  0002
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 011256 0004 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 011302 0004 fd1d04034215 5500000000e940406f
  0002 009d 0a0300 4a303031373335 35303038303436303038303731313130303234 150407 012108 0100103539 0000000000000000 d3a7226c287472874b2a216a
000000000000000000
ab04

0b
6601
  0006
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 011256 0004 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 011302 0004 fd1d04034215 5500000000e940406f
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 021749 0104 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 021801 0104 fd1d04034215 5500000000e940406f
    0003954033 0137732904 020033000005534d6c07 a567a73e 150407 033010 0204 3853048a5c08 5500000000e940406f
    0003954033 0058388900 020033000005534d6c07 b501b4f0 150407 033128 0204 fd1d04034215 5500000000e940406f
  0006 00a1 0a0300 4a303031373335 35303038303436303038303731313130303234 150407 115252 0100103539 0000000000000000 94b5d2c94a11672acaa0abec
000000000000000000
6a85

但是第二个数据包<length>会出错,因为它必须是5C01而不是6601

需要进行更深入的分析以找出这种不确定性,并了解这些00字节是否具有基于<length>最初定位的位置,以及所有其他已知字段。