【网络安全】——协议逆向与频繁序列提取:从流量中解码未知协议
目录
引言
一、为什么要结合频繁序列提取?
二、四步融合分析法
步骤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%的生死线。然而,通过张驰咨询的六西格玛方法论ÿ…...
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
uniapp手机号一键登录保姆级教程(包含前端和后端)
目录 前置条件创建uniapp项目并关联uniClound云空间开启一键登录模块并开通一键登录服务编写云函数并上传部署获取手机号流程(第一种) 前端直接调用云函数获取手机号(第三种)后台调用云函数获取手机号 错误码常见问题 前置条件 手机安装有sim卡手机开启…...
