我试图更好地理解内存地址。我刚刚开始检查带有hexdump.
Ex 输出的二进制文件:
0000000 cf fa ed fe 07 00 00 01 03 00 00 80 02 00 00 00
0000010 0e 00 00 00 b0 03 00 00 85 00 00 00 00 00 00 00
0000020 19 00 00 00 48 00 00 00 5f 5f 50 41 47 45 5a 45
0000030 52 4f 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0000040 00 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00
我的理解是,我在每行开头看到的代码是相对内存地址,表示为相对于基地址的偏移量。我想知道是否有办法可以获取绝对地址。
我很高兴有一个解决方案,它要么明确地向我显示这些地址,要么只是帮助我找出它们相对于的基地址,这样我就可以自己计算它们。
答案1
Hexdump 不知道任何有关地址(或内存)的信息。它只是打印一个字节流并在其前面加上到目前为止看到的字节数。如果其输入来自文件,则这些数字对应于文件中的位置。
要弄清楚文件加载后这些字节最终在内存中的位置,您需要查看文件中的元数据。对于 ELF 文件,这意味着节头(有时也意味着程序头)。
readelf -S path/to/your/binary
显示类似这样的内容:
Section Headers:
[Nr] Name Type Address Offset
Size EntSize Flags Link Info Align
…
[13] .text PROGBITS 000000000050eac0 0010eac0
0000000001833275 0000000000000000 AX 0 0 16
…
这里,“Offset”下的值是文件中特定部分开始的位置,“Address”下的值是相应的虚拟地址(它在内存中结束的位置)。您只需将这两者之间的差异添加到 from 的数字中hexdump
即可获得地址。
您还可以使用objdump -h path/to/your/binary
来获取相同的数据:
Sections:
Idx Name Size VMA LMA File off Algn
…
12 .text 01833275 000000000050eac0 000000000050eac0 0010eac0 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
…
同样,“File off”是文件中的偏移量,“VMA”是相应的虚拟地址。如果您想知道“LMA”是什么,请看一下这里。
答案2
根据我的理解,绝对物理地址是高度安全的。但是有一种方法可以找到逻辑地址。出于学习目的,您可以编写一个简单的 C 程序,其中包含无限循环并在后台运行。当程序运行时,您可以使用“pmap”,这是一个 Linux 实用程序来绕过程序的虚拟地址。在 Linux zsh 上在后台运行可执行文件的命令:
可执行文件名&
pmap -x process_id