资讯动态

YARA 模块系统完全指南:从官方模块详解到自定义模块开发

发布时间:2026/9/24 17:07:40 来源:尧图企业网站定制
网络安全模式匹配【免费下载链接】yaraThe pattern matching swiss knife项目地址https://gitcode.com/gh_mirrors/ya/yara点击查看免费下载YARA 的模块Module是其扩展机制的核心通过import指令在规则中引入数据结构和函数让规则能够基于文件格式的深层属性PE/ELF 头字段、.NET 元数据、文件哈希、熵值、行为报告等表达复杂条件而不再局限于字符串匹配。本文以 docs/modules.rst 为骨架逐模块剖析 YARA 官方分发的 10 个模块PE、ELF、Cuckoo、Magic、Hash、Math、Dotnet、Time、Console、String的完整字段与函数参考并结合 libyara/modules/ 下的源码与 docs/writingmodules.rst 讲解模块的内部实现与自定义开发流程读完你将能熟练在规则中使用每个官方模块并具备编写自己模块的能力。模块是什么YARA 的扩展机制模块是 YARA 提供的扩展特性的方法。它们允许你定义可在规则中使用的数据结构和函数以表达更复杂的条件。YARA 官方分发的模块在 docs/modules.rst 中统一索引同时你也可以在 Writing your own modules 一节学习如何编写自己的模块。模块的引入与使用非常直观在规则文件顶部使用import指令即可例如import pe rule single_section { condition: pe.number_of_sections 1 }从源码角度看模块的注册清单位于 libyara/modules/module_listtests、pe、elf、math、time、console、string默认编译而dotnet、cuckoo、magic、hash、macho、dex、pb_tests由对应的编译宏如DOTNET_MODULE、CUCKOO_MODULE、MAGIC_MODULE、HASH_MODULE控制是否构建这解释了为什么部分模块如 Cuckoo、Magic默认未包含在 YARA 中——构建时需显式开启相应特性。PE 模块精细化的 Windows 可执行文件规则PE 模块docs/modules/pe.rst允许你通过 PE 文件格式的属性和特征编写更细粒度的规则它暴露了 PE 头中的大部分字段并提供可用于编写更有表现力、更有针对性规则的函数。该模块在 YARA 3.3.0 起逐步扩展大量字段在 3.8.0 版本加入。基本用法示例import pe rule single_section { condition: pe.number_of_sections 1 } rule control_panel_applet { condition: pe.exports(CPlApplet) } rule is_dll { condition: pe.characteristics pe.DLL } rule is_pe { condition: pe.is_pe }其中pe.characteristics pe.DLL展示了 YARA 规则中典型的位掩码检查写法对 FileHeader 特性位图做按位与运算来探测某个特性位是否被置位。文件头File Header相关字段machine整数取值包括MACHINE_UNKNOWN、MACHINE_AMD64、MACHINE_ARM、MACHINE_ARM64、MACHINE_I386、MACHINE_IA64、MACHINE_MIPS16、MACHINE_POWERPC、MACHINE_SH3、MACHINE_THUMB、MACHINE_R4000、MACHINE_ALPHA等约 30 个常量。示例pe.machine pe.MACHINE_AMD64。characteristicsPE FileHeader 特性位图可用以下常量按位与检查RELOCS_STRIPPED重定位信息被剥离、EXECUTABLE_IMAGE文件可执行、LINE_NUMS_STRIPPED、LOCAL_SYMS_STRIPPED、AGGRESIVE_WS_TRIM、LARGE_ADDRESS_AWARE可处理 2GB 地址、BYTES_REVERSED_LO、MACHINE_32BIT、DEBUG_STRIPPED、REMOVABLE_RUN_FROM_SWAP、NET_RUN_FROM_SWAP、SYSTEM、DLL文件是 DLL、UP_SYSTEM_ONLY、BYTES_REVERSED_HI。timestampPE 时间戳以 epoch 整数表示。示例pe.timestamp 1424563200。pointer_to_symbol_table3.8.0IMAGE_FILE_HEADER::PointerToSymbolTable的值用于包含 COFF 调试信息的 PE 镜像。number_of_symbols3.8.0IMAGE_FILE_HEADER::NumberOfSymbols的值。size_of_optional_header3.8.0IMAGE_FILE_HEADER::SizeOfOptionalHeader的实际大小反映 32 位与 64 位可选头及数据目录数量的差异。opthdr_magic3.8.0IMAGE_OPTIONAL_HEADER::Magic的值可取IMAGE_NT_OPTIONAL_HDR32_MAGIC、IMAGE_NT_OPTIONAL_HDR64_MAGIC、IMAGE_ROM_OPTIONAL_HDR_MAGIC。可选头Optional Header相关字段checksum3.6.0OptionalHeader 中存储的 PE checksum 整数。calculate_checksum3.6.0计算 PE checksum 的函数。示例pe.checksum pe.calculate_checksum()——这可以用来检测被篡改的 PE 文件。subsystem整数取值包括SUBSYSTEM_UNKNOWN、SUBSYSTEM_NATIVE、SUBSYSTEM_WINDOWS_GUI、SUBSYSTEM_WINDOWS_CUI、SUBSYSTEM_OS2_CUI、SUBSYSTEM_POSIX_CUI、SUBSYSTEM_NATIVE_WINDOWS、SUBSYSTEM_WINDOWS_CE_GUI、SUBSYSTEM_EFI_APPLICATION、SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER、SUBSYSTEM_EFI_RUNTIME_DRIVER、SUBSYSTEM_EFI_ROM_IMAGE、SUBSYSTEM_XBOX、SUBSYSTEM_WINDOWS_BOOT_APPLICATION。示例pe.subsystem pe.SUBSYSTEM_NATIVE。size_of_code3.8.0IMAGE_OPTIONAL_HEADER::SizeOfCode即代码段原始数据大小之和。size_of_initialized_data3.8.0、size_of_uninitialized_data对应IMAGE_OPTIONAL_HEADER中初始化/未初始化数据大小。entry_point入口点文件偏移扫描文件时或虚拟地址扫描进程内存时等价于已废弃的entrypoint关键字。entry_point_raw4.1.0入口点的原始值不转换为文件偏移或 RVA。base_of_code3.8.0、base_of_data3.8.0仅 32 位 PE 存在、image_base代码基址、数据基址与镜像基址 RVA。section_alignment3.8.0、file_alignment3.8.0Windows 将 PE 映射到内存时各原始大小对齐到 SectionAlignment而文件中所有段原始数据大小对齐到 FileAlignment。win32_version_value3.8.0、size_of_image3.8.0头与所有段的虚拟总大小、size_of_headers3.8.0含 DOS 头、文件头、可选头与所有段头的原始数据大小。size_of_stack_reserve、size_of_stack_commit、size_of_heap_reserve、size_of_heap_commit均 3.8.0栈/堆的保留与提交的默认虚拟内存量。loader_flags3.8.0、number_of_rva_and_sizesIMAGE_OPTIONAL_HEADER::NumberOfRvaAndSizes即 DataDirectory 数组项数。dll_characteristicsOptionalHeader DllCharacteristics 位图不要与 FileHeader characteristics 混淆常量包括HIGH_ENTROPY_VA64 位地址空间 ASLR、DYNAMIC_BASE可重定位/ASLR 兼容、FORCE_INTEGRITY、NX_COMPATDEP 兼容、NO_ISOLATION、NO_SEH配合 SafeSEH、NO_BIND、APPCONTAINER、WDM_DRIVERWDM 设备驱动、GUARD_CF支持 Control Flow Guard、TERMINAL_SERVER_AWARE。linker_version、os_version、image_version、subsystem_version均为含major/minor两个整数成员的对象。number_of_rva_and_sizes与data_directories3.8.0data_directories是零基数据目录数组每个目录含virtual_addressRVA为 0 表示目录缺失注意数字签名为文件偏移而非 RVA和size字节数。目录索引常量包括IMAGE_DIRECTORY_ENTRY_EXPORT导出函数、IMAGE_DIRECTORY_ENTRY_IMPORT导入目录、IMAGE_DIRECTORY_ENTRY_RESOURCE资源段、IMAGE_DIRECTORY_ENTRY_EXCEPTION异常信息、IMAGE_DIRECTORY_ENTRY_SECURITY数字签名为原始文件偏移和长度、IMAGE_DIRECTORY_ENTRY_BASERELOC重定位表、IMAGE_DIRECTORY_ENTRY_DEBUG调试信息含IMAGE_DEBUG_TYPE_*系列类型常量如IMAGE_DEBUG_TYPE_CODEVIEW、IMAGE_DEBUG_TYPE_POGO等、IMAGE_DIRECTORY_ENTRY_ARCHITECTURE、IMAGE_DIRECTORY_ENTRY_TLS线程局部存储、IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG、IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT、IMAGE_DIRECTORY_ENTRY_IAT导入地址表、IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT延迟导入表、IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR.NET 头。示例pe.data_directories[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].virtual_address ! 0。段Sectionsnumber_of_sectionsPE 中段的个数。sections3.3.0零基段对象数组可用[]运算符访问。每个段对象含name段名、full_name当段表中名字形如/加十进制数字时从字符串表指定偏移取出完整名MinGW 和 Cygwin 用它存超过 8 字符的段名、characteristics段特性、virtual_address、virtual_size、raw_data_offset、raw_data_size、pointer_to_relocations3.8.0、pointer_to_line_numbers3.8.0、number_of_relocations3.8.0、number_of_line_numbers3.8.0。段特性常量众多常用如SECTION_CNT_CODE含代码、SECTION_CNT_INITIALIZED_DATA、SECTION_CNT_UNINITIALIZED_DATA、SECTION_MEM_EXECUTE、SECTION_MEM_READ、SECTION_MEM_WRITE、SECTION_MEM_DISCARDABLE、SECTION_MEM_SHARED、SECTION_ALIGN_*对齐系列、SECTION_LNK_COMDAT等。示例pe.sections[0].name .text pe.sections[1].characteristics pe.SECTION_CNT_CODE覆盖数据Overlayoverlay3.6.0含offset覆盖段偏移无覆盖数据时为 0非 PE 文件未定义与size覆盖段大小两个整数成员。覆盖数据是附加在 PE 末尾的额外数据常被用于捆绑配置或恶意载荷示例uint8(pe.overlay.offset) 0x0d and pe.overlay.size 1024资源Resourcesnumber_of_resources资源数量。resource_timestamp资源时间戳整数。resource_version含major/minor的对象。resources3.3.0 变更零基资源对象数组。每个资源含rva、offsetRVA 无效时可能未定义、length、type整数、id整数、language整数以及可选的type_string、name_string、language_string资源类型/名称/语言为字符串时。所有资源都必须指定类型、id名称和语言且每层要么是整数要么是字符串不能同时两者。资源类型常量包括RESOURCE_TYPE_CURSOR、RESOURCE_TYPE_BITMAP、RESOURCE_TYPE_ICON、RESOURCE_TYPE_MENU、RESOURCE_TYPE_DIALOG、RESOURCE_TYPE_STRING、RESOURCE_TYPE_FONT、RESOURCE_TYPE_ACCELERATOR、RESOURCE_TYPE_RCDATA、RESOURCE_TYPE_MESSAGETABLE、RESOURCE_TYPE_GROUP_ICON、RESOURCE_TYPE_VERSION、RESOURCE_TYPE_MANIFEST、RESOURCE_TYPE_HTML等。示例pe.resources[0].type pe.RESOURCE_TYPE_RCDATA pe.resources[0].name_string F\x00I\x00L\x00E\x00版本信息与导入导出version_info3.2.0字典包含 PE 的版本信息典型键为Comments、CompanyName、FileDescription、FileVersion、InternalName、LegalCopyright、LegalTrademarks、OriginalFilename、ProductName、ProductVersion。示例pe.version_info[CompanyName] contains Microsoft。version_info_list版本信息结构数组成员为key、value。示例pe.version_info_list[0].value contains Microsoft。导入导出相关函数在 PE 模块参考中同样可用例如pe.exports(CPlApplet)、pe.imphash()。Authenticode 数字签名number_of_signaturesPE 中 authenticode 签名的数量。is_signed任一 PE 签名通过验证即为真。这里的已验证指签名形式上正确摘要匹配、签名者公钥能正确验证加密摘要等但不代表签名者可被信任因为验证过程不涉及信任锚。signatures零基签名对象数组PE 通常只有一个签名成员包括thumbprint3.8.0签名的拇指纹字符串。issuer签发者信息字符串例如/CUS/STWashington/LRedmond/OMicrosoft Corporation/CNMicrosoft Code Signing PCA。subject主题信息字符串。version、algorithm算法字符串表示通常为sha1WithRSAEncryption、algorithm_oidASN.1 点分数字表示跨实现更稳定如algorithm_oid 1.2.840.113549.1.1.11等价于algorithm sha1WithRSAEncryption、serial序列号字符串如52:00:e5:aa:25:56:fc:1a:86:ed:96:c9:d4:4b:33:c7。not_before、not_after有效期起止的 Unix 时间戳。valid_on(timestamp)签名在指定日期是否有效等价于timestamp pe.signatures[n].not_before and timestamp pe.signatures[n].not_after。verified签名是否验证成功的布尔值。digest_alg通常为sha1或sha256、digest签名中签署的文件摘要、file_digest用 digest_alg 计算出的被分析文件摘要。number_of_certificates与certificates签名中存储的证书数含计数签名中的证书及证书数组证书成员与前述同名成员一致thumbprint/issuer/subject/version/algorithm/serial/not_before/not_after。signer_info签名者信息含program_name可选程序名、digest、digest_alg、length_of_chain、chain签名者证书链数组。number_of_countersignatures与countersignatures计数签名数量与数组几乎总是单个时间戳计数签名成员含verified、sign_time时间戳签名时间的 Unix 时间、digest、digest_alg。Authenticode 解析的实现位于 libyara/modules/pe/authenticode-parser/包括证书解析certificate.c、计数签名countersignature.c等模块。仓库测试数据中还包含authenticode_short_digest等样本见 tests/data/。ELF 模块Linux/Unix 可执行文件规则ELF 模块docs/modules/elf.rst3.2.0与 PE 模块非常相似只不过针对 ELF 文件暴露了 ELF 头中的大部分字段import elf rule single_section { condition: elf.number_of_sections 1 } rule elf_64 { condition: elf.machine elf.EM_X86_64 }type文件类型取值ET_NONE无类型、ET_REL可重定位文件、ET_EXEC可执行文件、ET_DYN共享对象文件、ET_CORE核心转储文件。示例elf.type elf.ET_EXEC。machine目标架构常量包括EM_NONE、EM_M32、EM_SPARC、EM_386、EM_68K、EM_88K、EM_860、EM_MIPS、EM_MIPS_RS3_LE、EM_PPC、EM_PPC64、EM_ARM、EM_X86_64、EM_AARCH64等。entry_point及其他字段ELF 模块还暴露入口点等头字段可参照 docs/modules/elf.rst 的完整 ReferenceELF 解析实现位于 libyara/modules/elf/elf.c。Cuckoo 模块基于行为报告的规则Cuckoo 模块docs/modules/cuckoo.rst让你基于 Cuckoo 沙箱生成的行为信息编写 YARA 规则扫描 PE 文件时把关于其行为的附加信息传给cuckoo模块规则不仅能基于文件包含什么还能基于它做了什么。在引入 Cuckoo 模块之前要检测向 http://someone.doingevil.com 发送 HTTP 请求的恶意程序你只能写rule evil_doer { strings: $evil_domain http://someone.doingevil.com condition: $evil_domain }这个规则的问题是域名可能因为完全无关的合法原因出现在文件中而且恶意程序可能对域名加密或混淆此时该规则完全失效。而有了 Cuckoo 模块可以把沙箱生成的行为报告与文件一起传给 YARAimport cuckoo rule evil_doer { condition: cuckoo.network.http_request(/http:\/\/someone\.doingevil\.com/) }当然也可以把行为条件与字符串条件混合import cuckoo rule evil_doer { strings: $some_string { 01 02 03 04 05 06 } condition: $some_string and cuckoo.network.http_request(/http:\/\/someone\.doingevil\.com/) }行为信息如何传入命令行工具使用-x选项$ yara -x cuckoobehavior_report_file rules_file pe_file其中behavior_report_file是 Cuckoo 沙箱生成的 JSON 格式行为报告文件路径。若使用 yara-python则在match方法的modules_data参数中传入报告import yara rules yara.compile(./rules_file) report_file open(./behavior_report_file) report_data report_file.read() rules.match(pe_file, modules_data{cuckoo: bytes(report_data)})注意该模块默认不编译进 YARA需在构建时启用官方 Windows 二进制已包含。参考实现见 libyara/modules/cuckoo/cuckoo.c。Magic 模块文件类型识别Magic 模块docs/modules/magic.rst3.1.0基于 Unix 标准命令file的输出识别文件类型。该模块默认不编译且不支持 Windows。模块提供两个函数magic.type()返回file的描述字符串magic.mime_type()返回 MIME 类型。例如对某个 PDF 运行file$ file some.pdf some.pdf: PDF document, version 1.5则magic.type()返回PDF document, version 1.5而magic.mime_type()类似file --mime对some.pdf: application/pdf; charsetbinary返回application/pdf不含 charset 部分。常见输出示例JPEG image data, JFIF standard 1.01、PE32 executable for MS Windows (GUI) Intel 80386 32-bit、PNG image data, 1240 x 1753, 8-bit/color RGBA, non-interlaced、ASCII text, with no line terminators、Zip archive data, at least v2.0 to extract。libmagic 默认尝试从/etc/magic.mgc读取编译后的文件类型数据库若该文件不存在可设置环境变量MAGIC指向一个 magic.mgc 文件作为替代。用法示例import magic rule pdf_document { condition: magic.type() contains PDF } rule pdf_mime { condition: magic.mime_type() application/pdf }实现见 libyara/modules/magic/magic.c。Hash 模块MD5/SHA1/SHA256 与校验和Hash 模块docs/modules/hash.rst3.2.0允许你从文件的一部分计算哈希MD5、SHA1、SHA256并据此创建签名。该模块依赖 OpenSSL 库构建时需开启 OpenSSL 相关特性官方 Windows 二进制已包含。import hash rule md5_rule { condition: hash.md5(0, filesize) feba6c919e3797e7778e8f2e85fa033d }重要注意事项返回的哈希字符串始终是小写。因此hash.md5(0, filesize) feba6c919e3797e7778e8f2e85fa033d这类条件要求哈希字符串以小写给出否则匹配不会生效。函数清单md5(offset, size)计算从offset起size字节的 MD5。扫描运行中进程时offset应为进程地址空间内的虚拟地址。返回小写字符串。md5(string)计算给定字符串的 MD5。示例hash.md5(dummy) 275876e34cf609db118f3d84b799a790。sha1(offset, size)、sha1(string)SHA1 哈希规则同上。sha256(offset, size)、sha256(string)SHA256 哈希规则同上。checksum32(offset, size)、checksum32(string)32 位校验和即所有字节的无符号和。crc32(offset, size)、crc32(string)CRC32 校验和。实现见 libyara/modules/hash/hash.c。一个典型用法是检测已知恶意样本的特定片段hash.sha256(pe.overlay.offset, pe.overlay.size) ...。Math 模块熵值与统计量Math 模块docs/modules/math.rst3.3.0允许你从文件的一部分计算特定数值并基于结果创建签名import math rule high_entropy { condition: math.entropy(0, filesize) 7 }浮点注意事项标注处函数返回浮点数。YARA 在大多数运算中能把整数自动转换为浮点数例如math.entropy(0, filesize) 7中的 7 会被自动转为 7.0因为 entropy 的返回类型是浮点。唯一例外是当函数要求浮点参数时例如math.in_range(2, 1, 3)会报语法错误因为参数必须是浮点数。函数清单entropy(offset, size)/entropy(string)返回指定字节范围的熵浮点。示例math.entropy(dummy) 7。monte_carlo_pi(offset, size)/monte_carlo_pi(string)返回对指定范围运行 Monte Carlo Pi 测试后偏离 Pi 的百分比浮点。示例math.monte_carlo_pi(0, filesize) 0.07。serial_correlation(offset, size)/serial_correlation(string)返回序列相关性0.0~1.0 浮点。示例math.serial_correlation(0, filesize) 0.2。mean(offset, size)/mean(string)返回字节均值浮点。示例math.mean(0, filesize) 72.0。deviation(offset, size, mean)/deviation(string, mean)返回相对均值的偏差浮点。均匀分布随机样本字节的均值是 127.5即常量math.MEAN_BYTES。示例math.deviation(0, filesize, math.MEAN_BYTES) 64.0。in_range(test, lower, upper)若test值在lower与upper之间含端点返回真。示例math.in_range(math.deviation(0, filesize, math.MEAN_BYTES), 63.9, 64.1)。实现见 libyara/modules/math/math.c。仓库还提供了 tests/oss-fuzz/math_fuzzer.cc 用于对模块做模糊测试。Dotnet 模块.NET 文件元数据Dotnet 模块docs/modules/dotnet.rst3.6.0允许你通过 .NET 文件格式的属性和特征编写更细粒度的 .NET 规则import dotnet rule not_exactly_five_streams { condition: dotnet.number_of_streams ! 5 } rule blop_stream { condition: for any i in (0..dotnet.number_of_streams - 1): (dotnet.streams[i].name #Blop) }字段清单version元数据根中的版本字符串。示例dotnet.version v2.0.50727。module_name模块名。示例dotnet.module_name axs。number_of_streams文件中的流数量。streams零基流对象数组每个流含name流名如#~、#Strings、#Blob、offset流偏移、size流大小。示例dotnet.streams[0].name #~。number_of_guids/guidsGUID 数量与零基 GUID 字符串数组。示例dotnet.guids[0] 99c08ffd-f378-a891-10ab-c02fe11be6ef。number_of_classes及更多类型、装配信息等完整参考见 docs/modules/dotnet.rst。实现见 libyara/modules/dotnet/dotnet.c该模块默认不编译构建时需启用。测试数据目录 tests/data/ 中提供了bad_dotnet_pe、dotnet_misaligned_guid等针对异常 .NET 文件的样本。Time 模块时间条件Time 模块docs/modules/time.rst3.7.0允许在 YARA 规则中使用时间条件import time rule timestamp_in_future { condition: pe.timestamp time.now() }now()返回自 1970 年 1 月 1 日以来的秒数整数。示例pe.timestamp time.now()。实现见 libyara/modules/time/time.c。Console 模块条件执行期间的日志输出Console 模块docs/modules/console.rst4.2.0允许在条件执行期间记录日志。默认日志消息发送到 stdout也可以使用 C API 以不同方式处理。Console 模块中的每个函数在条件求值中都返回真因此必须用逻辑与把语句串联起来才能得到正确输出import console rule example { condition: console.log(Hello) and console.log(World!) }函数清单每个函数都有单参和带消息前缀的双参两种形式log(string)把字符串发给主回调。示例console.log(pe.imphash())双参形式console.log(The imphash is: , pe.imphash())。log(integer)发送整数。示例console.log(uint32(0))双参形式console.log(32bits at 0: , uint32(0))。log(float)发送浮点值。示例console.log(math.entropy(0, filesize))双参形式console.log(Entropy: , math.entropy(0, filesize))。实现见 libyara/modules/console/console.c。String 模块模块返回字符串的操作工具String 模块docs/modules/string.rst4.3.0提供操作模块返回字符串的函数。注意这里引用的字符串不是规则 strings 部分定义的 YARA 字符串。to_int(string)4.3.0把给定字符串转为有符号整数。以0x开头按 16 进制以0开头按 8 进制支持前导/-。示例string.to_int(1234) 1234string.to_int(-10) -10string.to_int(-010) -8to_int(string, base)4.3.0按给定基数转换。base 必须为 0 或 2~36为 0 时规则同单参形式。示例string.to_int(011, 8) 9string.to_int(-011, 0) -9length(string)4.3.0返回字符串长度可以是任意字节序列包含 NULL 字节。示例string.length(AXS\x00ERS) 7。实现见 libyara/modules/string/string.c。典型场景是把模块返回的字符串如pe.version_info[FileVersion]转换为整数参与数值比较。模块的内部实现模块生命周期与数据流理解模块如何在内部工作有助于编写更可靠的规则。每个模块是 C 源码编译进 YARA。模块源码放在源码树的libyara/modules目录建议以模块名命名源文件模块名foo对应foo.c。以 libyara/modules/demo/demo.c 为起点YARA 3.0 起引入模块机制核心骨架如下#include yara/modules.h #define MODULE_NAME demo begin_declarations; declare_string(greeting); end_declarations; int module_initialize( YR_MODULE* module) { return ERROR_SUCCESS; } int module_finalize( YR_MODULE* module) { return ERROR_SUCCESS; } int module_load( YR_SCAN_CONTEXT* context, YR_OBJECT* module_object, void* module_data, size_t module_data_size) { yr_set_string(Hello World!, module_object, greeting); return ERROR_SUCCESS; } int module_unload( YR_OBJECT* module_object) { return ERROR_SUCCESS; } #undef MODULE_NAME逐段解析#include yara/modules.h模块 API 的定义所在头文件所有模块都必须包含。#define MODULE_NAME demo定义模块名所有模块必须定义且模块名在内置模块中必须唯一。声明段begin_declarations;/end_declarations;之间用declare_string(greeting)等宏声明模块将暴露给规则的函数和数据结构还可用declare_integer、declare_float、declare_function等详见 docs/writingmodules.rst 的声明段一节。module_initializeYARA 初始化期间调用module_finalize在 YARA 收尾时调用用于初始化和释放模块所需的全局数据结构。module_load每扫描一个文件调用一次且仅当模块被某条规则的import指令引入时才调用。这是模块检查被扫描文件、按需解析分析、然后填充声明段定义的数据结构的地方。module_unload每次module_load调用对应一次module_unload用于释放module_load期间分配的资源。module_load与module_unload都应返回ERROR_SUCCESS表示一切正常。模块注册由 libyara/modules/module_list 中的MODULE(...)宏完成配合configure.ac中的条件编译宏控制可选模块的开关这正是前文各模块默认编译/需显式开启差异的来源。官方模块一览与选型建议模块引入版本默认编译核心能力适用场景PE3.0早期是PE 头字段、段、资源、导入导出、Authenticode 签名Windows 恶意样本检测ELF3.2.0是ELF 头字段、段、类型与架构Linux 可执行文件检测Cuckoo—否Windows 二进制已含基于沙箱行为报告的网络/文件行为条件结合行为分析的恶意软件检测Magic3.1.0否不支持 Windowsfile命令式类型识别文档/格式识别Hash3.2.0否Windows 二进制已含MD5/SHA1/SHA256/checksum32/crc32片段哈希签名Math3.3.0是熵、均值、偏差、相关性、Monte Carlo Pi加密/混淆数据识别Dotnet3.6.0否.NET 元数据、流、GUID.NET 恶意软件检测Time3.7.0是当前时间戳有效期/未来时间戳检测Console4.2.0是条件执行期间日志输出规则调试String4.3.0是字符串转整数、取长度模块返回值的二次处理各模块的完整 Reference包括本文未逐一列出的全部常量见 docs/modules/ 下对应文件模块测试样本可参考 tests/data/ 与 tests/oss-fuzz/如 tests/oss-fuzz/pe_fuzzer.cc、tests/oss-fuzz/dotnet_fuzzer.cc。编写自定义模块的完整指南见 Writing your own modules。赞分享网络安全模式匹配【免费下载链接】yaraThe pattern matching swiss knife项目地址https://gitcode.com/gh_mirrors/ya/yara点击查看免费下载相关推荐CMake模块系统详解从FindPackage到自定义模块CMake模块系统详解从FindPackage到自定义模块 CMake模块系统是整个构建生态的核心架构采用分层设计和模块化理念为开发者提供强大的扩展能力和构建工具开发工具CLI深入drozer模块系统从基础使用到自定义模块开发的终极指南深入drozer模块系统从基础使用到自定义模块开发的终极指南 drozer模块系统是Android安全测试框架的核心组件为安全研究人员提供了强大的自动化渗透渗透测试应用安全网络安全WXT 模块系统完全指南从构建流程扩展到自定义模块实战配方WXT 模块系统完全指南从构建流程扩展到自定义模块实战配方 WXT 的模块系统Module System是一套允许你在构建流程的不同阶段注入代码、从而修改前端开发工具构建工具插件系统上一篇drawio-desktop 完整指南免费跨平台流程图工具从零到专业图表下一篇Umi-OCR 免费离线文字识别教程3分钟完成截图与批量图片识别创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

免费获取报价