又一次成为懒蛋了,标题就这么改了改又是一篇新文章。

网上也有很多S7comm协议的解析,但还是如同我上一篇一样我只是做报文的解析对于S7comm的原理并进行阐述。

有些地方有错误的地方尽请大家指出,共同进步。

好了,言归正题。我们开始吧。

我还是按照功能码的顺序进行介绍吧。

s7抓包分析

TPKT层和COTP层我也不多做介绍了,有兴趣的可以自己去了解。今天我们主要是解析S7comm这一层。

功能码附录:

0x00       CPU services CPU服务

0xf0        Setup communication  建立通信

0x04       Read Var      读取值

0x05       Write Var     写入值

0x1a       Request download 请求下载

0x1b       Download block   下载块

0x1c       Download ended   下载结束

0x1d       Start upload  开始上传

0x1e       Upload   上传

0x1f        End upload   上传结束

0x28       PI-Service     程序调用服务

0x29       PLC Stop      关闭PLC

1、0xF0建立通信

发包

我们来先看Header头部分。

Byte[0] 32 为协议ID   一般指定为0x32

Byte[1] 01 为 PDU类型  一般有0x01 Job 主设备发起请求 0x02 Ack 确认响应 0x03 Ack_data 确认数据响应一般作为确认0x01的请求 0x07 USERDATA     协议的扩展,参数字段包含请求/响应ID

Byte[2]Byte[3] 00 00冗余数据,通常为0×0000

Byte[4]Byte[5] 3e 02协议数据单元的参考、通过请求事件增加

Byte[6]Byte[7] 00 08参数的总长度也就是parameter的长度

Byte[8]Byte[9] 00 00数据的长度、也就是data部分数据的长度如果无即为0

继续看Parmeter部分。

根据上面的length得知,我们的Parameter部分应该是8个位,数一数看看是不是8位

Byte[0] f0 为PDU的类型也就是功能码

Byte[1] 00 冗余数据,通常为0×0000

Byte[2] Byte[3]  发送连接请求

Byte[4] Byte[5]  发送通信请求

Byte[6] Byte[7]  协商的PDU长度

回包

红框内跟发包是一样的,就不再描述了。

从Error Class开始。

Byte[10] 00 为错误类型 、错误类型也有很多种、以下是错误类型附录。

0x00       No error 没有错误

0x81       Application relationship     应用关系

0x82       Object definition  对象定义

0x83       No resources available 没有可用资源

0x84       Error on service processing 服务处理中错误

0x85       Error on supplies 请求错误

0x87       Access error  访问错误

Byte[11] 00 为错误码   文章最后会附录一下全部错误码(很长不贴在这里了,搜索 附录一)

这里可以理解为 错误类型规定错误的大体方向而错误码规定错误的具体事件。

接下来我们看Parameter这一部分

可以看出跟发包是完全一样的,还是那句话百变不离其宗,协议嘛逃脱不了一发一收对吧。

Byte[0] f0 为PDU的类型也就是功能码

Byte[1] 00 冗余数据,通常为0×0000

Byte[2] Byte[3]  确认连接请求

Byte[4] Byte[5]  确认通信请求

Byte[6] Byte[7]  协商的PDU长度

2、0x04 读取数据

发包

Header头部与之前都一样的不再描述了

我们直接看Parameter部分吧。

Byte[0]  04 功能码

Byte[1]  01 代表了Item的个数  为1 即为 一个

再继续往下扒。

Item部分

Byte[0] 12 结构标识通常都为0x12,代表变量规范

Byte[1] 0a 长度规范、自此往后的长度

Byte[2] 10  IDS的地址规范的格式类型常见值如下表

0x10        S7ANY  Address data S7-Any pointer-like DB1.DBX10.2

0x13        PBC-R_ID    R_ID for PBC

0x15        ALARM_LOCKFREE Alarm lock/free dataset

0x16        ALARM_IND      Alarm indication dataset

0x19        ALARM_ACK     Alarm acknowledge message dataset

0x1a        ALARM_QUERYREQ      Alarm query request dataset

0x1c        NOTIFY_IND      Notify indication dataset

0xa2        DRIVEESANY    seen on Drive ES Starter with routing over S7

0xb2        1200SYM      Symbolic address mode of S7-1200

0xb0        DBREAD      Kind of DB block read, seen only at an S7-400

0x82        NCK      Sinumerik NCK HMI access

Byte[3] 02 为数据传输的大小、常见值如下表

0 NULL

3  BIT  bit access, len is in bits

4  BYTE/WORD/DWORD  byte/word/dword access, len is in bits

5  INTEGER  integer access, len is in bits

6  DINTEGER  integer access, len is in bytes

7  REAL  real access, len is in bytes

9  OCTET STRING  octet string, len is in bytes

Byte[4]Byte[5] 00 01 即数据的长度

Byte[6]byte[7] 00 01  即 DB 编号,如果访问的不是DB区域,此处为0x0000

Byte[8] 84 即数据的区域常用的如下表

Byte[9] Byte[10]Byte[11]    要读取数据的地址

图示整体标注一下

 回包

 Header部分

除了红框内的其他都与发包一致

Error class 即错误类型

Error code 即具体错误码这两个在上面已经介绍了都有哪些错误类型,没有错误即0x00

Parameter部分

Byte[0] 04 功能码 Byte[1] 01 代表一个Item

Data部分

Byte[0] FF 为返回码  返回码常用值如下表

0x00       Reserved 未定义,预留

0x01       Hardware error   硬件错误

0x03       Accessing the object not allowed 对象不允许访问

