LSIS-XGT 协议
概述
LSIS-XGT 可以把它理解成:LS ELECTRIC / 原 LSIS 系列 PLC 的专用以太网通信协议。它主要用于 PC、HMI、上位机、工程软件 和 PLC 之间读写 PLC 内部数据区。官方手册里也说,XGT dedicated / XGT server protocol 支持通过命令进行读写,PC、HMI 可以用它和 PLC 通信
默认端口
| 协议 | 传输层 | 默认端口 |
|---|---|---|
| XGT dedicated / XGT server | TCP | 2004 |
| XGT dedicated / XGT server | UDP | 2005 |
| Modbus TCP | TCP | 502 |
特征
它的典型特征是 TCP payload 开头有固定公司标识
1 | 4c 53 49 53 2d 58 47 54 |
报文结构
一个完整 TCP payload 大概是
1 | ┌──────────────────────────────┐ |
Header
XGT 的应用层头部长度通常是 20 字节。字段如下
| 偏移 | 长度 | 字段 | 说明 |
|---|---|---|---|
0x00 |
8 | Company ID | 固定字符串 LSIS-XGT |
0x08 |
2 | Reserved / Company 扩展 | 通常为保留字段 |
0x0A |
2 | PLC Info | PLC 状态/CPU 类型等信息,客户端请求时通常不用关心 |
0x0C |
1 | CPU Info | CPU 系列信息,例如 XGK 常见 0xA0 |
0x0D |
1 | Source of Frame | 报文方向,客户端常见 0x33,PLC 响应常见 0x11 |
0x0E |
2 | Invoke ID | 会话/帧序号,请求和响应对应 |
0x10 |
2 | Length | 后面 Instruction 区长度 |
0x12 |
1 | FEnet Position | 通信模块位置,槽号/基号 |
0x13 |
1 | BCC / Checksum | 头部校验或保留校验 |
Command 字段
XGT 常见 4 类基础命令:
| 功能 | 逻辑值 | 报文中 |
|---|---|---|
| 读请求 | h0054 |
54 00 |
| 读响应 | h0055 |
55 00 |
| 写请求 | h0058 |
58 00 |
| 写响应 | h0059 |
59 00 |
Data Type 字段
Command 后面紧跟 Data Type,也是 2 字节。常见类型
| 类型 | 逻辑值 | 报文中 |
|---|---|---|
| Bit | h0000 |
00 00 |
| Byte | h0001 |
01 00 |
| Word | h0002 |
02 00 |
| DWord | h0003 |
03 00 |
| LWord | h0004 |
04 00 |
| Continuous / 连续块读写 | h0014 |
14 00 |
连续读请求结构
1 | Header |
具体字段如下:
| 偏移,相对于 Instruction 起点 | 长度 | 字段 | 说明 |
|---|---|---|---|
+0x00 |
2 | Command | 54 00,读请求 |
+0x02 |
2 | Data Type | 14 00,连续块 |
+0x04 |
2 | Reserved | 一般 00 00 |
+0x06 |
2 | Number of Blocks | 连续读固定 01 00 |
+0x08 |
2 | Variable Length | 变量名长度 |
+0x0A |
N | Variable Name | ASCII,例如 %PB100 |
+0x0A+N |
2 | Number of Data | 要读取多少字节 |
连续读响应结构
1 | Header |
字段如下:
| 偏移,相对于 Instruction 起点 | 长度 | 字段 | 说明 |
|---|---|---|---|
+0x00 |
2 | Command | 55 00,读响应 |
+0x02 |
2 | Data Type | 14 00,连续块 |
+0x04 |
2 | Reserved | 保留字段 |
+0x06 |
2 | Error Status | 00 00 表示正常 |
+0x08 |
2 | Number of Blocks | 正常时通常 01 00 |
+0x0A |
2 | Number of Data | 返回数据长度 |
+0x0C |
N | Data | 真正读取到的数据 |
实战案例
协议分析又来了(LSIS-XGT 工控协议)

统计会话中的主要端口是 2004

过滤 tcp.port == 2004,发现明显特征

过滤器直接搜 tcp contains "LSIS-XGT"

使用 tshark 提取上面这些数据出来
1 | tshark -r .\capture.pcapng -Y "tcp.port == 2004 && tcp.len > 0" -T fields -e tcp.payload > xgt_payloads.txt |
编写脚本解析
1 | import re |

总结出规律地址
1 | %PB100 |
修改脚本,按照这些顺序拼接数据得到
1 | # 1. 新增字典,用于存储符合条件的数据块(地址 -> 响应数据) |
文件开头是 b2 a5 6f ff fc ff ff ff fb ff ff ff 00 00 ff ff,对其异或 0xff 得到 4d 5a 90 00 ...
4d 5a 就是 Windows EXE 的 MZ 文件头
1 | raw = open("raw_pb.bin", "rb").read() |
从字符串中识别出它是一个 .NET / WPF 程序

IDA 反编译发现一堆数值

这种格式在 WPF 里非常像 Margin="62,62,0,0"
1 | strings -a flag.exe | grep -E "[0-9]+,[0-9]+,0,0" |
提取出来类似于 UI 布局

编写脚本绘图拿到 flag
1 | import re |
