首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >试图构建一个带有替罪羊的MODBUS包

试图构建一个带有替罪羊的MODBUS包
EN

Stack Overflow用户
提问于 2016-08-31 12:23:15
回答 2查看 2.7K关注 0票数 1

我正在尝试构建一个带有替罪羊的MODBUS包,但是Wireshark无法识别它。我的意思是,MODBUS被解释为TCP数据.

下面是Scapy的python代码:

代码语言:javascript
运行
复制
from scapy.all import *


class Modbus(Packet):
    name = "Modbus/tcp"
    fields_desc = [ ShortField("Transaction Identifier", 1),
                    ShortField("Protocol Identifier", 0),
                    ShortField("Length", 5),
                    XByteField("Unit Identifier",0),
                    ]

def make_test():
    pkt = TCP(sport=502, dport=502)
    return Ether()/IP(src="5.5.5.101",dst="5.5.5.100")/pkt/Modbus()


while True:
    send(make_test())

有人知道怎么修理它吗?

EN

回答 2

Stack Overflow用户

发布于 2019-10-24 10:53:10

我运行了相同的代码并进行了2次更改,Wireshark将其识别为Modbus:

首先,在发送空数据包(n=0)时,长度字段的默认值必须是2,而不是5(根据维基百科,n+2)。

第二,您错过了字段函数代码。

最后,我的fields_desc看起来是这样的:

代码语言:javascript
运行
复制
fields_desc = [ ShortField("Transaction Identifier", 1),
                    ShortField("Protocol Identifier", 0),
                    ShortField("Length", 2),
                    XByteField("Unit Identifier",0),
                    ByteField("Function Code", 0)
                    ]

Wireshark抱怨是因为0实际上不是一个有效的函数代码,但它正确地将其解释为modbus。

票数 1
EN

Stack Overflow用户

发布于 2021-08-10 14:33:04

在您的代码中没有3路TCP握手,这意味着主机之间没有建立通信通道。为了解决这个问题,需要创建套接字。

这是我的代码,可能对其他人有帮助。

代码语言:javascript
运行
复制
from scapy.all import *
import time

# Modbus ADU
class ModbusTCP(Packet):
    name = "Modbus/TCP"
    fields_desc = [ ShortField("Transaction Identifier", 1),
                    ShortField("Protocol Identifier", 0),
                    ShortField("Length", 6),
                    XByteField("Unit Identifier", 247),
                    ]

# Modbus PDU
class Modbus(Packet):
    name = "Modbus"
    fields_desc = [ XByteField("Function Code", 4),
                    ShortField("Reference Number", 1),
                    ShortField("Word Count", 2),
                    ]

# Create a socket and connect
s = socket.socket()
s.connect(("192.168.95.10", 502))   # IP and port
ss = StreamSocket(s, Raw)

while True:
    try:
        # Encapsulate modbus inside the raw data, then send and receive
        # Anything can be done with response
        ss.sr1(Raw(ModbusTCP()/Modbus()))
        time.sleep(1)
    except KeyboardInterrupt:
        break

参考文献:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39249572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档