西门子S7comm协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析S7comm所含功能码以及UserData功能(path2)

接着上一篇来继续。

西门子S7comm协议解析 —— 利用Wireshark对报文逐字节进行解析详细解析S7comm所含功能码以及UserData功能(path1)

这一篇把常见的功能码全部解析一遍吧,把UserData这一块放到最后一篇以及模拟器和抓取pacp的包。

1、0x1a 请求下载

我们基本上也可以推断出来这个报文都会有什么内容。

要下载什么东西,要下载东西的地址,要下载的东西的属性。八九不离十。

发包

头部都是一样的 我就不在贴图了,我们看参数部分。

Byte[0]  1a 功能码

Byte[1]  00 即功能状态,包含错误是否发生、是否使用另一个检索块/文件来请求的更多数据网络状态

Byte[2] Byte[3] 01 00没什么意义

Byte[4] 到 Byte[7] 没什么意义一般都为0x00000000

Byte[8] 09为文件名的长度

Byte[9]到 Byte[17] 为文件名

然后我们把Filename展开解析这一块。

Filename部分

Byte[0] 5f 文件标识符

Byte[1] Byte[2] 30 41 块类型

Byte[3] 到Byte[7] 30 30 30 30 31 即请求的块编号

Byte[8] 50 即请求目标的文件系统,有三种如下表

P(Passive (copied, but not chained) module):被动文件系统

A (Active embedded module):主动文件系统

B (Active as well as passive module):既主既被文件系统种

接着参数部分继续往下看

Byte[18] 0d 参数第二部分的长度、即为接下来数据的长度

Byte[19] 31即加载mem之前的未知字符

Byte[20] 到 Byte[25]  即装载长度

Byte[26] 到 Byte[31]  即 MC7 代码长度

整个意思就是请求下载(请求的标识是 5f 、请求的块类型是 DB 块的编号是0001 、目标块文件系统是P、所以文件名为_0A00001P,用于将DB1复制到被动文件系统或从被动文件系统复制。)

对于发包我们基本上也是能猜到他会做什么吧。

很多时候计算机跟咱们生活的小事其实挺相似的,举个不太恰当的例子。

咱们吃饭是不是就直接拿着筷子去吃就完了,但是你把步骤分解分解翻译成机器语言。

筷子 —— 指针  米 —— 数据   吃 —— 处理数据  上厕所 —— 排除垃圾数据。

回包

