ES 0023 32bit 0(FFFFFFFF)
CS 001B 32bit 0(FFFFFFFF)
SS 0023 32bit 0(FFFFFFFF)
DS 0023 32bit 0(FFFFFFFF)
FS 003B 32bit 7FFDF000 (FFF)
GS 0000 NULL
例如,
003B
中的FS
如何转换为7FFDF000
?为什么0023
中的ES
和001B
中的CS
都可以明显地转换为0
?我正在研究Intel手册,但希望这里的人能比我读得更快那些...
#1 楼
您正在查看32位寄存器(可能在32位进程中)。由于32位处理器段寄存器很少用作偏移地址,原因很简单,32位足以表示很大的地址范围。相反,某些段寄存器(
CS
,SS
,DS
)现在用于权限,内存保护和分页,而另一些段则用作通用寄存器或操作系统特定的结构(例如32位的FS
) Windows和GS
(在Linux和64位Windows中)。要了解更多信息,建议您阅读有关内存保护,保护模式以及现代OS内存管理和分页的信息。
#2 楼
在保护模式下,段选择器是描述符表的索引(局部或全局索引,取决于选择器的TI位)。描述符条目描述了段的基地址,限制(大小)和其他一些属性(数据或代码,16位或32位)。有关更多信息,请参见以下链接:全局描述符表;
内存转换和分段。
Windows通常设置选择器,以便它们将1:1直接映射到虚拟地址,这就是为什么它们都以0为底的原因。
fs
是个例外,因为它用于快速寻址线程信息块(TIB),每个线程独立但是,实际上,在32位内核上,您可以使用未记录的函数
NtSetLdtEntries
设置自定义选择器映射。有关更多信息,请参见此处:j00ru提供了保护模式分段作为一种强大的反调试措施。
评论
这样,您使用的段描述符包含基地址+偏移量等于线性地址,我相信如果不使用分页,它等于物理地址?对于实模式,将段选择器移位两位以获取段基地址。
–元帅
17年1月13日19:55
@ Igor Skochinsky,您可以看看我几天前在此网站上询问的问题吗?
–元帅
17年1月13日19:58