为什么我的 RAM 是 16G 时只有 8 个 hexa 内存位

逆向工程 拆卸 部件 雷达2 记忆 反汇编者
2021-07-07 09:42:21

我对逆向工程完全陌生,当我开始使用radare2调试我的c程序并开始显示汇编时,我发现地址只是8 hexa数字,这意味着16^8= 4294967296字节,即4G RAM. 但我有16G RAM,这是17179869184字节,9 digits不需要 8

这是radare2 视图中的程序集的一部分:

0x004011d0      750e           jne 0x4011e0
0x004011d2      488d3d410e00.  lea rdi, str.Acess_granted  ; 0x40201a ; "Acess granted!" ; const char *s

我想我在这里误解了一些东西,有人可以澄清一下吗?提前致谢。

1个回答

您的物理 RAM 大小并没有过多说明您的内存地址的外观。重要的是您的系统架构以及多少位(通常是 64 或 32)。虚拟内存也使 RAM 变得无关紧要;每个进程都有可能覆盖整个地址空间但映射到物理内存的有限部分的虚拟内存空间即使在理论上有 2^64 字节(不切实际的 16 exibytes)可映射地址的 64 位系统上,您仍然可以拥有低于 1GB RAM 的系统,并且仍然可以访问虚拟地址空间(这要少得多)实际上比 2^64 大,但仍可能比您的物理 RAM 大)。

您在radare (0x004011d0) 中看到的是可执行文件本身内的地址,并且仍然是64 位,但为方便起见,各种工具中经常省略前导零(实际地址为0x00000000004011d0)。虽然它们被映射到进程的虚拟内存表中,但这些地址实际上是在编译时刻录到可执行文件中的(除非它是用 PIE 编译的)。这些地址通常围绕该一般区域,并且通常是虚拟内存的最低部分。

如果您想查看工作中的 64 位地址空间,请查看寄存器中和堆栈上的指针(或堆栈地址本身),它们会大得多。