zoukankan      html  css  js  c++  java
  • 4.2文件格式分析

    4.2文件格式分析

    20135206 于佳心

     

    一般的 ELF 文件包括三个索引表:ELF header,Program header table,Section header table。

    1)ELF header:在文件的开始,保存了路线图,描述了该文件的组织情况。

    2)Program header table:告诉系统如何创建进程映像。用来构造进程映像的目标文件必须具有程序头部表,可重定位文件不需要这个表。

    3)Section header table :包含了描述文件节区的信息,每个节区在表中都有一项,每一项给出诸如节区名称、节区大小这类信息。用于链接的目标文件必须包含节区头部表,其他目标文件可以有,也可以没有这个表。

     

    1. 分析ELF文件头(ELF header)

      进行编译运行,生成elf可执行文件。

      使用'readelf –a elf1'命令,得到ELF Header头文件的信息

      发现Elf Header的Size为52bytes,使用hexdump工具将头文件的16进制表打开。

      hexdump –x elf1 –n 64:查看elf文件头的16进制表

       

      第一行:前四个字节7f454c46是魔数,表示这是一个ELF对象。下一个字节01表示是一个32位对象,再下一个字节01表示是小端法表示,再接下来的一个字节01表示文件头版本。剩下的默认都设置为0.

      第二行:e_type值为0x0002,表示是一个可执行文件。e_machine值为0x0003。e_version值为0x00000100,表示是当前版本。e_entry值为0x 08048330,表示入口点。e_phoff值为0x40,表示程序头表。

      第三行:e_shoff值为0x113c,表示段表的偏移地址。e_flags值为0x00000000,表示未知处理器特定标志。e_ehsize值为0x0034,表示elf文件头大小。e_phentsize表示一个program header表中的入口的长度,值为0x0020。e_phnum的值为0x0009,给出program header表中的入口数目。e_shentsize值为0x0028表示段头大小为52个字节。

      第四行:e_shnum值为0x001e,表示段表入口有30个。e_shstrndx值为0x001b,表示段名串表的在段表中的索引号。

       

      2、通过文件头找到section header table,理解其内容

      file elf1显示生成的目标文件elf1的类型

      elf1是一个可执行文件。

      输入:ls –l elf1查看elf1的大小:

      如图可知,elf1大小为7160字节。

      输入:hexdump –x elf1来用16进制的数字来显示elf1的内容

      输入:readelf –a elf1来查看各个段信息:

      段表Section header table:其中text的索引号是13

      符号表 Symbol table:

       

      3、通过section header table找到各section

      只要在 section header table 中找到每个 section header,就可以通过 section header 找到想要的 section。

      使用'vi /usr/include/elf.h '命令查看Sections Header的结构体:

      用readelf 命令去查看.text这个 section 中的内容,输入readelf –x 13 elf1,对13索引号的.text的section的内容进行查看,输出".text"字节的十六进程输出:

      用 hexdump 的方法读取.text,先看section header,.text中offset和size分别是0x330和0x19c,通过16进制向10进制转换得到offset:816和size:412。

      输入 hexdump –s 816 –n 412 –C elf1

      与上面的readelf进行比较,发现得到的结果相同。

      对elf1的文本段(.text)进行反汇编:objdump –d elf1

       

      4、理解常见.text .strtab .symtab .rodata等section

      ①.text section是可执行指令的集合,.data和.text都是属于PROGBITS类型的section,这是将来要运行的程序与代码。查询段表可知.text section的位偏移为0x0000440,size为0x0000192。

      ②.strtab section是属于STRTAB类型的section,可以在文件中看到,它存着字符串,储存着符号的名字。位偏移为0x0001f08,size为0x0000238。

       

      ③.symtab section存放所有section中定义的符号名字,比如"data_items","start_loop"。 .symtab section是属于SYMTAB类型的section,它描述了.strtab中的符号在"内存"中对应的"内存地址"。 位偏移为0x00018f0,size为0x0000618。

       

      ④.rodata section,ro代表read only,即只读数据(const)。位偏移为0x00005e0,size为0x000000c。

  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/javablack/p/5585163.html
Copyright © 2011-2022 走看看