0x05       Invalid address     无效地址,所需的地址超出此PLC的极限

0x06       Data type not supported     数据类型不支持

0x07       Data type inconsistent 日期类型不一致

0x0a       Object does not exist    对象不存在

0xff         Success  成功

Byte[1] 04  为数据传输大小 data数据传输大小值如下表

0     NULL

3     BIT bit access, len is in bits

4     BYTE/WORD/DWORD     byte/word/dword access, len is in bits

5     INTEGER    integer access, len is in bits

6     DINTEGER  integer access, len is in bytes

7     REAL    real access, len is in bytes

9     OCTET STRING octet string, len is in bytes

Byte[2]Byte[3]  为data数据的长度

Byte[4] 即数据

有时候会有填充数据即在byte[4]之后、如果数据长度不满足length的话会填充0x00

列如 byte[2]byte[3] 的长度值为3 就会在byte[4]后填充两个0x00

还是整体在图示一遍吧

西门子S7comm协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析S7comm所含功能码以及UserData功能的更多相关文章

  1. ModbusTCP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码

    现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Modbus这个协议并不会做很多介绍. 好了,我们开始吧. 常用的功能码其实也没多少.我也就按 ...

  2. 欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等

    前言 – Fins欧姆龙这个协议网上极少有相关的模拟器.Tcp的这一块倒是有但是Udp的基本都是不可用 1. Fins协议结构也很简单 协议分为两种 一种tcp一种udp 2. Tcp比Udp的报文会 ...

  3. DNP3协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码

    现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Dnp3这个协议并不会做很多介绍. 那我们就开始吧 上图则为dnp3协议整体的报文模型(点击红 ...

  4. 哈工大 计算机网络 实验四 利用 Wireshark 进行协议分析

    计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 利用 Wireshark 进行协议分析 实验目的: 本次实验的主要目的. 熟悉并掌握Wireshark的基本操作,了解网络协议实 ...

  5. TCP\IP协议实践:wireshark抓包分析之链路层与网络层

    目录 TCP\IP协议实践:wireshark抓包分析之链路层与网络层 从ping开始 链路层之以太网封装 ip首部 开启ping程序,开始抓包 由一个ping的结果引出来的两个协议ARP ICMP ...

  6. 利用Wireshark抓取并分析OpenFlow协议报文

    OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...

  7. 工控安全入门(二)—— S7comm协议

    在上一次的文章中我们介绍了施耐德公司的协议modbus,这次我们把目标转向私有协议,来看看另一家巨头西门子的S7comm.首先要说明,这篇文章中的内容有笔者自己的探索,有大佬们的成果,但由于S7com ...

  8. php伪协议,利用文件包含漏洞

    php支持多种封装协议,这些协议常被CTF出题中与文件包含漏洞结合,这里做个小总结.实验用的是DVWA平台,low级别,phpstudy中的设置为5.4.45版本, 设置allow_url_fopen ...

  9. 如何利用wireshark对TCP消息进行分析

    原文:https://www.cnblogs.com/studyofadeerlet/p/7485298.html 如何利用wireshark对TCP消息进行分析   (1) 几个概念介绍 1 seq ...

随机推荐

  1. sqlalchemy 单表增删改查

    1.连接数据库,并创建session from sqlalchemy.orm import sessionmaker from sqlalchemy import create_engine engi ...

  2. http请求头中的content-type属性

    在HTTP请求中,我们每天都在使用Content-Type来指定不同格式的请求信息,但是却很少有人去全面了解Content-Type中允许的值有多少,因此这里来了解一下Content-Type的可用值 ...

  3. 【WPF学习】第十三章 理解路由事件

    每个.NET开发人员都熟悉“事件”的思想——当有意义的事情发生时,由对象(如WPF元素)发送的用于通知代码的消息.WPF通过事件路由(event routing)的概念增强了.NET事件模型.事件路由 ...

  4. applyColorMap 在OpenCV中对灰度图进行颜色映射,实现数据的色彩化

    什么是色彩映射: 说直白点就是将各种数据映射成颜色信息,例如:温度,高度,压力,密度,湿度,城市拥堵数据等等 色彩化后更加直观表达 在OpenCV里可以使用 Mat im_gray = imread( ...

  5. Java 中的运算符和流程控制

    Java 中的运算符和流程控制 + 面试题 算术运算符 Java 中的算术运算符,包括以下几种: **算术运算符** **名称** **举例** + 加法 1+2=3 - 减法 2-1=1 \* 乘法 ...

  6. <img>和background-img区别

    1. 是否占位 background-image是背景图片,是css的一个样式,不占位 <img />是一个块状元素,它是一个图片,是html的一个标签,占位 2.否可操作 backgro ...

  7. 四 Shell条件测试

    条件测试操作 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,让我们可以方便的完成判断. 语法格式 test 选项 文件名或目录名 ...

  8. [xml]AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'getroot'

    >>> import requests >>> res = requests.get("https://xxx.com/sitemap.xml" ...

  9. HDU_1506_单调栈

    http://acm.hdu.edu.cn/showproblem.php?pid=1506 从栈底到栈顶从小到大排序,碰到比栈定小的元素,出栈处理,直到栈顶比元素小或者栈为空. 数组最后多加了个-1 ...

  10. POJ_1166_暴搜

    题目描述: 有3*3的9个时钟,每个始终有0,1,2,3四种可以循环的状态码,每组数据给我们9个时钟的一种状态码.另外还有9种操作,分别使指定位置的时钟状态码加一,求使得9个时钟状态码全部置于0的最少 ...