在 Peach 模糊测试框架中,“建议优先使用内置 relation 类型(offset/size/length 等),必要时再通过 C# 扩展” 这句话的含义需要从以下两个层面理解:
1. 优先使用内置 relation 类型
含义
- Peach 原生支持的
offset
/size
/length
等关系类型已覆盖90%的协议场景。 - 这些内置类型无需编程即可实现字段间的动态关联。
典型场景
- offset: 用于标记偏移量(如数据包头部指向有效载荷的偏移位置)
<Number name="OffsetField"><Relation type="offset" of="PayloadBlock"/> <!-- 自动计算Payload的偏移量 --> </Number>
- size: 自动根据数据块大小填充数值字段(如IP包头部的Total Length字段)
<Number name="LengthField" size="16"><Relation type="size" of="DataBlock"/> <!-- DataBlock的字节长度自动填入LengthField --> </Number>
- length: 约束数据块长度(如字符串长度与前置长度字段匹配)
<String name="MyString" length="10"><Relation type="length" of="LengthField"/> <!-- 确保字符串长度为LengthField的值 --> </String>
优势
- 零开发成本:直接通过 XML 配置即可使用
- 稳定性高:经过 Peach 官方测试验证
- 性能优化:内置类型有底层加速机制
2. 必要时通过 C# 扩展
适用场景
当遇到特殊业务逻辑无法用内置类型实现时:
- 需要两个字段严格相等(如
FieldA == FieldB
) - 需要复杂计算(如根据多个字段的值联合计算校验码)
- 需要动态条件约束(如根据协议版本号切换字段关联方式)
实现流程
-
创建 C# 类库项目
// EqualToRelation.cs using Peach.Core.Dom;[Relation("equalTo", true)] // 声明关系类型名为"equalTo" public class EqualToRelation : Relation {public override void Apply(DataElement container){var src = container.Find(fromName); // 获取源字段var dst = container.Find(ofName); // 获取目标字段dst.DefaultValue = src.InternalValue; // 强制同步值} }
-
编译为 DLL
csc /target:library /reference:PeachCore.dll EqualToRelation.cs
-
在 Pit 文件中引用
<Include ns="CustomRelations" import="CustomRelations.dll"/> <DataModel name="Example"><Number name="FieldA"><Relation type="equalTo" of="FieldB"/> <!-- 自定义关系 --></Number><Number name="FieldB" value="42"/> </DataModel>
关键注意事项
-
版本兼容性
- 需确保
PeachCore.dll
的版本与当前 Peach 运行环境完全一致 - 不同版本的 Peach 可能有 API 变更,导致自定义 DLL 无法加载
- 需确保
-
部署复杂性
- 每次修改自定义 Relation 代码后,必须重新编译部署 DLL
- 需要将生成的 DLL 分发到所有运行 Peach 的机器
-
调试成本
- 自定义代码的调试需要附加到 Peach 进程
- 错误的自定义 Relation 可能导致 Peach 运行时崩溃
总结建议
- 优先尝试组合内置关系类型(例如用
offset
+size
实现复合约束) - 仅在绝对必要时使用 C# 扩展
- 如果必须扩展,建议将自定义代码封装为独立插件,与主 Pit 文件解耦