【网络安全】——协议逆向与频繁序列提取:从流量中解码未知协议
目录
引言
一、为什么要结合频繁序列提取?
二、四步融合分析法
步骤1:原始流量采集与预处理
步骤2:多粒度序列模式挖掘
层1:单包内字节级频繁项
层2:跨数据包的行为序列
步骤3:关键字段定位与结构假设
通过频繁模式推导协议结构:
步骤4:动态验证与协议还原
三、实战案例:Pj某工控设备协议
背景
关键发现过程
四、对抗干扰策略
常见干扰类型与破解技巧
五、工具链推荐
六、总结
引言
在工业控制、物联网设备通信等场景中,面对私有协议时,工程师常陷入**“盲人摸象”**的困境——没有文档、没有符号信息,只有一串串难以理解的十六进制数据流。本文将提出一种创新方法:将频繁序列提取技术融入协议逆向工程,通过挖掘数据中的统计规律,快速定位协议头、指令类型、校验位等关键字段,大幅提升逆向效率。
一、为什么要结合频繁序列提取?
传统协议逆向依赖人工比对数据包差异,存在三大痛点:
-
效率低下:数百个数据包需逐一对比
-
主观性强:依赖经验猜测字段含义
-
易漏特征:难以发现长跨度关联
频繁序列提取的价值:
-
自动发现高频出现的固定字节序列(如协议头、状态码)
-
识别指令与响应的关联模式(如A指令必触发B响应)
-
定位变长字段的分隔符(如0x00结尾的字符串)
二、四步融合分析法
步骤1:原始流量采集与预处理
使用Wireshark捕获原始流量,按会话切分并转换为字节序列:
# 示例:从pcap提取TCP负载序列
from scapy.all import *packets = rdpcap("unknown_protocol.pcap")
sessions = packets.sessions()byte_sequences = []
for session in sessions.values():tcp_payloads = [bytes(p[TCP].payload) for p in session if TCP in p]if tcp_payloads: byte_sequences.append(tcp_payloads) # 每个会话的包序列
步骤2:多粒度序列模式挖掘
层1:单包内字节级频繁项
from mlxtend.frequent_patterns import apriori# 将每个字节位置视为一个项(item)
# 示例数据包: [0xaa, 0x01, 0xff], [0xaa, 0x02, 0xee]
transactions = [{'pos0:aa', 'pos1:01', 'pos2:ff'},{'pos0:aa', 'pos1:02', 'pos2:ee'}
]freq_items = apriori(transactions, min_support=0.5, use_colnames=True)
print(freq_items)
输出:
support itemsets
0 1.0 (pos0:aa) # 发现协议头固定为0xAA
层2:跨数据包的行为序列
使用PrefixSpan挖掘会话级操作码序列:
# 假设已从数据包中提取操作码(如第二个字节)
opcode_sequences = [[0x01, 0x03, 0x04], # 会话1的操作码流[0x01, 0x04], # 会话2[0x01, 0x03, 0x04] # 会话3
]from prefixspan import PrefixSpan
ps = PrefixSpan(opcode_sequences)
ps.minlen = 2
freq_seqs = ps.frequent(2) # 最小支持度2次# 输出:[(2, [0x01, 0x03]), (2, [0x01, 0x03, 0x04])]
结论:操作码0x01后常跟0x03,可能为登录→查询信息的固定流程。
步骤3:关键字段定位与结构假设
通过频繁模式推导协议结构:
字段位置 | 候选假设 | 验证方法 |
---|---|---|
字节0 | 固定头(Magic Number) | 全样本一致性检查 |
字节1 | 指令类型(高频出现0x01) | 触发不同功能观察响应变化 |
字节4-5 | 长度字段(与后续数据长度相关) | 计算Pearson相关系数 |
末2字节 | 校验和(与前面数据存在数学关系) | 尝试CRC16/CRC32计算匹配 |
步骤4:动态验证与协议还原
编写脚本自动化验证假设:
def validate_checksum(packet):assumed_crc = packet[-2:]calculated_crc = crc16(packet[:-2])return assumed_crc == calculated_crcvalid_count = 0
for p in packets:if validate_checksum(p):valid_count +=1print(f"校验通过率: {valid_count/len(packets)*100}%")
# 若通过率接近100%,则确认校验位假设正确
三、实战案例:Pj某工控设备协议
背景
某PLC设备通信协议未知,需实现以下功能逆向:
-
读取寄存器值(功能码)
-
设置设备地址(地址字段)
-
异常状态码解析
关键发现过程
-
频繁头定位:
80%的数据包以0x48 0x53
开头 → 确认为协议头 -
指令类型推断:
第3字节出现0x01(读)和0x02(写)的频率最高 → 功能码字段 -
地址字段验证:
# 对比两个写地址请求包:
Packet1: 48 53 02 00 01 02 [00 00 00 01] ...
Packet2: 48 53 02 00 01 02 [00 00 00 02] ...
# 响应包中地址字段变化 → 确认第7-10字节为设备地址
4. 错误码提取:
当响应包第4字节为0xFF时,末字节出现0x01/0x02 → 错误子码
四、对抗干扰策略
常见干扰类型与破解技巧
干扰手段 | 破解方法 |
---|---|
随机填充字节 | 过滤低频率项,关注稳定出现的字段 |
多协议复用 | 先聚类(如按端口、包长),再分别分析 |
字段动态编码 | 寻找编码前后的统计特征(如字节分布变化) |
心跳包干扰 | 剔除固定时间间隔的无关包 |
五、工具链推荐
-
流量预处理:Wireshark + Scapy(Python)
-
序列挖掘:SPMF(支持GSP、PrefixSpan算法)
-
自动化验证:Python + pwntools(自定义协议测试脚本)
-
可视化分析:NetworkX(绘制协议状态转移图)
六、总结
“数据即协议”——通过融合频繁序列提取与协议逆向技术,开发者能在无先验知识的情况下,快速定位关键字段并推测交互逻辑。该方法尤其适用于具有明显统计特征的私有协议逆向场景。
方法论价值:
-
将人工经验转化为可量化的模式识别
-
为协议逆向提供自动化切入点
-
降低对特定领域知识的依赖
扩展阅读标签:#协议逆向 #频繁序列 #工控安全 #Python #Wireshark
相关文章:

