YARA:第八章-模块使用之ELF

       ELF(Executable and Linkable Format)文件格式是UNIX系统实验室开发的,用于可执行文件、目标文件和库的标准文件格式,它也是Linux系统下的主要文件格式 19。ELF文件格式主要包括三种类型:可重定位文件(通常是.o文件)、可执行文件、共享对象文件(如动态库文件.so)。

         ELF模块支持解析ELF格式文档,供用户更加灵活的判断ELF类型的文件。该模块使用示例如下:

import "elf"

rule single_section
{
    condition:
        elf.number_of_sections == 1
}

rule elf_64
{
    condition:
        elf.machine == elf.EM_X86_64
}

        下表是ELF模块支持的一些属性和方法:

名称

类型

描述

elf.type

属性

表示elf文件类型,Yara支持使用以下变量值作为类型值:

ET_NONE(无类型)

ET_REL(可重定位文件)

ET_EXEC(可执行文件)

ET_DYN(共享对象文件)

ET_CORE(核心转储文件)

使用示例如下:

condition:

elf.type == elf.ET_EXEC

elf.machine

属性

elf文件头部的e_machine字段是一个16位的值,用于标识目标文件兼容的处理器架构。Yara支持使用以下变量值作为机器类型值:

EM_NONE(无机器类型)

EM_M32(AT&T WE 32100)

EM_SPARC(SPARC架构)

EM_386(Intel 80386)

EM_68K(Motorola 68000系列)

EM_88K(Motorola 88000)

EM_860(Intel 80860)

EM_MIPS(MIPS R3000)

EM_MIPS_RS3_LE(MIPS R3000 Little-Endian)

EM_PPC(PowerPC)

EM_PPC64(64位的PowerPC架构)

EM_ARM(ARM架构)

EM_X86_64(AMD x86-6)

EM_AARCH64(ARM 64位架构)

使用示例如下:

elf.machine == elf.EM_X86_64

elf.entry_point

属性

可执行文件入口点,即程序开始执行的位置(程序第一条指令将要运行的内存地址)。如果当前扫描的是文件,此属性表示距离文件开头的偏移量;如果当前扫描的是进程内存,此属性表示虚拟地址。

elf.number_of_sections

属性

表示elf文件中section的数量。

elf.sections

数组对象

此对象是数组类型,数组中每个元素对应着section的结构体,可通过运算符"[]"访问数组中的任意元素信息。结构体中包含的成员有name(section的名称,类似.bss,.data)

size(section大小,单位字节)

offset(section开始部分距离文件开头的偏移量)

type(section类型,包含SHT_NULL、SHT_PROGBITS、SHT_SYMTAB、SHT_STRTAB、SHT_RELA、SHT_HASH、SHT_DYNAMIC、SHT_NOTE、SHT_NOBITS、SHT_REL、SHT_SHLIB、SHT_DYNSYM)

flags(section标志位,包含SHF_WRITE、SHF_ALLOC、SHF_EXECINSTR)

address(section开始部分的虚拟地址)

使用示例如下:

elf.sections[2].flags & elf.SHF_WRITE

elf.sections[3].name == ".bss"

elf.number_of_segments

属性

elf文件中segment的数量。

elf.segments

数组对象

此对象是数组类型,数组中每个元素对应着segment的结构体,可通过运算符"[]"访问数组中的任意元素信息。结构体中包含的成员有

alignment(定义了该segment在内存中对齐的边界,它要求数据结构在内存中按照特定的边界地址开始)

file_size(表示该段在文件中所占的字节大小)

flags(下面标志为的组合,包括PF_R[可读]、PF_W[可写]、PF_X[可执行])

memory_size(内存中段大小)

offset(段距离文件开头的偏移量)

physical_address(段在内存中的物理地址,并不常用,因为现在操作系统通常使用虚拟内存管理,并不直接映射到物理地址)

type(段类型,包含PT_NULL、PT_LOAD、PT_

DYNAMIC、PT_INTERP、PT_NOTE、PT_SHLIB、PT_PHDR、PT_LOPROC、PT_HIPROC、 PT_GNU_STACK)

virtual_address(段在内存中的虚拟地址)

elf.dynamic_section_entries

属性

elf文件中动态节(.dynamic)的数量。动态节包含了链接器在程序运行时所需要的信息。

elf.dynamic

数组对象

此对象是数组类型,数组中每个元素对应着dynamic的结构体,可通过运算符"[]"访问数组中的任意元素信息。结构体中包含的成员有

type(动态节类型,包含DT_NULL、DT_NEEDED、DT_PLTRELSZ、DT_PLTGOT、DT_HASH、DT_STRTAB、DT_SYMTAB、DT_RELA、DT_RELASZ、DT_RELAENT、DT_STRSZ、DT_SYMENT、DT_INIT、DT_FINI、DT_SONAME、DT_RPATH、DT_SYMBOLIC、DT_REL、DT_RELSZ、DT_RELENT、DT_PLTREL、DT_DEBUG、DT_TEXTREL、DT_JMPREL、DT_BIND_NOW、 DT_INIT_ARRAY、DT_FINI_ARRAY、DT_INIT_ARRAYSZ、DT_FINI_ARRAYSZ、DT_RUNPATH、DT_FLAGS、DT_ENCODING)

value(此字段表示的类型和含义与dynamic节的type有关)

elf.symtab_entries

属性

elf文件中符号表条目的数量。符号表(symbol table)主要用来存储程序中定义和引用的所有符号(例如变量和函数)的信息。每个符号表条目(entry)包含了关于一个符号的详细信息,例如符号的名称、类型、大小、位置等。

elf.symtab

数组对象

此对象是数组类型,数组中每个元素对应着符号表的条目的结构体,可通过运算符"[]"访问数组中的任意元素信息。结构体中包含的成员有

name(条目的名称)

value(与条目相关的值,一般是虚拟地址)

size(条目的大小)

type(条目的类型,包含STT_NOTYPE、STT_OBJECT、STT_FUNC、STT_SECTION、STT_FILE、STT_COMMON、STT_TLS)

bind(条目的绑定属性定义了符号的作用域和可见性。它决定了符号是局限于定义它的文件内部,还是可以在其它文件或程序中被访问。包含的属性有STB_LOCAL、STB_GLOBAL、STB_WEAK)

shndx(条目所关联的section节的索引值)

elf.telfhash()

方法

使用TLSH哈希算法计算并返回ELF文件导出表和导入表的哈希值。

使用示例如下:

elf.telfhash() == "t166a00284751084526486df8b5df5b2fccb3f511dbc188c37156f5e714a11bc5d71014d"

elf.import_md5()

方法

返回导入表的MD5哈希值。

使用示例如下:

elf.import_md5() == "c3eca50cbb03400a6e91b9fe48da0c0c"

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_只道当时是寻常

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

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

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

打赏作者

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

抵扣说明:

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

余额充值