资讯动态

Scapy 中的 CRC 计算与检测:scapy.libs.crc 模块实战指南

发布时间:2026/9/23 1:53:42 来源:尧图企业网站定制
网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载Scapy 作为基于 Python 的交互式数据包操作程序与库内置了一套可配置、可扩展的 CRC 校验算法框架集中实现在scapy.libs.crc模块中。本文将以 doc/scapy/advanced_usage/crc.rst 为主线结合 scapy/libs/crc.py 的源码实现与 test/scapy/crc.uts 回归测试系统讲解如何用 Scapy 计算校验和、按需定制多项式与反射参数、对大数据流做增量计算以及如何在一段二进制数据中自动定位内嵌的 CRC 值。读完本文你将能够直接在自定义协议解析、报文校验与逆向分析场景中使用这套 CRC 工具链。一、模块概览可配置的 CRC 算法框架scapy.libs.crc提供的不是单个写死的算法函数而是一整套算法即类的框架每个 CRC 变体都是一个继承自CRC基类的类类上声明了多项式、位宽、初始值等参数类的实例上下文对象可以被调用对bytes输入返回整数形式的校验和。模块公开的全部符号定义在 scapy/libs/crc.py 的__all__中包括CRC所有 CRC 算法的基类虚基类不注册进注册表CRCParam承载一组 CRC 算法参数的参数对象内置变体CRC_16、CRC_16_CCITT、CRC_16_X25、CRC_32、CRC_32C、CRC_32_AUTOSARWELL_KNOWN_POLY内置的已知多项式表供无注册表模式下的自动搜索使用。由于 scapy/all.py 中执行了from scapy.libs.crc import *你在from scapy.all import *之后即可直接使用上述所有名字无需额外导入。二、计算一个校验和这是最直接的用法选定一个 CRC 变体类直接对bytes调用它即可得到整数校验和。原文档给出的示例 from scapy.libs.crc import CRC_32 CRC_32(b123456789) 3421780262从源码看类的__call__方法scapy/libs/crc.py内部依次完成三件事_init()以init_crc为初值先吸收可选的header前缀字节_update(crc, msg)按逐字节查表法更新寄存器表由元类在类创建时基于多项式预计算见下文_finish(crc)吸收可选的trailer后缀、与xor异或、并按需做位反转当reflect_input与reflect_output不一致时。另外__call__中还有一条断言assert type(msg) is bytes因此传入参数必须是bytesbytearray或str都会报错。内置变体除了文档列出的 4 个源码中还额外提供了 2 个类名多项式 poly位宽init_crcxor反射输入/输出参考测试向量CRC_160x80051600True / Trueb123456789→ 0xbb3dCRC_320x04c11db7320xffffffff0xffffffffTrue / Trueb123456789→ 0xcbf43926CRC_32CCastagnoli0x1edc6f41320xffffffff0xffffffffTrue / Trueb123456789→ 0xe3069283CRC_16_CCITTKERMIT0x10211600True / Trueb\xcb\x37→ 0x6b3eCRC_16_X250x1021160xffff0xffffTrue / Trueb123456789→ 0x906eCRC_32_AUTOSAR0xf4acfb13320xffffffff0xffffffffTrue / Trueb\0\0\0\0→ 0x6fb32240 等两组上表参数与测试向量均直接来自 scapy/libs/crc.py 中各个类的类属性声明。CRC_32C即著名的 Castagnoli 多项式常用于 iSCSI、SCTP 等场景CRC_16_X25是 X.25 协议使用的变体CRC_32_AUTOSAR来自汽车开放系统架构标准与 scapy/contrib/automotive 下的 AUTOSAR 相关实现对应。三、自定义参数CRCParam 与 from_parameters当你要用的算法多项式、反射设置与内置类不同例如校验头不在开头、需要追加 trailer 等有两种等价途径构造一个CRCParam对象或直接向CRC.from_parameters传关键字参数。原文档示例 from scapy.libs.crc import CRC, CRCParam params CRCParam(poly0x589, size16, init_crc0xffff, xor0xffff, ... reflect_inputFalse, reflect_outputFalse) CRC.from_parameters(params, do_not_registerTrue)(btest)其中do_not_registerTrue的含义是动态生成的算法类不会被注册进全局注册表_CRC_metaclass.REGISTRY从而不会干扰后续CRC.search等基于注册表的自动检索行为。若省略该参数则新类会被加入注册表。CRCParam的参数分为三类scapy/libs/crc.pyPARAMETERS必填poly多项式、size位宽、init_crc初始值、xor输出异或值、reflect_input输入反射、reflect_output输出反射。缺少其中任何一个都会抛出Exception(CRC parameter ... is mandatory)OPTIONS可选header计算前先吸收的前缀字节串默认b、trailer计算末尾追加的后缀字节串默认bMISC可选name算法名缺省时自动生成为CRCsig_signature、test_vectors自检测试向量列表。CRCParam还实现了值相等的判定__eq__/__hash__仅基于参数与选项因此你可以用CRC.lookup(crc)在注册表中反查这个参数组合对应哪个已注册类。若不想先构造CRCParam也可以直接把参数透传给from_parameters例如 CRC.from_parameters(poly0x91a0, size16, init_crc0xffff, xor0xffff, ... reflect_inputFalse, reflect_outputTrue, ... namemy-crc, do_not_registerTrue)(btest)这正好对应 test/scapy/crc.uts 中p1/p2/p3的构造与相等性验证p1 p3参数相同而p2反射设置不同与二者均不相等CRC.from_parameters生成的自定义类之间也遵循同样的相等规则。四、增量计算create_context / init / update / finish对于大文件或流式数据一次性传入整块bytes既不现实也不必要。CRC类提供了标准的上下文 API原文档示例 crc CRC_32.create_context() crc.update(b12345) crc.update(b6789) crc.finish() 3421780262分两段 update 的结果与直接计算CRC_32(b123456789)完全一致这正是增量 CRC 的意义所在。用法要点CRC_32.create_context()scapy/libs/crc.py通过元类方法创建并初始化一个上下文实例CRC.__init__会调用self.init()因此拿到手即可直接updateinit()将内部寄存器重置为初始值含header吸收可多次调用以复用同一上下文update(msg)吸收一段bytes更新内部寄存器finish()返回最终校验和。它不会改变上下文状态源码注释明确说明 finish() does not change state所以你可以反复调用update()/finish()观察中间过程或init()后重新开始。五、查找内嵌的 CRCCRC.search很多二进制格式会把 CRC 紧挨着受保护数据存放如帧尾校验。CRC.search正是为这种场景设计的它扫描一整块二进制数据返回所有子串起止区间CRC 值算法类三元组候选帮助你定位数据与校验值的对应关系。原文档示例 import struct from scapy.libs.crc import CRC, CRC_32 data bpayload blob data struct.pack(!I, CRC_32(data)) CRC.search(blob, only_registryTrue) [((0, 7), 1110206997, CRC_32)]((0, 7), 1110206997, CRC_32)的含义是从偏移 0 到偏移 7不含的子串bpayload其 CRC-32 值 1110206997即CRC_32(bpayload)恰好与 blob 末尾 4 字节中按大端存储的整数吻合。search的完整签名是scapy/libs/crc.pyCRC.search(s, min_substring_len4, only_registryFalse)s待扫描的bytesmin_substring_len候选子串的最短长度默认 4用于过滤过短的巧合匹配only_registryTrue时只在已注册的算法类集合_CRC_metaclass.REGISTRY内查找快且精确False时会基于WELL_KNOWN_POLY表中 16/32 位共 17 个已知多项式穷举其正/反向reverse、init_crc/xor取 0 或全 1、反射开关四种组合动态生成数百个不注册的候选算法做广谱扫描scapy/libs/crc.py适合未知格式的探测。算法实现上search先把整块数据按 16/32 位宽、大小端两种方式切分成所有可能的目标 CRC 值集合再以滑窗方式维护一批增量上下文边推进边用finish()比对目标值因此复杂度可控且能覆盖CRC 在数据前面前缀或后面后缀两种常见排布。test/scapy/crc.uts 对search做了多组回归验证CRC-32 放在数据之后r[0] ((0, len(m)-4), c, CRC_32)CRC-32 放在数据之前r[0] ((4, len(m)), c, CRC_32)混合多种算法CRC_16、CRC_32_AUTOSAR、CRC_32及随机噪声的拼接串中能同时命中CRC_16_CCITT、CRC_32、CRC_32_AUTOSAR三个候选len(r) 9且指定的三个三元组均在结果中。六、注册表、测试向量与自检元类_CRC_metaclassscapy/libs/crc.py在创建每个具体 CRC 子类时自动完成三件事依据类属性构造对应的CRCParam预计算 256 项查表table反射型用_precalc_table_reflect非反射型用_precalc_table两者均带lru_cache(maxsize128)缓存scapy/libs/crc.py并推导mask (1 size) - 1把类加入全局REGISTRY除非设置了do_not_register。这意味着你每写一个class MyCRC(CRC): ...只要在类体里声明poly、size、init_crc、xor、reflect_input、reflect_output等属性就自动获得了一个可调用、可增量计算、可被search检索的完整算法实现——这也正是 doc/scapy/advanced_usage/crc.rst 说每个变体都是一个类的原因。每个内置类都声明了test_vectors可用以下方法自检CRC_32.test()对该类逐条运行测试向量打印每条的输入、输出与 ok/FAILED 标记返回是否全部通过scapy/libs/crc.pyCRC.autotest()遍历注册表中所有算法类并执行各自的test()最后输出TOTAL: ok/n CRC test passedscapy/libs/crc.py。test/scapy/crc.uts 的回归测试第一项就是直接执行CRC.autotest()以标准测试向量如b123456789对应的 CRC-32 应为 0xcbf43926验证所有内置实现正确。你可以用同样的方式在本地验证自己的自定义算法 from scapy.libs.crc import CRC CRC.autotest() CRC-16 (313233343536373839) 0xbb3d ok ... TOTAL: 6/6 CRC test passed True七、在协议实现与测试中的应用这套 CRC 框架不是孤立工具它已接入 Scapy 的协议栈并覆盖在回归测试体系中蓝牙低功耗BLE链路层在 scapy/layers/bluetooth4LE.py 中通过BTLE.compute_crc(pdu, init0x555555)实现 24 位 CRCpost_build时自动把 CRC 与 payload 拼接相关断言在 test/scapy/layers/bluetooth4LE.utstest/scapy/crc.uts 是scapy.libs.crc的专属回归测试覆盖测试向量自检、CRCParam相等性、from_parameters动态生成以及search的多种嵌入式排布场景此外如 test/contrib/concox.uts、test/contrib/pnio.uts 等 contrib 测试也会对依赖 CRC 的协议做端到端校验。对于需要校验字段的链路层/应用层协议如 AUTOSAR 报文、TP 层 CRC你可以直接复用CRC_32_AUTOSAR或按协议规范用CRCParam定制后接入自己的Packet类而不必为每种算法重写位运算逻辑。八、小结scapy.libs.crc以类即算法的设计把 CRC 计算、定制、增量处理、嵌入定位与自检统一在一套小巧的 API 之下直接计算CRC_32(b123456789)等类调用即可内置变体CRC_16、CRC_16_CCITT、CRC_16_X25、CRC_32、CRC_32C、CRC_32_AUTOSAR覆盖常见 16/32 位标准自定义CRCParam/CRC.from_parameters支持任意多项式、反射、header/trailer 组合流式处理create_context()init/update/finish适合大文件与实时流逆向定位CRC.search可从原始二进制中找出数据区间 算法候选对only_registry控制精确/广谱两种模式。如需了解模块的完整类与方法清单可直接阅读 scapy/libs/crc.py 源码或参考 doc/scapy/advanced_usage/index.rst 索引下的进阶文档。赞分享网络网络安全【免费下载链接】scapyScapy: the Python-based interactive packet manipulation program library.项目地址https://gitcode.com/gh_mirrors/sc/scapy点击查看免费下载相关推荐pwntools 的 CRC 计算模块 pwnlib.util.crc 全解析BitPolynom 多项式运算、generic_crc 通用校验与海量 CRC 变体速查pwntools 的 CRC 计算模块 pwnlib.util.crc 全解析BitPolynom 多项式运算、generic_crc 通用校验与海量 CRC网络安全渗透测试逆向工程PaddleX行人检测模块全面解析与实战指南PaddleX行人检测模块全面解析与实战指南 一、行人检测技术概述 行人检测是计算机视觉领域的基础任务之一旨在从图像或视频中识别出行人并确定其位置。作为目标检人工智能深度学习大模型计算机视觉低代码微调模型推理服务NLP语音本地部署PaddleX文本检测模块全面解析与实战指南PaddleX文本检测模块全面解析与实战指南 一、文本检测技术概述 文本检测是OCR光学字符识别流程中的首要环节其核心任务是在复杂背景的图像中精准定位文本人工智能深度学习大模型计算机视觉低代码微调模型推理服务NLP语音本地部署创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价