【网络安全】——协议逆向与频繁序列提取:从流量中解码未知协议
目录 引言 一、为什么要结合频繁序列提取? 二、四步融合分析法 步骤1:原始流量采集与预处理 步骤2:多粒度序列模式挖掘 层1:单包内字节级频繁项 层2:跨数据包的行为序列 步骤3:关键字段定位与结构假…...

CSS 中等比例缩放的演变:从传统技巧到 aspect-ratio 属性
CSS 中等比例缩放的演变:从传统技巧到 aspect-ratio 属性 在响应式网页设计和多设备兼容成为主流的今天,如何实现元素的等比例缩放成为前端开发中一个重要的课题。无论是图片、视频还是其他容器,都常常需要保持固定的宽高比,以便…...

系统架构设计师—计算机基础篇—进度管理
文章目录 基本概念进程的特征进程的状态前趋图 进程的通信进程的互斥做题方法 进程的同步PV操作做题方法 基本概念 进程的特征 进程通常由程序、数据集合、进程控制块PCB组成。 PCB是一种数据结构,是进程存在的唯一标识。 组织方式说明线性方式把所有PCB组织在一…...

初始提示词(Prompting)
理解LLM架构 在自然语言处理领域,LLM(Large Memory Language Model,大型记忆语言模型)架构代表了最前沿的技术。它结合了存储和检索外部知识的能力以及大规模语言模型的强大实力。 LLM架构由外部记忆模块、注意力机制和语…...

Ollama+AnythingLLM安装
一、文件准备 1. 安装包获取 从联网设备下载: AnythingLLMDesktopInstaller.exe(官网离线安装包) deepseek-r1-1.5b.gguf(1.5B 参数模型文件) 2. 传输介质 使用 U 盘或移动硬盘拷贝以下文件至离线设…...

