ELF Header 分析

转载 2015年07月09日 13:32:18
这里先定义数据的表示形式
Name         Size    Alignment
ELF32_Addr    4B       4B
ELF32_Half    4B       2B
ELF32_Off     4B       4B
ELF32_Sword   4B       4B
ELF32_Word    4B       4B
unsigned char 1B       1B

在elf文件中,都是使用的这几种数据类型。

下面介绍elf header。定义如下:
下面的信息来自/usr/include/elf.h
/* The ELF file header.  This appears at the start of every ELF file.  */
#define EI_NIDENT (16)
typedef struct
{
    unsigned char e_ident[EI_NIDENT];  /* Magic number and other info */
    Elf32_Half    e_type;              /* Object file type */
    Elf32_Half    e_machine;           /* Architecture */
    Elf32_Word    e_version;           /* Object file version */
    Elf32_Addr    e_entry;             /* Entry point virtual address */
    Elf32_Off     e_phoff;             /* Program header table file offset */
    Elf32_Off     e_shoff;             /* Section header table file offset */
    Elf32_Word    e_flags;             /* Processor-specific flags */
    Elf32_Half    e_ehsize;            /* ELF header size in bytes */
    Elf32_Half    e_phentsize;         /* Program header table entry size */
    Elf32_Half    e_phnum;             /* Program header table entry count */
    Elf32_Half    e_shentsize;         /* Section header table entry size */
    Elf32_Half    e_shnum;             /* Section header table entry count */
    Elf32_Half    e_shstrndx;          /* Section header string table index */
} Elf32_Ehdr;
先看Elf32_Ehdr,这个结构体的大小是52B,可以由上面定义的数据类型的大小计算出来。接下来一个一个看看Elf32_Ehdr的结构成员。

e_ident[EI_NIDENT]: 这个是elf identification.
前四个字节EI_MAG) ~ EI_MAG3, 内容目前固定为'0x7f','E','L','F'.
第五个字节EI_CLASS的内容指明该文件的种类,有三种情况:
ELFCLASSNONE
0
Invalid calss
ELFCLASS32
1
32-bit bojects
ELFCLASS64
2
64-bit objexts
第六个字节EI_DATA指明data encoding,即是LSB, 还是MSB.
第七个字节EI_VERSION指明文件的版本。
第八个字节EI_PAD指明在e_ident中未使用字节的开始处,这些都是保留字节,且被设置为零。

e_type:指明目标该文件的类型
Name
Value
Meaning






















e_machine:指明可以在哪种机器结构中运行。
e_version:指明版本信息
e_entry:指明系统运行该程序时将控制权转交到的虚拟地址的值,如果没有则为零。
e_phoff: program header table在文件中的字节(Byte)偏移offset,如果没有program header table, 则该值为零。
e_shoff: section header table在文件中的字节偏移,如果没有section header table, 则该值为零
e_flags: 有关处理器的信息
e_ehsize: elf header的大小,单位:字节
e_phentsize: 在program header table中一个entry的大小,前面提到过,program header table & section header table都是数组,所以它们的每一个元素,即每一个entry的大小,都是一样的。
e_phnum: program header table中元素的个数,即entry的个数。
e_shentsize: section header table每一个entry的大小,与e_phentsize类似。
e_shnum: section header table中元素的个数,即entry的个数。可以看出来,这个program header table或者section header table的大小可以用entry的个数乘以每一个entry的大小得到。
e_shstrndx: 指明string name table在section header table中的index。
例子程序:
#include stdio.h>
#include elf.h>
int main(int ac, char **av)
{
    FILE *fp;
    Elf32_Ehdr elfheader;
    if(ac != 2) {
        printf("usage: av[0] elf_filename\n");
        exit(-1);
    }
    fp = fopen(av[1], "r");
    if(fp == NULL) {
        printf("open file error %s\n", av[1]);
        exit(-2);
    }
    fread(&elfheader, sizeof(char), sizeof(elfheader), fp);
   /*print out the elf header infomation here*/
}

在linux 2.4.20下编译通过,并可正确执行。
当然,为了理解深刻,也可以这样写程序

typedef union _int4
{
    unsigned char a[4];
    unsigned int size;
} INT4;
typedef union _int2
{
    unsigned char a[2];
    unsigned short int size;
}INT2;
unsigned char elf_header[52];/*因为elf_header是52B*/
/*elf_header中的所有元素都在这52个字节中了,可以得到header中的所有东西,只是要注意LSB和MSB的区别*/

Python3加载libc.so出错(python3 OSError _lib64_libc.so invalid ELF header)

出错环境 CentOS 7.4 x64 Python 3.5.4 现象和解决方案 执行下面代码时,即Python3加载libc.so: from ctypes import * i...
  • u012163234
  • u012163234
  • 2018年01月22日 10:45
  • 268

ELF Section Header 分析

ELF Section Header的结构还是要从/usr/include/elf.h中看。 typedef struct {   Elf32_Word sh_name; /* Sectio...
  • mudongliangabcd
  • mudongliangabcd
  • 2015年05月19日 16:44
  • 465

elf和AXF中头部信息分析

介绍了 elf和axf中头部信息的查看方法和查看命令的参数 介绍了头部信息的名称意义...
  • xuweiwei1860
  • xuweiwei1860
  • 2014年03月06日 20:25
  • 1178

ELF文件头读取修改

ELF = Executable and Linkable Format,可执行连接格式,是UNIX系统实验室(USL)作为应用程序二进制接口(Application Binary Interfa...
  • holandstone
  • holandstone
  • 2012年03月12日 10:30
  • 5581

apache安装与简单配置操作

 1.安装apache下载 http://apache.mirrors.hoobly.com/httpd/httpd-2.2.3.tar.gzcd /usr/tar zxvf httpd-2.2.3....
  • chenzenan
  • chenzenan
  • 2009年06月06日 12:57
  • 2035

关于java jni调用c++动态库的一些问题及解决方法

最近使用java jni接口技术调用c++完成的动态库,平台为虚拟机下的centos 6.6。 编译出来的*.so 文件在被java调用过程中出现了各种错误。 1. java com.cmsz.znw...
  • u011803182
  • u011803182
  • 2016年12月23日 16:08
  • 384

linux中ELF对象文件分析工具readelf小结

1.readelf命令         readelf命令是Linux下的分析ELF文件的命令,这个命令在分析ELF文件格式时非常有用。                 readelf使用方法:   ...
  • wangjianno2
  • wangjianno2
  • 2015年10月02日 23:33
  • 824

ELF之學習心得02 - ELF Header(e_ident篇)

這是ELF的layout,所謂的Linking View是指以檔案呈現之ELF(左圖),而Execution View則是指被載入到RAM上執行的ELF(右圖)。ELF header會包含整個檔案的"...
  • HMSIWTV
  • HMSIWTV
  • 2012年09月18日 16:49
  • 4059

解析ELF 所有字符串相关的节

只是解析字符串节,不是字符
  • ylcangel
  • ylcangel
  • 2014年07月20日 22:26
  • 973

XELF病毒分析-秘密花园

秘密花园 概述母包结构 当我们拿到样本的时候查看内部的代码结构,可以判定这里面被里面插入广告sdk和几个莫名其妙的so以及一些加密的文件,当然我们首先就是需要了解每个文件都是用来干嘛,哪些代码块是恶意...
  • u011266992
  • u011266992
  • 2017年04月14日 16:40
  • 680
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ELF Header 分析
举报原因:
原因补充:

(最多只允许输入30个字)