头部不用说了参数部分只回复了1a 代表确认请求了确认请求之后就会进行下载块(功能码为:1b

2、0x1b 下载块

那么我们再去推断一下 这个报文里面都会有什么,要多多思考哈~

发包

红框内都一样(其他的也都一样)从length开始加深一下吧

Byte[0] 09 表示之后的数据长度

Byte[1] 5f  文件标识符

Byte[2] 30 41 块类型

Byte[3] 30 30 30 30 31 块编号

Byte[4] 50 请求目标的文件系统

回包

与发包相比较只多了个data部分介绍data部分就行了

这个就简单易懂了吧,不用说也能猜到了吧。

Byte[0] Byte[1] 00 de data数据内容的长度

Byte[2] Byte[3] 00 fb 未知字节

Byte[4]到尾都是数据内容  

3、0x1c 下载结束

发包

与0x1a和0x1b都一样少了装载长度和MC7长度意思就是结束下载了这里就不做描述了

回包

 

也很简单参数部分只回复了个1c 就是下载结束的意思了

4、0x1d 开始上传

发包

 

可以看到,开始上传的结构和请求下载的前部分结构一致,如上图所示的内容,其实就是告诉 PLC 一个文件名,文件标识是_ (Complete Module),块类型为0B(SDB),块的编号为00000,目标块的文件系统是A (Active embedded module),所以文件名为_0B00000A

基本与请求下载都一样 Fliename就是文件名长度UploadID即为会话ID的意思

回包

 

Byte[0] 1d功能码 Byte[1] 00 功能状态

Byte[2] Byte[3] 01 00 即即blockcontrol中的所有未知字节

Byte[4] Byte[7] 会话ID

Byte[8] 即自此之后的数据长度

Byte[9]到尾完整上传快的长度(以字节为单位)、可以拆分为多个PDU

5、0x1e 上传

发包

 

这个就不做介绍了 UploadID与1d 协商的ID 是对照的

回包

 如之前的一样、不做介绍了。

Length,数据内容长度。Unknown byte(s) in blockcontrol,未知字节。Data,数据。

6、0x1f 上传结束

发包

都一样不描述了其中只是多了个错误代码 Errorcode

回包

 只回复了个1f 是上传结束了

7、0x28程序调用服务

发包

Byte[0] 28功能码

Byte[1]到byte[7] 00 00 00 00 00 00 fd 未知字节

Byte[8]byte[9] 00 02 Parameter block的长度

Byte[10]byte[11] 45 50 即参数块

Byte[12] 05 即PI程序调用服务名的数据长度

Byte[13]到尾 5f 4d 4f 44 55为程序调用服务名(常用的我贴到最后吧贴这里太长了搜附录一)

回包

 Header头不讲,parameter只回复了 0x28 就是说明确认请求成功

8、0x29 关闭PLC

这个跟之前的都一样、我再整体的图示一下吧,不一个字节一个字节说了

发包

 回包

 

 好了,基本上功能这方面的介绍完了,下一篇把Userdata再说一下也就完活了。

还是那句话一通百通,很多东西你明白一条基本上其他的也能猜个八九不离十。

善于思考。

 

 

附录一:程序调用服务名

UNKNOWN    PI-Service目前不详

_INSE    PI-Service _INSE(激活PLC模块)

_DELE    PI-Service _DELE(从PLC的被动文件系统中删除模块)

P_PROGRAM    PI-Service P_PROGRAM(PLC启动/停止)

_MODU    PI-Service _MODU(PLC Copy Ram to Rom)

_GARB    PI-Service _GARB(压缩PLC内存)

_NLOGIN    PI-Service _NLOGIN(登录)

_N_LOGOUT    PI-Service _N_LOGOUT(退出)

_N_CANCEL    PI-Service _N_CANCEL(取消NC报警)

_N_DASAVE    PI-Service _N_DASAVE(用于将数据从SRAM复制到FLASH的PI-Service)

_N_DIGIOF P   I-Service _N_DIGIOF(关闭数字化)

_N_DIGION    PI-Service _N_DIGION(打开数字化)

_NDZERO    PI-Service _NDZERO(设置所有D nos。对于函数无效\“唯一D号。\”)

_N_ENDEXT    PI-Service _N_ENDEXT()

_N_F_OPER    PI-Service _N_F_OPER(以只读方式打开文件)

_N_OST_OF    PI-Service _N_OST_OF(Overstore OFF)

_N_OST_ON    PI-Service _N_OST_ON(Overstore ON)

_NSCALE    PI-Service _NSCALE(测量单位设置(公制< - > INCH))

_N_SETUFR    PI-Service _N_SETUFR(激活用户帧)

_N_STRTLK    PI-Service _N_STRTLK(设置全局启动禁用)

_N_STRTUL    PI-Service _N_STRTUL(重置全局启动禁用)

_N_TMRASS    PI-Service _N_TMRASS(重置活动状态)

_N_F_DELE    PI-Service _N_F_DELE(删除文件)

_N_EXTERN    PI-Service _N_EXTERN(选择外部程序执行)

_N_EXTMOD    PI-Service _N_EXTMOD(选择外部程序执行)

_N_F_DELR    PI-Service _N_F_DELR(即使没有访问权限也删除文件)

_N_F_XFER    PI-Service _N_F_XFER(选择要上传的文件)

_NLOCKE    PI-Service _NLOCKE(锁定活动文件以进行编辑)

_N_SELECT   PI-Service _N_SELECT(选择要执行的程序)

_N_SRTEXT    PI-Service _N_SRTEXT(文件正在/ _N_EXT_DIR中标记)

_N_F_CLOS    PI-Service _N_F_CLOS(关闭文件)

_N_F_OPEN   PI-Service _N_F_OPEN(打开文件)

_N_F_SEEK   PI-Service _N_F_SEEK(定位文件搜索指针)

_N_ASUP    PI-Service _N_ASUP (分配中断)

_N_CHEKDM    PI-Service _N_CHEKDM(对D号码启动唯一性检查)

_N_CHKDNO    PI-Service _N_CHKDNO(检查工具是否具有唯一的D编号)

_N_CONFIG    PI-Service _N_CONFIG(重新配置机器数据)

_N_CRCEDN    PI-Service _N_CRCEDN(通过指定边数来创建切削刃)

_N_DELECE    PI-Service _N_DELECE(删除最前沿)

_N_CREACE    PI-Service _N_CREACE(创造最前沿)

_N_CREATO   PI-Service _N_CREATO(创建工具)

_N_DELETO   PI-Service _N_DELETO(删除工具)

_N_CRTOCE   PI-Service _N_CRTOCE(生成具有指定边数的工具)

_N_DELVAR    PI-Service _N_DELVAR(删除数据块)

_N_F_COPY   PI-Service _N_F_COPY(复制NCK中的文件)

_N_F_DMDA    PI-Service _N_F_DMDA(删除MDA内存)

_N_F_PROT    PI-Service _N_F_PROT(为文件指定保护级别)

_N_F_RENA    PI-Service _N_F_RENA(重命名文件)

_N_FINDBL    PI-Service _N_FINDBL(激活搜索)

_N_IBN_SS    PI-Service _N_IBN_SS(设置设置开关)

_N_MMCSEM    PI-Service _N_MMCSEM(MMC-Semaphore)

_N_NCKMOD    PI-Service _N_NCKMOD(正在设置NCK工作的模式)

_N_NEWPWD    PI-Service _N_NEWPWD(新密码)

_N_SEL_BL    PI-Service _N_SEL_BL(选择新块)

_N_SETTST    PI-Service _N_SETTST(激活替换工具组的工具)

_N_TMAWCO    PI-Service _N_TMAWCO(在一个杂志中设置有效磨损组)

_N_TMCRTC   PI-Service _N_TMCRTC(创建具有指定边数的工具)

_N_TMCRTO    PI-Service _N_TMCRTO(在工具管理中创建工具)

_N_TMFDPL    PI-Service _N_TMFDPL(搜索空白处加载)

_N_TMFPBP    PI-Service _N_TMFPBP(搜索空位)

_N_TMGETT    PI-Service _N_TMGETT(使用Duplono确定特定工具ID的T编号)

_N_TMMVTL   PI-Service _N_TMMVTL(加载或卸载工具)

_N_TMPCIT   PI-Service _N_TMPCIT(设置计件器的增量值)

_N_TMPOSM    PI-Service _N_TMPOSM(定位杂志或工具)

_N_TRESMO    PI-Service _N_TRESMO(重置监控值)

_N_TSEARC   PI-Service _N_TSEARC(通过搜索屏幕进行复杂搜索)

posted @ 2020-03-01 12:33  Db2k  阅读(3431)  评论(0编辑  收藏  举报