LSIS FEnet 协议¶
LSIS XGB Fast Ethernet 模块(即 FEnet I/F 模块,型号如 XGL-EFMT、XGL-EFMF 等)是 LS 电气(原 LS 产电)PLC 用于高速通信的接口模块。它使用专有的 LSIS FEnet 协议
封装与传输¶
LSIS FEnet 协议主要运行在以下传输层上:
| 用途 | 传输层 | 端口 |
|---|---|---|
| XGT 服务(上位/主站请求) | TCP | 2004 |
| Fast Ethernet 通信(主站直连) | UDP | 2005 |
| DLINK(专有总线) | 数据链路层 | - |
报文结构¶
LSIS FEnet 报文由 20 字节的专有头部 + 具体数据/命令体组成
| 偏移 | 长度(字节) | 字段名 | 含义 |
|---|---|---|---|
0x00 |
2 | LSIS_Header | 协议标识符,固定为 0x4C53 ("LS") |
0x02 |
2 | Reserved1 | 保留(通常为 0x0000) |
0x04 |
2 | Command | 命令码(详见下文) |
0x06 |
2 | DataType | 数据类型(Bit/Byte/Word) |
0x08 |
2 | Reserved2 | 保留/填充(部分版本用作帧长) |
0x0A |
2 | BlockNum | 操作数量(读取/写入的块数) |
0x0C |
2 | FrameLen | 后续数据体的长度 |
0x0E |
2 | ErrorCode | 错误码(响应时有效,请求为 0) |
0x10 |
2 | SourceCPU | 源 CPU 编号/槽位 |
0x12 |
2 | DestCPU | 目标 CPU 编号/槽位 |
0x14 |
N | Data | 数据负载(具体取决于命令) |
核心字段¶
命令码¶
命令码决定了此报文是读还是写,以及操作的对象类型。常见值如下:
| 码值 | 功能 | 方向 |
|---|---|---|
0x0000 |
连接请求/心跳 | C→S |
0x0011 |
直接变量读 | C→S |
0x0014 |
直接变量写 | C→S |
0x0018 |
连续地址读 | C→S |
0x0019 |
连续地址写 | C→S |
0x00A0 |
响应(带数据) | S→C |
0x00C1 |
连接确认 | S→C |
数据类型¶
| 值 | 含义 | 大小 |
|---|---|---|
0x0001 |
Bit(位) | 1 bit |
0x0003 |
Byte | 1 字节 |
0x0004 |
Word | 2 字节 |
0x0006 |
DWord | 4 字节 |
0x0007 |
LWord | 8 字节 |
错误码¶
仅在响应报文中有意义。0x0000 表示成功。常见错误码如 0x0F04(地址越界)等
数据负载结构(读取/写入)¶
如果命令是读写连续地址(0x0018/0x0019),数据负载结构如下
请求读取:
请求写入:
响应:
PLC 内存地址编码¶
在写入/读取时,地址字段需根据 PLC 内存区域进行编码。例如 XGB 系列(XBC, XBM, XGK 等)的常用地址映射:
| 区域 | 地址码 | 说明 |
|---|---|---|
| P | 0x5058 | I/O 接触点 |
| M | 0x4D58 | 内部继电器 |
| L | 0x4C58 | 锁存继电器 |
| K | 0x4B58 | 保持继电器 |
| D | 0x4458 | 数据寄存器 |
| U | 0x5558 | 模拟数据寄存器 |
实战案例¶
协议精准定位分析(LSIS XGB Fast Ethernet 模块协议)¶

此题与常规的 LSIS FEnet 协议不一样
查看会话只有这一组通信

考察 LSIS FEnet 协议,过滤出有用的 TCP 协议

第一个包的 Data 如下
4c 53 49 53 2d 58 47 54 00 00 00 00 a0 33 00 00 16 00
03 47 58 00 14 00 00 00 01 00 06 00 25 4d 42 32 30 30
04 00 7d 00 00 00
按照 PDF 解析如下:
| 偏移 | 字节数 | 值 | 说明 |
|---|---|---|---|
0x00 |
10 | 4c 53 49 53 2d 58 47 54 00 00 |
Company ID / LSIS ID,ASCII 为 "LSIS-XGT\0\0" |
0x0A |
2 | 00 00 |
PLC Information,PLC 信息字段,本报文值为 0x0000 |
0x0C |
1 | a0 |
CPU Information,CPU 类型/系列标识,值为 0xA0 |
0x0D |
1 | 33 |
Frame Direction,0x33 表示客户端发往 PLC 的请求帧 |
0x0E |
2 | 00 00 |
Invoke ID / Frame Order No.,请求序号,本报文为 0 |
0x10 |
2 | 16 00 |
Application Data Length,小端 0x0016 = 22 字节 |
0x12 |
1 | 03 |
Position Information,模块/站点位置信息 |
0x13 |
1 | 47 |
Header Checksum,XGT 头部校验和 |
0x14 |
2 | 58 00 |
Command,写请求,协议记作 0x5800 |
0x16 |
2 | 14 00 |
Data Type,连续字节类型,协议记作 0x1400 |
0x18 |
2 | 00 00 |
Reserved,保留字段 |
0x1A |
2 | 01 00 |
Number of Blocks,小端值 1,本次操作包含 1 个变量块 |
0x1C |
2 | 06 00 |
Variable Name Length,变量名长度为 6 字节 |
0x1E |
6 | 25 4d 42 32 30 30 |
变量名 ASCII:"%MB200" |
0x24 |
2 | 04 00 |
Data Count / Data Length,后续写入数据长度为 4 字节 |
0x26 |
4 | 7d 00 00 00 |
写入 %MB200 的连续 4 字节数据 |
而 7d 刚好是 },所以写入的数据是倒序的,把所有数据取出来过后得到 flag