【网络安全】——协议逆向与频繁序列提取:从流量中解码未知协议
目录
引言
一、为什么要结合频繁序列提取?
二、四步融合分析法
步骤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%的生死线。然而,通过张驰咨询的六西格玛方法论ÿ…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...

Day131 | 灵神 | 回溯算法 | 子集型 子集
Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣(LeetCode) 思路: 笔者写过很多次这道题了,不想写题解了,大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

深入理解JavaScript设计模式之单例模式
目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式(Singleton Pattern&#…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

实战三:开发网页端界面完成黑白视频转为彩色视频
一、需求描述 设计一个简单的视频上色应用,用户可以通过网页界面上传黑白视频,系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观,不需要了解技术细节。 效果图 二、实现思路 总体思路: 用户通过Gradio界面上…...

Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...