跳到主要内容

elf

elf 库用于解析 ELF(Linux/Unix 可执行与可链接格式)文件,读取其头部、节(section)、段(segment)、架构与入口点信息,常用于二进制分析、固件检查与恶意样本研判。

典型使用场景:

  • 识别与概览:elf.IsELF 判断是否 ELF,elf.DisplayELF 输出可读概览,elf.ParseELF 解析为结构。
  • 读取结构:elf.ReadELFHeader 读头部,elf.ReadELFSections / elf.GetELFSection 读节,elf.ReadELFSegments / elf.GetELFSegment 读段,elf.GetELFArchitecture / elf.GetELFEntryPoint 取架构与入口。

与相邻库的关系:elf 属于二进制分析工具,与 bin(通用二进制解析)、java(Java 字节码)、sca(成分分析)同属逆向/审计方向。

共 10 个函数

函数索引

函数参数返回值说明
elf.DisplayELFfile anystring, error以 readelf 风格输出格式化的 ELF 文件信息字符串
elf.GetELFArchitecturefile anystring, error获取 ELF 文件的机器架构类型
elf.GetELFEntryPointfile anyuint64, error获取 ELF 文件的入口地址
elf.GetELFSectioninfo *ELFInfo, index int*ELFSection, error获取指定索引的 ELF 节信息
elf.GetELFSegmentinfo *ELFInfo, index int*ELFSegment, error获取指定索引的 ELF 段信息
elf.IsELFfile stringbool检查文件是否为 ELF 格式(通过文件头魔数 0x7F 45 4C 46 判断)
elf.ParseELFfile any*ELFInfo, error解析 ELF 文件,返回包含文件头、段、节的完整信息结构
elf.ReadELFHeaderfile any*ELFHeader, error仅读取 ELF 文件头信息
elf.ReadELFSectionsfile any[]ELFSection, error读取 ELF 的节(Section Header)信息列表
elf.ReadELFSegmentsfile any[]ELFSegment, error读取 ELF 的段(Program Header)信息列表

函数详情

DisplayELF

DisplayELF(file any) (string, error)

以 readelf 风格输出格式化的 ELF 文件信息字符串

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1string格式化的 ELF 信息字符串
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
output, err = elf.DisplayELF("/path/to/binary")
if err != nil { die(err) }
println(output)

GetELFArchitecture

GetELFArchitecture(file any) (string, error)

获取 ELF 文件的机器架构类型

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1string架构类型字符串,如 "EM_X86_64 (AMD x86-64)"
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
arch, err = elf.GetELFArchitecture("/path/to/binary")
if err != nil { die(err) }
println(arch)

GetELFEntryPoint

GetELFEntryPoint(file any) (uint64, error)

获取 ELF 文件的入口地址

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1uint64入口地址
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
entry, err = elf.GetELFEntryPoint("/path/to/binary")
if err != nil { die(err) }
println(entry)

GetELFSection

GetELFSection(info *ELFInfo, index int) (*ELFSection, error)

获取指定索引的 ELF 节信息

参数

参数名类型说明
info*ELFInfoELF 信息结构(由 elf.ParseELF 得到)
indexint节索引

返回值

序号类型说明
r1*ELFSectionELF 节信息
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
info, err = elf.ParseELF("/path/to/binary")
if err != nil { die(err) }
sect, err = elf.GetELFSection(info, 0)
if err != nil { die(err) }
println(sect.Name)

GetELFSegment

GetELFSegment(info *ELFInfo, index int) (*ELFSegment, error)

获取指定索引的 ELF 段信息

参数

参数名类型说明
info*ELFInfoELF 信息结构(由 elf.ParseELF 得到)
indexint段索引

返回值

序号类型说明
r1*ELFSegmentELF 段信息
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
info, err = elf.ParseELF("/path/to/binary")
if err != nil { die(err) }
seg, err = elf.GetELFSegment(info, 0)
if err != nil { die(err) }
println(seg.Type)

IsELF

IsELF(file string) bool

检查文件是否为 ELF 格式(通过文件头魔数 0x7F 45 4C 46 判断)

参数

参数名类型说明
filestring文件路径

返回值

序号类型说明
r1bool是否为 ELF 文件

示例

// 写入 ELF 魔数后应被识别为 ELF
p = file.Join(os.TempDir(), "yak-elf-example.bin")
file.Save(p, codec.DecodeHex("7f454c46")~)~
println(elf.IsELF(p)) // OUT: true
assert elf.IsELF(p) == true, "file with ELF magic should be recognized"
file.Remove(p)

ParseELF

ParseELF(file any) (*ELFInfo, error)

解析 ELF 文件,返回包含文件头、段、节的完整信息结构

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1*ELFInfoELF 文件信息(含 Header、Segments、Sections)
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
info, err = elf.ParseELF("/path/to/binary")
if err != nil { die(err) }
println(info.Header.Magic)
println(info.Header.Machine)

ReadELFHeader

ReadELFHeader(file any) (*ELFHeader, error)

仅读取 ELF 文件头信息

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1*ELFHeaderELF 文件头信息(含 Class、Machine、Entry 等)
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
header, err = elf.ReadELFHeader("/path/to/binary")
if err != nil { die(err) }
println(header.Class)
println(header.Machine)

ReadELFSections

ReadELFSections(file any) ([]ELFSection, error)

读取 ELF 的节(Section Header)信息列表

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1[]ELFSectionELF 节信息列表
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
sections, err = elf.ReadELFSections("/path/to/binary")
if err != nil { die(err) }

for sect in sections {
if sect.IsSymTab { println(sect.Name) }
}

ReadELFSegments

ReadELFSegments(file any) ([]ELFSegment, error)

读取 ELF 的段(Program Header)信息列表

参数

参数名类型说明
fileany文件路径(string)或字节数组([]byte)

返回值

序号类型说明
r1[]ELFSegmentELF 段信息列表
r2error错误信息

示例

// 示意性示例,需要真实的 ELF 二进制文件
segments, err = elf.ReadELFSegments("/path/to/binary")
if err != nil { die(err) }

for seg in segments {
if seg.IsCode { println(seg.Type) }
}