西门子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(通过搜索屏幕进行复杂搜索)