在elf二进制文件中,是否有任何简单的方法从偏移量获取内存地址?

问题描述 投票:1回答:1

在elf二进制文件中,假设我知道二进制的偏移量。 在这种情况下,我如何知道该偏移区域的虚拟地址? 更详细地说,这里是二进制my_binary ...我在"the_key_string"的二进制偏移量中找到了数据0x204。 在这种情况下,0x2040x0804204中被加载到内存中。 题: 我从0x0804204获取地址信息0x204的最简单方法是什么? 你能推荐我在工具中使用任何有用的快捷方式(010editorhxd ..) ...或者我可以用objdump命令组合吗?

linux binary hex elf
1个回答
0
投票

ELF程序有一个程序头,列出了PT_LOAD段(struct Elf32_Phdrstruct Elf64_Phdr)。它们具有文件偏移和长度(p_offsetp_filesz成员)以及虚拟地址和长度(p_vaddrp_memsz)。关键是由文件偏移量和长度标识的区域在运行时在指定的虚拟地址处可用。虚拟地址相对于内存中对象的基址。

您可以使用readelf -l查看程序头:

Elf file type is DYN (Shared object file)
Entry point 0x1670
There are 9 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000000040 0x0000000000000040
                 0x00000000000001f8 0x00000000000001f8  R E    0x8
  INTERP         0x0000000000000238 0x0000000000000238 0x0000000000000238
                 0x000000000000001c 0x000000000000001c  R      0x1
      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000000000 0x0000000000000000
                 0x000000000000627c 0x000000000000627c  R E    0x200000
  LOAD           0x0000000000006d68 0x0000000000206d68 0x0000000000206d68
                 0x00000000000004b8 0x0000000000000658  RW     0x200000
…

在这种情况下,有两个加载段,一个是可读的和可执行的(程序代码),一个是可读写的(数据和重定位)。

并非二进制文件的所有部分都被PT_LOAD段覆盖,因此在运行时由加载程序映射。如果数据位于未分配的部分,则它将不在内存中(除非您通过其他方式从磁盘读取它)。

但是,如果数据已分配,则它将落入其中一个加载段,一旦获得基址,就可以使用加载段中的信息从文件偏移量计算虚拟地址。

© www.soinside.com 2019 - 2024. All rights reserved.