ES/GS/FS 指向哪里?

逆向工程 视窗 部件 ollydbg x86
2021-06-23 07:53:16

据我所知,这些段是extrageneral但是它们实际上指向程序存储器的哪一部分?如果我理解正确DS的话,指向 Dump 的入口点,SS代表 Stack,英特尔概念中的那些剩余物正在发生什么。 寄存器

这些是我使用的寄存器Ollydbg,我如何预测哪些内容将被移入 EAX?

MOV EAX, DWORD PTR FS:[0]
1个回答

在 x86 32 位窗口上,FS段寄存器指向一个称为线程信息块或简称 TIB的结构该结构由内核在线程创建时创建,用于支持 OS 相关功能、服务和 API。

数据 TIB 使用示例包括:

  1. 线程本地存储。
  2. 堆。
  3. 堆栈。
  4. SEH 异常链。
  5. 访问进程环境块(服务于类似的进程级目标)。

还有许多其他...

要预测对FS寄存器的取消引用的实际值,您需要针对您正在使用的特定操作系统版本查阅该(仅部分记录的)结构的映射。例如,我之前提到TIB维基百科页面描述了 32 位 Windows TIB 布局。

在 linux 上,GS无论寄存器大小如何,寄存器都用于类似的目的,而 64 位 intel windows 使用FSGS寄存器。

存储在 TIB 中的信息不应由程序直接使用,但该结构的特定成员如何经常用于非预期目的,例如以更普遍的方式检测调试器。

如您所见,其他段寄存器很少使用。

一点历史

尽管段寄存器用于与操作系统相关的功能,但这并不是段寄存器的预期目标。过去,当 CPU 寄存器大小在 816 位之间变化时,寻址受到很大限制,只有 64KB 的地址空间可用。由于原始 CPU 仅在实模式(而不是保护模式)下运行,因此必须与所有正在运行的服务、进程、连接的外围设备等共享该地址空间...

为了绕过该限制,内存分段以两种形式投入使用。一种是保护模式 VS 实模式,另一种是段寄存器 - 用作用于寻址的实际寄存器的偏移量。这大大增加了寻址范围,被认为是一个有效的解决方案。在 32 位保护模式处理器的时代,每个进程都有 4GB 的虚拟可寻址空间,当然还有 64 位 CPU,段寄存器很少用于它们的原始目标(除了高度低级的组件,如实模式引导加载程序,这可能仍然需要额外的寻址)。

聚苯乙烯

DS代表数据选择器。