西门子S7comm协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析S7comm所含功能码以及UserData功能
又一次成为懒蛋了,标题就这么改了改又是一篇新文章。
网上也有很多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功能的更多相关文章
- ModbusTCP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码
现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Modbus这个协议并不会做很多介绍. 好了,我们开始吧. 常用的功能码其实也没多少.我也就按 ...
- 欧姆龙FinsTCP与FinsUDP协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析附含报文模拟器等
前言 – Fins欧姆龙这个协议网上极少有相关的模拟器.Tcp的这一块倒是有但是Udp的基本都是不可用 1. Fins协议结构也很简单 协议分为两种 一种tcp一种udp 2. Tcp比Udp的报文会 ...
- DNP3协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析Modbus所含功能码
现在网上有很多类似的文章.其实这一篇也借鉴了很多其他博主的文章. 写这篇文章的重点是在于解析功能和报文.对Dnp3这个协议并不会做很多介绍. 那我们就开始吧 上图则为dnp3协议整体的报文模型(点击红 ...
- 哈工大 计算机网络 实验四 利用 Wireshark 进行协议分析
计算机网络实验代码与文件可见github:计算机网络实验整理 实验名称 利用 Wireshark 进行协议分析 实验目的: 本次实验的主要目的. 熟悉并掌握Wireshark的基本操作,了解网络协议实 ...
- TCP\IP协议实践:wireshark抓包分析之链路层与网络层
目录 TCP\IP协议实践:wireshark抓包分析之链路层与网络层 从ping开始 链路层之以太网封装 ip首部 开启ping程序,开始抓包 由一个ping的结果引出来的两个协议ARP ICMP ...
- 利用Wireshark抓取并分析OpenFlow协议报文
OpenFlow 交换机与控制器交互步骤 1. 利用Mininet仿真平台构建如下图所示的网络拓扑,配置主机h1和h2的IP地址(h1:10.0.0.1,h2:10.0.0.2),测试两台主机之间的网 ...
- 工控安全入门(二)—— S7comm协议
在上一次的文章中我们介绍了施耐德公司的协议modbus,这次我们把目标转向私有协议,来看看另一家巨头西门子的S7comm.首先要说明,这篇文章中的内容有笔者自己的探索,有大佬们的成果,但由于S7com ...
- php伪协议,利用文件包含漏洞
php支持多种封装协议,这些协议常被CTF出题中与文件包含漏洞结合,这里做个小总结.实验用的是DVWA平台,low级别,phpstudy中的设置为5.4.45版本, 设置allow_url_fopen ...
- 如何利用wireshark对TCP消息进行分析
原文:https://www.cnblogs.com/studyofadeerlet/p/7485298.html 如何利用wireshark对TCP消息进行分析 (1) 几个概念介绍 1 seq ...
随机推荐
- Qt Installer Framework翻译(3-2)
添加组件 如果用户在初始安装期间未选择所有可安装组件,则后续也可以使用包管理器从仓库中获取剩余组件进行安装.包管理器是维护工具的一部分,该维护工具在初始安装过程中与应用程序一起被安装.仅当包含组件的仓 ...
- 代码审计之CVE-2018-7600-Drupal远程代码执行漏洞-Render API
今天学习一下Drupal的另一个漏洞,由于渲染数组不当造成的漏洞 poc: url:http://localhost/drupal-8.5.0/user/register?element_parent ...
- Codeforces Round #615 (Div. 3)
A. Collecting Coins 题目链接:https://codeforces.com/contest/1294/problem/A 题意: 你有三个姐妹她们分别有 a , b , c枚硬币, ...
- synchronized的使用
概念: 是利用锁的机制来实现同步的. 锁机制有如下两种特性: 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操 ...
- [bzoj2186] [洛谷P2155] [Sdoi2008] 沙拉公主的困惑
Description 大富翁国因为通货膨胀,以及假钞泛滥,政府决定推出一项新的政策:现有钞票编号范围为1到N的阶乘,但是,政府只发行编号与M!互质的钞票.房地产第一大户沙拉公主决定预测一下大富翁国现 ...
- sqli_labs学习笔记(一)Less-38~Less-53
续上,开门见山 堆叠注入,实际上就构成了两条SQL语句 http://43.247.91.228:84/Less-38/?id=1' union select 1,2,3 --+ //未报错 h ...
- Python学习初级python3.6的安装配置
首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载. 2. ...
- redis--->微博小项目
redis 微博小项目 centos6.9+lnmp+redis 写的微博小项目,梳理了redis在项目中kes的设计,redis各种数据结构在不同业务场景下的应用等知识点. 这里用的php框架是自己 ...
- http--->http缓存机制系统梳理
http缓存 HTTP请求的过程 从在浏览器地址栏敲入域名-DNS解析-实际IP-(中间可能多个代理服务器分发)- 源服务器,请求抵达源服务器后,在服务器上找到请求的资源,再通过代理服务器一层层的返回 ...
- SpringBoot缓存篇Ⅱ --- 整合Redis以及序列化机制
一.Redis环境搭建 系统默认是使用ConcurrentMapCacheManager,然后获取和创建ConcurrentMapCache类型的缓存组件,再将数据保存在ConcurrentMap中 ...