Universal Radio Hacker插件开发指南:扩展你的无线分析能力
Universal Radio Hacker(URH)是一款强大的无线协议分析工具,通过插件系统可以轻松扩展其功能。本文将带你从零开始开发URH插件,解锁自定义无线信号处理、协议解析和设备控制的能力。
插件系统架构
URH插件系统基于Python和Qt框架构建,采用模块化设计使扩展变得简单。核心组件包括:
- Plugin基类:所有插件的抽象基类,定义了插件的基本生命周期和接口
- PluginManager:负责插件的发现、加载和管理
- 插件接口:针对不同功能场景的专用插件类型(协议分析、SDR设备、信号编辑等)
核心插件类
插件开发的起点是继承src/urh/plugins/Plugin.py中的基类:
class Plugin(QObject):
enabled_changed = pyqtSignal()
def __init__(self, name: str):
super().__init__()
self.name = name
self.plugin_path = ""
self.description = ""
@property
def enabled(self) -> bool:
return self.__enabled
@enabled.setter
def enabled(self, value: bool):
# 启用状态变更逻辑
系统提供了三种专用插件类型:
- ProtocolPlugin:协议分析和处理扩展
- SDRPlugin:软件无线电设备支持
- SignalEditorPlugin:信号编辑功能扩展
开发环境搭建
准备工作
-
克隆项目仓库:
git clone https://gitcode.com/gh_mirrors/ur/urh.git cd ur/urh -
安装依赖:
pip install -r data/requirements.txt -
配置开发环境:
python setup.py develop
插件目录结构
URH插件采用标准化的目录结构,新建插件需遵循以下格式:
plugins/
└── YourPluginName/
├── __init__.py
├── YourPluginNamePlugin.py # 插件主类
├── descr.txt # 插件描述
├── settings.ui # 设置界面(可选)
└── icons/ # 图标资源(可选)
可以参考现有插件如plugins/FlipperZeroSub/或plugins/RfCat/的结构。
开发第一个协议插件
让我们创建一个简单的协议解析插件,用于解析自定义无线协议。
1. 创建插件文件
新建文件src/urh/plugins/MyProtocolPlugin/MyProtocolPlugin.py:
from urh.plugins.Plugin import ProtocolPlugin
from PyQt5.QtWidgets import QUndoCommand
class MyProtocolPlugin(ProtocolPlugin):
def __init__(self):
super().__init__("MyProtocolPlugin")
self.description = "自定义协议解析插件示例"
def get_action(self, parent, undo_stack: QUndoStack, sel_range, groups, view: int) -> QUndoCommand:
"""实现协议处理逻辑"""
return MyProtocolUndoCommand(parent, sel_range, groups)
class MyProtocolUndoCommand(QUndoCommand):
def __init__(self, parent, sel_range, groups):
super().__init__("解析自定义协议")
self.parent = parent
self.sel_range = sel_range
self.groups = groups
def redo(self):
# 实现协议解析逻辑
for group in self.groups:
for message in group.messages:
# 处理消息数据
self.parse_message(message)
def parse_message(self, message):
"""解析消息内容的自定义逻辑"""
data = message.decoded_bits_str
# 添加自定义解析代码
message.add_protocol_label(0, 8, "自定义字段", "解析结果")
2. 添加插件描述
创建src/urh/plugins/MyProtocolPlugin/descr.txt:
自定义协议解析插件
这是一个URH插件开发示例,用于演示如何扩展协议解析功能。
支持自定义无线协议的解码和分析。
3. 实现设置界面(可选)
如果插件需要用户配置,可以创建Qt设计器文件src/urh/plugins/MyProtocolPlugin/settings.ui:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>300</width>
<height>200</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QCheckBox" name="checkBox">
<property name="text">
<string>启用高级解析</string>
</property>
</widget>
</item>
</layout>
</widget>
</ui>
4. 注册插件
编辑src/urh/plugins/init.py,添加插件入口:
from .MyProtocolPlugin.MyProtocolPlugin import MyProtocolPlugin
插件加载与测试
测试插件
-
启动URH并测试插件:
python src/urh/main.py -
启用插件:
- 打开设置(Options)
- 切换到插件标签页
- 勾选你的插件
- 点击应用
调试技巧
-
使用日志记录:
from urh.util.Logger import logger logger.info("插件加载成功") -
断点调试:
python -m debugpy --wait-for-client --listen 5678 src/urh/main.py -
查看插件加载状态: 检查URH日志文件或使用cli/test_cli_parsing.py进行自动化测试。
高级功能开发
信号处理扩展
通过SignalEditorPlugin可以添加自定义信号处理功能,例如噪音过滤或特殊调制解调:
from urh.plugins.Plugin import SignalEditorPlugin
class MySignalPlugin(SignalEditorPlugin):
def __init__(self):
super().__init__("MySignalPlugin")
def process_signal(self, signal):
"""处理信号数据"""
# 获取IQ数据
iq_data = signal.iq_samples
# 应用自定义滤波
processed_data = self.custom_filter(iq_data)
# 更新信号
signal.iq_samples = processed_data
return signal
def custom_filter(self, data):
"""实现自定义信号滤波算法"""
# 添加信号处理代码
return filtered_data
设备支持扩展
开发SDRPlugin可以添加对新硬件的支持,参考src/urh/plugins/RfCat/实现:
from urh.plugins.Plugin import SDRPlugin
from urh.dev.VirtualDevice import VirtualDevice
class MySDRPlugin(SDRPlugin):
def __init__(self):
super().__init__("MySDRPlugin")
def get_device(self):
"""返回自定义设备实现"""
return MyVirtualDevice()
class MyVirtualDevice(VirtualDevice):
# 实现设备接口
def __init__(self):
super().__init__()
self.name = "My Custom SDR"
def start_rx_mode(self):
# 实现接收模式启动逻辑
pass
def send_samples(self, samples):
# 实现发送样本逻辑
pass
插件打包与分发
打包插件
将插件打包为ZIP文件,结构如下:
MyProtocolPlugin.zip
├── MyProtocolPlugin/
│ ├── __init__.py
│ ├── MyProtocolPlugin.py
│ ├── descr.txt
│ └── settings.ui
└── plugin.json
plugin.json内容:
{
"name": "MyProtocolPlugin",
"version": "1.0",
"author": "Your Name",
"description": "自定义协议解析插件",
"compatibility": "3.6.0+"
}
安装插件
通过URH的插件管理界面安装打包好的插件:
- 打开URH设置
- 切换到"Plugins"标签
- 点击"Install Plugin"
- 选择打包好的ZIP文件
实用资源与示例
官方资源
- 插件API文档:src/urh/plugins/Plugin.py
- 插件管理器实现:src/urh/plugins/PluginManager.py
- 测试用例:tests/plugins/
示例插件
- FlipperZeroSub:plugins/FlipperZeroSub/ - 支持Flipper Zero设备
- RfCat:plugins/RfCat/ - RfCat设备集成
- InsertSine:plugins/InsertSine/ - 信号生成插件
社区资源
- 插件开发讨论:README.md
- 问题跟踪:通过项目仓库的issue系统
- 贡献指南:CONTRIBUTING.md
总结与展望
通过URH插件系统,你可以轻松扩展无线协议分析功能,无论是自定义协议解析、新硬件支持还是信号处理算法,都可以通过插件实现。随着URH的不断发展,插件系统将支持更多功能,如机器学习模型集成、云端数据同步等。
鼓励开发者:
- 从简单功能开始,逐步构建复杂插件
- 参考现有插件实现
- 参与社区讨论,分享你的插件
- 关注项目更新,及时适配新API
现在,你已经掌握了URH插件开发的基础知识,是时候开始构建你的第一个插件,探索无线世界的无限可能了!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



