【问题标题】:find addreses referenced by ss:[esp+28] [duplicate]查找 ss 引用的地址:[esp+28] [重复]
【发布时间】:2020-02-08 08:11:49
【问题描述】:

我需要在游戏中找到地址,但不确定如何处理段偏移。

在 ollydbg 中,它显示了一个数据结构位于:

ss:[esp+28]

esp = 0019DF94
ss = 002B

那么结构的实际地址是什么? 是ss+esp+28吗?

【问题讨论】:

  • 不,绝对不是+ ss。如果这是 32 位代码,则您处于保护模式,因此 SS 是一个段选择器,而不是直接的段基值。在 Windows 和其他使用平面内存模型的普通操作系统上,SS 基数将始终为 0。 TL:DR:忽略 SS,并没有真正使用分段。
  • 所以它只是 esp + 偏移量 (28)?
  • 是的,很简单。
  • Addressing mode in IA-32 解释说,在 Windows 等 32 位/64 位平面内存模型操作系统下可以忽略分段,因此这是一个很好的副本。

标签: assembly x86 reverse-engineering addressing-mode memory-segmentation


【解决方案1】:

esp + 28 为您提供虚拟地址,这是您将在程序中使用的地址。在保护模式下(这是您在 Windows 中使用的)段寄存器是段选择器,它们是 GDT 的索引。如果您想要数据的全局地址,则需要在 GDT 中查找 SS 的值,读取基地址,然后将其添加到 esp + 28(参见 this question)。在实模式下,段寄存器只需左移 4 位,然后添加到您的地址(请参阅this article)。

【讨论】:

  • 不,如果你想考虑分段,ESP+28 会给你地址的 offset 部分。段基数(来自索引的 GDT 条目)为您提供基数+偏移量的基数,那是线性虚拟地址。您省略了通过页表将虚拟转换为物理的步骤。 (“全局地址”没有任何标准含义,但是如果您指的是物理地址,那么您就忘记了分页。分页在保护模式下是可选的,但对于长/兼容模式是强制性的。但无论如何,Windows 都启用分页。)
猜你喜欢
  • 2021-10-30
  • 2012-01-24
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 1970-01-01
  • 2020-10-29
  • 1970-01-01
  • 2015-04-23
相关资源
最近更新 更多