【问题标题】:How to convert a memory address to a code segment address?如何将内存地址转换为代码段地址?
【发布时间】:2019-07-03 21:28:51
【问题描述】:

如何将地址转换为 16 位代码段(CS 寄存器)? 例如,如果 .text 段从 00E51000 开始,那么该段的 CS 寄存器是如何计算的?这个问题是针对 32bit x86 架构的。

【问题讨论】:

  • 我看到了你的另一个问题,我不太清楚你的意思。我想知道这里有一个XY问题。我的问题是,您似乎正在尝试实现特定目标或尝试解决问题。您真正想要解决的问题是什么,也许我们可以更好地帮助做出回应。这与Windows调试有关吗?引导加载程序/OSDev 开发?这与 IDA/IDA Pro 有关吗?

标签: assembly x86 32-bit machine-instruction


【解决方案1】:

在 32 位模式下,您可以(并且通常应该)始终使用引用具有 base=0 / limit=-1 的 GDT 条目的 CS 值。如果您在主流操作系统下的用户空间中运行,那么您的进程就已经开始了。实际上,DS/ES/SS 会以同样的方式设置,即平面内存模型。 (FS 或 GS​​ 的线程本地存储可能具有非零基数。)

然后您可以使用偏移量 = 0x00E51000 引用该段/段中的内存。例如mov eax, 0x00E51234 / jmp eax.

由于 DS/ES/SS 也为 0 / -1,您将拥有一个平坦的内存模型,其中 mov eax, [0x00E51234] 加载您将跳转到的相同字节。

【讨论】:

    猜你喜欢
    • 2010-09-26
    • 2013-05-09
    • 2011-02-16
    • 2020-12-08
    • 2013-05-13
    • 2022-12-10
    • 1970-01-01
    • 2016-03-14
    • 1970-01-01
    相关资源
    最近更新 更多