编译期间是否指定指令的地址?

逆向工程 拆卸 调试
2021-07-04 19:43:49

按照某些 youtube 教程进行操作时,指令的内存地址在我的机器和 youtuber 的机器中是相同的。这怎么可能?编译期间指令是否提供内存地址?如果是这样,那么一台机器中只有有限数量的内存地址,如果 2 个已编译的程序被赋予相同的地址,那么会发生什么?

1个回答

这就是虚拟地址空间概念的工作原理。每个进程都有自己可以寻址的地址空间。因此,您无法直接读取/写入另一个进程的内存。

您可以指定在编译/链接过程中进程基础模块将被映射到进程内存的地址,例如对于 MSVC 链接器,它是 /BASE 命令。通常如果禁用 ASLR(地址空间布局随机化),则 32 位图像的基地址为 0x400000,64 位图像的基地址为 0x140000000。

例如,当您想要读取进程中特定地址处的值时,内核将地址从虚拟地址空间映射到物理地址(例如,到该值实际位于 RAM 棒上的地址)。由于这两个独立的进程可以在同一地址(在它们自己的地址空间中)具有不同的值。

例如,如果您*(int*)(0x600000)在程序 A 中求值,它可以返回5,但相同的操作可以6在程序 B 中返回

进程的虚拟地址空间是它可以使用的一组虚拟内存地址。每个进程的地址空间都是私有的,除非共享,否则其他进程无法访问。

虚拟地址并不代表对象在内存中的实际物理位置;相反,系统为每个进程维护一个页表,这是一个内部数据结构,用于将虚拟地址转换为相应的物理地址。每次线程引用地址时,系统都会将虚拟地址转换为物理地址。

来源:https : //docs.microsoft.com/en-us/windows/win32/memory/virtual-address-space