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),数据负载结构如下
请求读取:
1 | [起始地址] (4 bytes, 地址格式取决于 PLC 内存区域) |
请求写入:
1 | [起始地址] (4 bytes) |
响应:
1 | [数据字节数] (1 byte, 表示后续数据的字节长) |
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 协议
1 | ip.src == 192.168.2.191 && |

第一个包的 Data 如下
1 | 4c 53 49 53 2d 58 47 54 00 00 00 00 a0 33 00 00 16 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
1 | flag{c93650241853da240f9760531a79cbcf} |