我正在使用 x86 指令,现在我对 x86 寄存器(如 EIP、ESP 等)的存储位置感到困惑
例如,当我使用 ollydbg 时,我可以看到实际的 EIP 寄存器值是什么以及它是如何变化的。
如果它们存储在内存中,那么实际位置在哪里?(例如在 .data .text 或 .bss 中)
我可以手动更改另一个进程的 EIP 吗?如何?
我正在使用 x86 指令,现在我对 x86 寄存器(如 EIP、ESP 等)的存储位置感到困惑
例如,当我使用 ollydbg 时,我可以看到实际的 EIP 寄存器值是什么以及它是如何变化的。
如果它们存储在内存中,那么实际位置在哪里?(例如在 .data .text 或 .bss 中)
我可以手动更改另一个进程的 EIP 吗?如何?
你对寄存器是什么有一个严重的误解。
寄存器实际上是一个寄存器,即。处理器中的一小块内存,可以包含操作数或可以成为 CPU 指令的目标。它在内存中没有地址-它确实可以像寄存器一样寻址。
RAM 是完全不同的东西——一个 x86 程序可以在没有 RAM 的情况下完全运行,但是没有任何操作不适用于寄存器。例如,要将 RAM 中某处的两个数字相加,您可以使用 LOAD 指令将这两个数字加载到两个寄存器中,然后使用一些 ADD 指令将一个数字添加到另一个数字,目标是一个寄存器,然后有一些 STORE 指令获取寄存器值并将其写入 RAM 中的某个地址。
因此,没有“特定于进程”的寄存器。每个 CPU 内核都只有一组寄存器(一些特殊功能,如虚拟化不具备),并且存在将寄存器存储在 RAM 中并从 RAM 中恢复它们的机制,例如在调用函数或切换上下文时。
寄存器存储在寄存器中,而不是进程自己的内存中。
调试器使用操作系统提供的特殊接口来更改正在运行的进程的寄存器,包括 EIP。在 Linux 中,它是ptrace(2)
API。
能够从进程外部更改进程的寄存器与操作系统如何将进程的体系结构状态保存到内存以进行上下文切换有关。