网络安全模式匹配【免费下载链接】yaraThe pattern matching swiss knife项目地址https://gitcode.com/gh_mirrors/ya/yara点击查看免费下载导读Magic 模块是 YARA 提供的官方模块之一它把 Unix 标准命令file背后的 libmagic 库能力直接接入 YARA 规则语言让你在规则条件中直接用magic.type()判断目标文件类型如 PDF document, version 1.5、用magic.mime_type()获取其 MIME 类型如 application/pdf。本文基于当前仓库的官方文档 docs/modules/magic.rst 与源码 libyara/modules/magic/magic.c 展开读完你将掌握Magic 模块的两个函数怎么用、与file命令输出的对应关系、如何把它编译进 YARA、底层实现原理与缓存机制以及来自 tests/test-magic.c 的真实检测用例。该模块自 YARA 3.1.0 起提供见 docs/modules/magic.rst。一、Magic 模块是什么Magic 模块允许你基于file命令的输出识别文件类型。file是 Unix 上最经典的文件类型识别工具其底层依赖 libmagic 库——通过读取文件头部字节、比对内置的“魔法字节”magic numbers数据库来判断文件真实类型而不是简单地看扩展名。在 YARA 中引入 Magic 模块后规则编写者就能把这种类型识别能力作为规则条件的一部分例如“命中所有 PDF 文件”或“命中所有 PE 可执行文件”而不必手动编写繁琐的十六进制头字节匹配。重要前提默认不编译Magic 模块和 Cuckoo 模块一样并不默认构建进 YARA。必须在使用configure配置时显式加上--enable-magic详见下文编译章节。不支持 Windows官方文档明确说明该模块不支持在 Windows 上运行。这是因为 libmagic 在 Windows 平台上不可用/不常用源码 libyara/modules/magic/magic.c 直接#include magic.h依赖系统 libmagic 头文件与链接库。不适用于进程内存扫描从源码看两个函数在SCAN_FLAGS_PROCESS_MEMORY进程内存扫描模式下都会直接返回YR_UNDEFINED见 libyara/modules/magic/magic.c 与 L135-L136即规则条件中将视为未定义值。二、模块的两个函数type 与 mime_typeMagic 模块只暴露两个函数见源码 libyara/modules/magic/magic.c 的声明注册函数返回类型返回内容对应file命令magic.type()字符串libmagic 对文件类型的人类可读描述直接运行file 文件magic.mime_type()字符串文件的 MIME 类型不含 charset 部分file --mime 文件2.1 magic.type()描述性类型字符串magic.type()返回与file命令一致的描述性字符串。例如对一份 PDF 文档运行file$ file some.pdf some.pdf: PDF document, version 1.5那么在规则中调用magic.type()就会返回PDF document, version 1.5。典型规则用法官方文档示例import magic rule IsPDF { condition: magic.type() contains PDF }2.2 magic.mime_type()MIME 类型magic.mime_type()相当于把--mime参数传给file$ file --mime some.pdf some.pdf: application/pdf; charsetbinary不同之处在于magic.mime_type()只返回 MIME 类型本体不包含; charset...部分。上例中它返回的是application/pdf。典型规则用法import magic rule IsPDFByMime { condition: magic.mime_type() application/pdf }2.3 常见文件类型的输出示例为了帮助你预期不同类型文件的检测结果官方文档给出了一些通过实际运行file观察到的典型输出JPEG image data, JFIF standard 1.01PE32 executable for MS Windows (GUI) Intel 80386 32-bitPNG image data, 1240 x 1753, 8-bit/color RGBA, non-interlacedASCII text, with no line terminatorsZip archive data, at least v2.0 to extract建议的做法是针对你关心的样本先手工运行file/file --mime观察真实输出再据此编写contains或匹配条件避免猜测输出文本。三、编译 Magic 模块3.1 configure 开关Magic 模块默认不编译。在源码根目录执行./configure时需要传入--enable-magic见 docs/gettingstarted.rst$ ./configure --enable-magic也可以与其他模块组合开启$ ./configure --enable-cuckoo --enable-magic3.2 依赖 libmagicconfigure.ac中对该开关的处理逻辑configure.ac会做以下检查检查头文件magic.h若缺失则报错please install libmagic library检查链接库符号magic_open若缺失同样报错通过后定义编译宏MAGIC_MODULE并把-lmagic加入PC_LIBS_PRIVATEpkg-config 私有链接库。因此编译前必须先安装 libmagic 开发包。官方文档docs/gettingstarted.rst说明Ubuntu、Debian 和 CentOS 均提供libmagic-dev软件包例如$ sudo apt-get install libmagic-dev在构建系统中Makefile.am中也有对应接线Makefile.am 的MODULES libyara/modules/magic/magic.c以及 L416-L419 的test-magic测试目标确认模块源文件参与编译并有对应测试程序tests/test-magic.c。四、libmagic 数据库与 MAGIC 环境变量libmagic 需要一份编译好的文件类型数据库才能工作。官方文档说明默认情况下libmagic 尝试从/etc/magic.mgc读取编译后的类型数据库如果该文件不存在可以通过环境变量MAGIC指定一个magic.mgc文件的路径libmagic 会转而从那里加载若系统已有标准安装通常 Debian/Ubuntu 的libmagic1/libmagic-dev会提供/usr/share/misc/magic.mgc可将MAGIC指向它也可以指向自己编译的file工具产生的数据库。从源码实现看模块调用的是magic_open(0)magic_load(cookie, NULL)libyara/modules/magic/magic.c其中第二个参数传NULL即表示使用 libmagic 的默认数据库加载路径——这正是文档所述/etc/magic.mgc或MAGIC环境变量所影响的加载行为。五、源码级实现原理5.1 基于“首个内存块”的类型判定两个函数的实现非常简洁libyara/modules/magic/magic.c核心逻辑一致通过first_memory_block(context)取得被扫描文件的第一个内存块用yr_fetch_block_data(block)取得该块数据与大小调用 libmagic 的magic_buffer(cookie, block_data, block-size)对块内容进行识别。也就是说Magic 模块实际只读取被扫描文件的首个内存块做识别与file工具读取文件头判断类型的思路一致。若首个块为空则返回YR_UNDEFINED。两者的区别仅在于传给 libmagic 的 flagsmagic.type()magic_setflags(cookie, 0)输出完整描述文本magic.mime_type()magic_setflags(cookie, MAGIC_MIME_TYPE)输出 MIME 类型。5.2 线程本地缓存与“同一次扫描只算一次”源码中值得注意的优化点是缓存机制模块定义了一个线程本地存储键magic_tls每个线程通过get_cache()惰性创建并缓存一个magic_tcookielibyara/modules/magic/magic.c避免每条规则重复magic_open/magic_load的开销在magic_type/magic_mime_type中cached_type/cached_mime_type一旦计算过同一次扫描中后续调用直接复用结果L101-L102 与 L140-L141且内存用yr_strdup复制并由module_unload统一释放L198-L215。由此可以推断在同一次扫描中多次使用magic.type()并不会多次执行 libmagic 分析性能开销只有一次同时由于缓存挂在线程本地多线程扫描时各线程各自维护自己的 cookie互不干扰。5.3 模块生命周期module_initialize创建线程本地存储键L171-L174module_load/module_unload在每次扫描开始/结束时调用负责释放缓存的字符串L189-L215module_finalize关闭 cookie 并销毁线程本地键L176-L187。六、实战来自官方测试的检测规则仓库自带的测试程序 tests/test-magic.c 提供了三个可直接借鉴的真实检测场景该测试通过assert_true_rule_blob把规则直接应用于内置测试样本1. 检测 ELF 文件import magic rule test { condition: magic.type() contains ELF }2. 检测 PE 可执行文件兼容描述文本差异import magic rule test { condition: ( magic.type() contains MS-DOS executable or magic.type() contains PE32 executable or magic.type() contains PE32 executable) and ( magic.mime_type() application/x-dosexec or magic.mime_type() application/vnd.microsoft.portable-executable ) }这个用例很有实战参考价值同一类文件在不同 libmagic 版本/数据库下type()的描述文本可能不同如区分 32 位 PE32 与 64 位 PE32因此用contains组合多个关键词比精确更稳健同时可结合mime_type()的 MIME 判定做双重确认。3. 检测 Mach-O 文件对应 GitHub issue #1663 的回归测试import magic rule test { condition: magic.type() contains Mach-O and (magic.mime_type() application/x-mach-binary or magic.mime_type() application/octet-stream) and magic.type() contains Mach-O }该用例说明某些平台上 Mach-O 文件的 MIME 类型可能被识别为application/octet-stream因此判定时需要同时兼容两种 MIME 结果。这些测试目标均通过make check或单独构建test-magic运行见 Makefile.am可作为你验证本机 libmagic 输出与规则兼容性的最小实验。七、使用建议与注意事项先跑file再写规则libmagic 的输出随版本和数据库变化写死精确字符串前先对样本执行file与file --mime确认实际输出再决定用contains还是。注意大小写与格式type()返回文本包含逗号、数字等细节如PNG image data, 1240 x 1753, 8-bit/color RGBA, non-interlaced匹配时建议用contains聚焦关键子串。进程内存扫描不可用在SCAN_FLAGS_PROCESS_MEMORY场景下两个函数返回未定义值因此该模块只适用于文件扫描这从 libyara/modules/magic/magic.c 可以确认。平台限制仅限类 Unix 平台Linux/macOS 等Windows 上不可用。数据库缺失时确保系统存在/etc/magic.mgc否则通过MAGIC环境变量指向可用的magic.mgc否则 libmagic 加载会失败模块初始化时报ERROR_INTERNAL_FATAL_ERROR对应 magic.c 的magic_load失败分支。八、小结Magic 模块用两个简单函数把成熟的 libmagic 类型识别能力带进了 YARA 规则语言magic.type()给出人类可读的文件类型描述magic.mime_type()给出 MIME 类型。它适合作为规则的第一道“类型过滤器”配合其他模块如pe、elf、dotnet与字符串/十六进制条件可以构建出先判类型、再深入分析的层级化检测逻辑。使用时注意三点编译时显式--enable-magic、目标平台为类 Unix 且装有 libmagic、先运行file命令校准预期输出。赞分享网络安全模式匹配【免费下载链接】yaraThe pattern matching swiss knife项目地址https://gitcode.com/gh_mirrors/ya/yara点击查看免费下载相关推荐nhost 中基于 Magic Number 的 MIME 类型检测179 种文件格式识别能力全解析nhost 中基于 Magic Number 的 MIME 类型检测179 种文件格式识别能力全解析 mimetype 是 nhost 仓库Open Sou后端认证鉴权数据库无服务开发工具云原生Mermaid Live Editor在浏览器里实时画出可分享的图表Mermaid Live Editor在浏览器里实时画出可分享的图表 Mermaid Live Editor 是 Mermaid 官方的浏览器图表编辑器输入前端开发者工具数据可视化YARA PE 模块完全指南基于 PE 结构编写精细化恶意软件检测规则YARA PE 模块完全指南基于 PE 结构编写精细化恶意软件检测规则 PE 模块 pe 是 YARA 内置模块之一它把 Windows PE 文件P网络安全模式匹配上一篇Flutter Unity View Widget在Flutter中嵌入Unity游戏引擎视图下一篇startbootstrap-agency联系表单集成SB Forms配置与使用教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考