0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
是什么DS:
意思?
0040103A CALL DWORD PTR DS:[40207A] USER32.MessageBoxA
是什么DS:
意思?
该指令正在从内存中加载一个新的 EIP 值ds:[40207A]
。即在 address 有一个函数指针40207A
。(它会推送一个返回地址,因为这call
不仅仅是一个jmp
.)
这ds:
意味着指令正在引用数据段中的内存 - 在现代操作系统上几乎可以忽略,因为它们以平面地址空间模型运行(代码、数据和堆栈段都引用相同的内存范围,并且内存保护是分页处理)。
在ds:
那里向您展示它绝对是一个内存操作数,并提醒您它使用哪个段/显示没有段覆盖前缀(除了可能是ds
前缀,因为这已经是默认值)。
稍微详细说明一下 - 请注意,为简单起见,这是在运行 Windows 的 32 位保护模式的上下文中。
段寄存器(CS,DS,SS,ES,FS,GS) 持有selector
指向 a的descriptor
. 有两个描述符表:全局(GDT)和本地(LDT),选择器有一个位指示使用哪个。Windows(几乎?)专门使用全局表。
描述符基本上是一个{ beginning-address, size}对——还有更多内容,但这超出了本文的范围。
Windows 使用平面内存模型:每个进程都有一个从内存地址 0 开始的 4GB 地址空间,并使用分页将进程彼此隔离。
由于进程具有这种平面视图,因此它们与使用 {0, 4GB} 描述符的所有段一起运行 - 因此,Windows 可以仅使用少数全局描述符并让所有进程使用这些全局描述符,而不是分配每个进程的描述符。
Portable Executable格式定义sections
了与 x86 无关的 ,即使segments
存在一些概念上的重叠。PE EXE 几乎可以有任何你想要的部分布局,但通常是分成(至少)代码(读/执行)、数据(读/写)、资源(只读?)。将可执行文件拆分为多个部分可以将 x86 页面级内存保护应用于内存范围。
虽然普通段不会在每个进程中更改,但 Windows 使用FS
寄存器来指向每个线程的 TIB结构。
有关概述,请参阅此内容。这是来自 80386 上的旧文档,但该信息仍然适用。
内存地址由一个段和一个偏移量组成;DS 是“数据段”寄存器。