模块是对Yara检测功能的扩展。一些模块例如PE、Cukoo等模块是Yara正式支持的模块,随Yara正式发布。当然,用户可以根据自己的需求创建自己的模块集成到Yara程序中。
Yara支持在规则文件中导入模块对象,这些导入语句一般放在文件的开始部分,使用关键字"import"和模块名。示例如下:
import "pe"
import "cuckoo"
接下来我们就可以使用所导入模块所支持的函数或者变量。示例如下:
pe.entry_point == 0x1000
cuckoo.http_request(/someregexp/)
1. PE模块
PE文件格式,全称为Portable Executable,是Windows操作系统用于可执行文件、DLL(动态链接库)、以及设备驱动程序的标准文件格式。
PE Module允许用户参照PE文件格式的属性和特征为PE文件创建更精细的规则。该模块支持PE文件头中大部分的字段,并提供了可用于编写更具针对性的规则函数。下面是使用示例:
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模块支持的属性和函数信息。
名称 | 类型 | 描述 |
pe.machine | 属性 | 16位值,表示目标机器类型。 |
pe.checksum | 属性 | 保存在OptionHeader中的32位校验和。 |
pe.calculate_checksum() | 方法 | 计算PE文件的校验和。使用示例: pe.checksum == pe.calculate_checksum() |
pe.subsystem | 属性 | 标识PE文件为那种类型的Windows子系统设计。 |
pe.timestamp | 属性 | 保存在OptionHeader中的时间戳值,表示自1970年1月1日开始以来的秒数。使用示例: pe.timestamp >= 1424563200 |
pe.pointer_to_symbol_table() | 属性 | PointerToSymbolTable是PE文件的COFF头部结构IMAGE_FILE_HEADER中的32位或64位值,表示文件中符号表的起始字节偏移量。 |
pe.number_of_symbols | 属性 | NumberOfSymbols是PE文件的COFF头部结构IMAGE_FILE_HEADER中的32位值,表示在COFF符号表中符号的总数。 |
pe.size_of_optional_header | 属性 | SizeOfOptionalHeader是PE文件的COFF头部结构IMAGE_FILE_HEADER中的16位值,表示可选头部IMAGE_OPTIONAL_HEADER的大小。 |
pe.opthdr_magic | 属性 | Magic是PE文件的IMAGE_OPTIONAL_HEADER中的16位值,标识PE文件类型和格式。包含以下三种类型:IMAGE_NT_OPTIONAL_HDR32_MAGIC、 IMAGE_NT_OPTIONAL_HDR64_MAGIC、 IMAGE_ROM_OPTIONAL_HDR_MAGIC。 |
pe.size_of_code | 属性 | SizeOfCode是PE文件IMAGE_OPTIONAL_HEADER中的值,表示PE文件中代码部分的大小。 |
pe.size_of_initialized_data | 属性 | SizeOfInitializedData是PE文件IMAGE_OPTIONAL_HEADER中的值,表示PE文件中所欲初始化段(例如.data节)的总大小。 |
pe.size_of_uninitialized_data | 属性 | SizeOfUninitializedData是PE文件IMAGE_OPTIONAL_HEADER中的值,表示PE文件中所有未初始化数据段的总大小。这些数据段包含程序中声明但未显式初始化的全局变量和静态变量。在程序的执行过程中,这些变量在使用前需要被显式初始化。 |
pe.entry_point | 属性 | 可执行文件入口点位置偏移量或者可执行程序入口点的虚拟地址。等效于关键字"entrypoint"。 |
pe.entry_point_raw | 属性 | AddressOfEntryPoint是PE文件COFF头部结构IMAGE_OPTIONAL_HEADER中字段值,用于指定程序的入口点地址,即告诉操作系统从哪里开始执行程序的代码。该值并不表示距离文件开始的偏移值或者相对虚拟地址(RVA)。 |
pe.base_of_code | 属性 | BaseOfCode是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示代码段(.text节)在内存中的基地址偏移量。 |
pe.base_of_data | 属性 | BaseOfData是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示数据段(.data节)在内存中的机制偏移量。 |
pe.image_base | 属性 | ImageBase是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示PE文件在内存中的基址,即程序加载到内存时的起始地址。 |
pe.section_alignment | 属性 | SectionAlignment是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示PE文件加载到内存时各个节(sections)的对齐因子,即PE文件的节在内存中必须对其的最小单位。 |
pe.file_alignment | 属性 | FileAlignment是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示文件在磁盘上节(sections)的对齐因子。 |
pe.size_of_image | 属性 | SizeOfImage是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示PE文件加载到内存中时所占用的总大小。 |
pe.size_of_headers | 属性 | SizeOfHeaders是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示文件头的大小,即从文件的起始位置到文件的最后一个头(通常是最后一个节的结束位置)之间的字节数。这个字段通过包括PE签名、DOS头、文件头、可选头以及所有节的头信息的和。 |
pe.characteristics | 属性 | Characteristics是PE文件中IMAGE_FILE_HEADER中的值,用于存储文件的属性或特性。Characteristics字段定义了PE文件的多种属性,例如是否可执行、是否是DLL、是否应该使用大地址空间等。 |
pe.linker_version | 属性 | 包含两个整形对象,分别是链接器的major版本号和minor版本号。使用示例如下: pe.linker_version.major == 2 pe.linker_version.minor == 3 |
pe.os_version | 属性 | 包含两个整形对象,分别是操作系统的major版本号和minor版本号。使用示例如下: pe.os_version.major == 2 pe.os_version.minor == 3 |
pe.image_version | 属性 | 包含两个整形对象,分别是image的major版本号和minor版本号。使用示例如下: pe.image_version.major == 2 pe.image_version.minor == 3 |
pe.subsystem_version | 属性 | 包含两个整形对象,分别是子系统的major版本号和minor版本号。使用示例如下: pe.subsystem_version.major == 2 pe.subsystem_version.minor == 3 |
pe.dll_characteristics | 属性 | DllCharacteristics是PE文件中IMAGE_OPTIONAL_HEADER中的值,是一个16位的位字段,用于存储DLL的特定属性或特性。一般通过按位与获取这些特性。 |
pe.size_of_stack_reserve | 属性 | SizeOfStackReserve是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示程序启动时为每个线程的堆栈分配的初始虚拟内存量。 |
pe.size_of_stack_commit | 属性 | SizeOfStackCommit是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示程序启动时为每个线程的堆栈初始提交(即实际分配)的内存大小。 |
pe.size_of_heap_reserve | 属性 | SizeOfHeapReserve是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示程序启动时为堆保留的初始虚拟内存地址空间大小。 |
pe.size_of_heap_commit | 属性 | SizeOfHeapCommit是PE文件中IMAGE_OPTIONAL_HEADER中的值,表示程序启动时实际分配给堆的内存大小。 |
pe.number_of_rva_and_sizes | 属性 | NumberOfRvaAndSizes是PE文件中IMAGE_OPTIONAL_HEADER中的值,用于指定在IMAGE_OPTIONAL_HEADER结构体中跟随其后的“数据目录”(Data Directory)的数量。每个数据目录项都包含了一个特定的PE文件部分或表的相对虚拟地址(RVA)和大小。 |
pe.data_directories | 属性 | 此对象是一个"数据目录"数组,每个元素包含两个属性对象,分别是"数据目录"的虚拟地址(virtual_address)、长度(size)。使用示例如下: pe.data_directories[1].size == 20 Yara中也定义了一些目录的索引,例如IMAGE_DIRECTORY_ENTRY_EXPORT、IMAGE_DIRECTORY_ENTRY_IMPOR等,更多索引可参考Yara官方文档。使用示例如下: pe.data_directories[pe.IMAGE_DIRECTORY_ENTRY_EXPORT].virtual_address != 0 |
pe.number_of_sections | 属性 | PE文件中section的数量。 |
pe.sections | 属性 | 此对象是一个section数组,可以使用[]运算符访问各个section信息。每个元素包含属性的属性有section名称(name)、section全名(full_name)、特性(characteristics)、虚拟地址(virtual_address)、虚拟大小(virtual_size)、原始数据偏移(raw_data_offset)、原始数据大小(raw_data_size)等。使用示例如下: pe.sections[0].name == ".text" |
pe.number_of_resources | 属性 | PE文件中资源的数量。 |
pe.resource_timestamp | 属性 | 资源时间戳。 |
pe.resource_version | 属性 | 资源版本。此对象包含两个属性,分别是major和minor。 |
pe.resources | 属性 | 此对象是一个资源数组,可以使用[]运算符访问各个资源信息。数组中每个元素包含属性有rva、offset、length、type、id、language、type_string、name_string、language_string。使用示例如下: pe.resources[0].name_string == "F\x00I\x00L\x00E\x00" pe.resources[0].type == pe.RESOURCE_TYPE_RCDATA 其中pe.RESOURCE_TYPE_RCDATA是pe模块定义的资源类型一种,更多资源类型的定义可查看Yara文档。 |
pe.version_info | 属性 | 字典类型对象,包含的键有Comments、CompanyName、FileDescription、FileVersion、InternalName、LegalCopyright、LegalTrademarks、OriginalFilename、ProductName、ProductVersion。使用示例如下: pe.version_info["CompanyName"] contains "Microsoft" |
pe.version_info_list | 属性 | 包含了版本信息数组,数组中每个元素包含key、value属性。使用示例如下:pe.version_info_list[0].value contains "Microsoft" |
pe.number_of_signatures | 属性 | PE文件中Authenticode的数量。 |
pe.is_signed | 属性 | 只要有PE签名得到验证,此属性为True。 |
pe.signatures | 属性 | 签名对象数组,数组中包含每一个PE文件中Authenticode信息。每个元素包含的属性有thumbprint、issuer、subject、version、algorithm、algorithm_oid、serial、not_before、not_after、verified、digest_alg、digest、file_ digest、number_of_certificates、valid_on (timestamp)这是个函数,只要签名在时间戳表示的日期内则返回true、ertificates等。更多属性信息参考Yara文档说明。 |
pe.rich_signature | 属性 | 包含PE文件rich signature信息。此对象包含很多属性例如offset、length、key等。 |
pe.pdb_path | 属性 | PE文件的PDB文件的路径。使用示例: pe.pdb_path == "D:\workspace\Release\custprof.pdb" |
pe.is_pe | 属性 | 如果当前检测文件是PE格式,返回true,否则返回false。使用示例如下: pe.is_pe |
pe.is_dll() | 方法 | 返回PE格式文件是否是DLL文件,是则返回true,否则返回false。使用示例如下: pe.is_dll() |
pe.is_32bit() | 方法 | 判断PE文件是否是32位格式,是则返回true,否则返回false。使用示例如下: pe.is_32bit() |
pe.is_64bit() | 方法 | 判断PE文件是否为64位格式,是则返回true,否则返回false。使用示例如下: pe.is_64bit() |
更多详细用法参考Yara官方文档。