docker拉取失败
备份原始配置文件 sudo cp /etc/docker/daemon.json /etc/docker/daemon.json.bak 清理或修复 daemon.json 文件 sudo nano /etc/docker/daemon.json 删除 文件中的所有内容,确保文件为空。 cv下面这个文件内容 { "registry-mirrors": [ &…...

PHP之Cookie和Session
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于cookie和session的信息。 Cookie 参数信息 setcookie(name,value,expire, path, domain); name : Cookie的名称。 value : Cookie的值。 expire : Cookie的过期时间,可以是一…...

【万字长文】基于大模型的数据合成(增强)及标注
写在前面 由于合成数据目前是一个热门的研究方向,越来越多的研究者开始通过大模型合成数据来丰富训练集,为了能够从一个系统的角度去理解这个方向和目前的研究方法便写了这篇播客,希望能对这个领域感兴趣的同学有帮助! 欢迎点赞&…...

CES Asia 2025增设未来办公教育板块,科技变革再掀高潮
作为亚洲消费电子领域一年一度的行业盛会,CES Asia 2025(第七届亚洲消费电子技术贸易展)即将盛大启幕。今年展会规模再度升级,预计将吸引超过500家全球展商参展,专业观众人数有望突破10万。除了聚焦人工智能、物联网、…...

Python详细安装教程——Python及PyCharm超详细安装教程:新手小白也能轻松搞定!(最新版)
Python作为一门简单易学、功能强大的编程语言,近年来在数据分析、人工智能、Web开发等领域广受欢迎。而PyCharm作为一款专业的Python集成开发环境(IDE),提供了强大的代码编辑、调试和项目管理功能,是Python开发者的得力…...

游戏引擎学习第137天
演示资产系统中的一个 bug 我们留下了个问题,你现在可以看到,移动时它没有选择正确的资产。我们知道问题的原因,就在之前我就预见到这个问题会出现。问题是我们的标签系统没有处理周期性边界的匹配问题。当处理像角度这种周期性的标签时&…...

RAGflow升级出错,把服务器灌满了
使用自动化更新命令,从16升级到17,结果发现出现了大问题,不断下载,一直无法下载完毕。 df -h 直接把服务器搞满了。哈哈哈哈~。查看一下: sudo du -sh /var/lib/docker确认是docker里面安装的ragflow有问题。所以&am…...

[数字图像处理]直方图规定化
这里分别使用基于像素手动计算、调用工具箱函数两种方法实现直方图规定化 1.基于像素进行直方图规定化 (1)读取了原始图像和期望图像,并将它们转换为灰度图像 (2)计算原始图像和期望图像的像素概率分布直方图P(i)和…...

OpenMCU(一):STM32F407 FreeRTOS移植
概述 本文主要描述了STM32F407移植FreeRTOS的简要步骤。移植描述过程中,忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程,该工程已经下载放好了移植stm32f407 FreeRTOS的所有文件 OpenMCU_FreeRTOS工…...

Redis - 高可用实现方案解析:主从复制与哨兵监控
文章目录 Pre概述Redis 高可用实现方案一、主从复制机制1.1 全量同步流程1.2 增量同步(PSYNC)流程 二、哨兵监控机制2.1 故障转移时序流程 三、方案对比与选型建议四、生产环境实践建议 Pre Redis-入门到精通 Redis进阶系列 Redis进阶 - Redis主从工作…...

SPI硬件设计及通信原理解析
SPI(Serial Peripheral interface,串行外围设备接口),是一种高速的,全双工,同步通信总线。 SPI采用主从控制模式(Master--Slave)架构,一般有1个主设备、一个或多个从设备,使得主设备可以与多个从设备之间实现片间通信。 SPI在芯片管脚中只占用四根线节约了芯片的管脚…...

腾讯云物联网平台(IoT Explorer)设备端使用
1、直接看图流程 2、跑起来demo,修改产品id,设备名称,设备秘钥。 3、连接部分 4、修改默认地址和端口 sdk里面的地址默认是带着产品ID拼接的,咱们现在中铁没有泛域名解析,要改下这里。把+productID都去掉,然后地址里的.也去掉。...

elk的相关的基础
以下是关于ELK(Elasticsearch, Logstash, Kibana)的200个基础问题及其答案,涵盖了ELK的核心概念、组件、配置、使用场景、优化等方面。 Elasticsearch 基础 **什么是Elasticsearch?** 答:Elasticsearch是一个分…...

结合PyMuPDF+pdfplumber,删除PDF指定文本后面的内容
🚀 一、需求场景解析 在日常办公中,我们经常会遇到这样的痛点: 合同处理:收到上百份PDF合同,需要找到"签署页"之后的内容并删除报表加工:批量移除财务报表中的敏感数据区域文档归档:快速提取技术文档的关键章节传统的手动操作方式存在三大致命缺陷: ❗ 耗时…...

张驰咨询:用六西格玛重构动力电池行业的BOM成本逻辑
在动力电池行业,BOM(物料清单)成本每降低1%,都可能改写企业的利润曲线。某头部企业的三元锂电池BOM成本曾较行业标杆高出11%,单电芯利润率被压缩至3%的生死线。然而,通过张驰咨询的六西格玛方法论ÿ…...

【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解
摘要 本文分类使用的是resNet34,什么不用yolo v8,yolo v10系列,虽然他们也可以分类,因为yolo系列模型不纯粹,里面包含了目标检测的架构,所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…...

《基于HarmonyOS NEXT API 12+,搭建新闻创作智能写作引擎》
在信息爆炸的时代,新闻行业对于内容生产的效率和质量有着极高的要求。AI技术的发展为新闻创作带来了新的变革契机,借助AI智能写作助手,新闻工作者可以快速生成新闻稿件的初稿,大大提高创作效率。本文将基于HarmonyOS NEXT API 12及…...

python代码注释方式
在 Python 中,注释是用于解释代码、提高代码可读性和可维护性的重要工具。Python 支持两种主要的注释方式:单行注释和多行注释。此外,Python 还支持文档字符串(docstrings),用于为模块、函数、类和方法提供…...

小哆啦解题记:螺旋矩阵
小哆啦开始刷力扣的第二十八天 54. 螺旋矩阵 - 力扣(LeetCode) 🌪️ 一场螺旋风暴的较量 在一个阳光明媚的午后,小哆啦悠闲地坐在窗边啃着曲奇,突然,一道神秘的光芒闪过,小智从代码的虚空中出现…...

【C#】委托是什么
在 C# 中,委托(Delegate) 是一种类型安全的函数指针,可以将方法作为参数传递或者保存方法的引用。下面详细介绍一下委托的相关概念和用法: 1. 基本概念 类型安全:委托在声明时会指定方法的返回类型和参数…...

[Lc(2)滑动窗口_1] 长度最小的数组 | 无重复字符的最长子串 | 最大连续1的个数 III | 将 x 减到 0 的最小操作数
目录 1. 长度最小的字数组 题解 代码 ⭕2.无重复字符的最长子串 题解 代码 3.最大连续1的个数 III 题解 代码 4.将 x 减到 0 的最小操作数 题解 代码 1. 长度最小的字数组 题目链接:209.长度最小的字数组 题目分析: 给定一个含有 n 个 正整数 的数组…...

迷你世界脚本玩家接口:Player
玩家接口:Player 彼得兔 更新时间: 2024-07-28 17:49:05 继承自 Actor 具体函数名及描述如下: 序号 函数名 函数描述 1 getAttr(...) 玩家属性获取 2 setAttr(...) 玩家属性设置 3 getHostUin(...) 获取房主uin 4 isMainPlayer(...) …...

三、0-1搭建springboot+vue3前后端分离-springboot整合mybatis plus 之本地安装mysql
一、安装mysql: 官网下载:https://dev.mysql.com/downloads/mysql/?spm5176.28103460.0.0.40f75d27Stx4Xj 网盘分享:http://链接: https://pan.baidu.com/s/1mS_-VxrKAeRL3utBvD64gg?pwd6666 提取码: 6666 复制这段内容后打开百度网盘手机…...

市场趋势解析与交易策略优化
市场趋势解析与交易策略优化 在市场环境不断变化的情况下,理解市场趋势并优化交易策略是交易者稳健发展的关键。通过科学的方法识别市场动向,结合数据分析优化交易方案,可以提高交易效率并降低风险。本文将探讨趋势分析的要点,并介…...

Spring Boot 常用注解全解析:从核心到进阶的实践指南
目录 引言:为什么注解是Spring Boot开发者的“战略武器”? 一、核心启动注解 1.1 应用启动三剑客 二、Web开发注解 2.1 控制器层注解 三、依赖注入注解 3.1 依赖管理矩阵 四、数据访问注解 4.1 JPA核心注解 五、配置管理注解 5.1 配置绑定注解…...