Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在elf二进制文件中,是否有任何简单的方法从偏移量获取内存地址?_Linux_Binary_Hex_Elf - Fatal编程技术网

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

Linux 在elf二进制文件中,是否有任何简单的方法从偏移量获取内存地址?,linux,binary,hex,elf,Linux,Binary,Hex,Elf,在elf二进制中,假设我知道二进制的偏移量。 在这种情况下,我如何知道该偏移区域的虚拟地址? 更详细地说,这里是二进制my_binary …我在二进制的0x204偏移量中找到了数据“密钥字符串”。 在这种情况下,0x204在内存中加载时映射到0x0804204。 问题: 最简单的方法是什么我从0x204获取地址信息0x0804204? 你能给我推荐一些有用的工具快捷方式吗(010editor或hxd) …或者我可以结合使用objdump命令来实现这一点吗?ELF程序有一个程序头,它列出PT\u

在elf二进制中,假设我知道二进制的偏移量。
在这种情况下,我如何知道该偏移区域的虚拟地址?
更详细地说,这里是二进制
my_binary

…我在二进制的
0x204
偏移量中找到了数据
“密钥字符串”

在这种情况下,
0x204
在内存中加载时映射到
0x0804204


问题:
最简单的方法是什么我从
0x204
获取地址信息
0x0804204

你能给我推荐一些有用的工具快捷方式吗(
010editor
hxd


…或者我可以结合使用
objdump
命令来实现这一点吗?

ELF程序有一个程序头,它列出
PT\u LOAD
段(
struct Elf32\u Phdr
struct Elf64\u Phdr
)。它们具有文件偏移量和长度(
p_offset
p_filesz
成员)以及虚拟地址和长度(
p_vaddr
p_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
段覆盖,因此在运行时由加载程序映射。如果数据位于未分配的节中,它将不在内存中(除非通过其他方式从磁盘读取)


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

我相信每次运行时这些地址都是随机的it@BlackBear不,它是二进制中的固定值。