YARA:第七章-模块使用之PE

        模块是对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官方文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_只道当时是寻常

打赏不得超过工资的一半呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值