WinXP 专业版,32 位。怎么改GS寄存器

WinXP Pro, 32bit. How change GS register

我在OllyDBG中有一个代码:

MOV DWORD PTR GS:[396FF4],EBX

但是 OllyDBG 显示:

EBX=00000B07
GS:[00396FF4]=???

那么EBX写入的最终地址是怎么算出来的呢? 我在地址 $004B0000 有空闲内存。我应该写代码而不是 $396FF4 来制作 EBX,例如地址 $004B0000.

很抱歉给大家带来了困惑。真正的答案似乎是这样的:

在 Windows(和其他现代 OS)上,分段模型的使用方式不再与旧的实模式和保护模式应用程序相同。相反,内存模型主要是"flat"(不分段),分页以便于管理和保护。事实上,64 位模式下的 x86-64 甚至不再允许以任何旧方式使用段。

FSGS 段除外,它们供 OS 内部使用。在 Windows 上,GS 段引用线程本地存储。据我所知,您无法突破该段 - 它是(硬件)保护内存。

所以您唯一的方法是更改​​段(更改为不再使用的段之一,例如 DS - 您选择哪个不再重要,它们都从零开始并覆盖整个您可以使用的虚拟内存)。

MOV DWORD PTR DS:[4B0000], EBX 应该可以正常工作,并且完全删除段寄存器 (MOV DWORD PTR [4B0000], EBX)。