【问题标题】:windows memory segmentation & Ollydbgwindows 内存分割 & Ollydbg
【发布时间】:2013-05-13 13:26:32
【问题描述】:
关于windows内存分割的几个问题。
windows 中的每个进程都有自己的虚拟内存。是否意味着每个进程都有自己的任务
(我的意思是自己的任务描述符或任务门)?
-
我用 ollydbg 打开了一个简单的 exe,我看到每个对 dll 函数的 CALL 指令都将我带到了跳转表。跳转表有像这样的 DLL 的跳转指令:
JMP DWORD PTR DS:[402058]
我的问题是为什么它使用数据段而不是 CS 选择器作为基地址?
如果我打开内存映射并找到存储在 402058 的内容,我会发现它包含资源。
如果我正确理解了存储在 DS 中的 DLL 函数的地址?
-
我注意到内存映射是由所有者组织的。不应该用段来组织,比如所有代码都在 DS 中的 CS 数据中吗?
谢谢
【问题讨论】:
标签:
windows
ollydbg
memory-segmentation
【解决方案1】:
1。
Process 有它自己的虚拟地址空间。
我不明白您所说的“任务描述符或任务门”是什么,但 Windows 操作系统为每个进程保存一个描述符,称为 Process Control Block,其中包含有关进程的信息(例如标识、访问令牌、执行状态、虚拟内存映射等)。
Task 是一个逻辑单元,可用于管理单个进程或多个进程。
工作 -> 任务
任务 -> 进程
进程 -> 线程
2。
在您提到的情况下,这对于编译器来说很常见,程序在加载函数地址后使用 .DATA 部分来存储跳转表。
首先发生这种情况的原因是因为编译器在编译时无法知道 DLL 的基地址,因此必须在加载时固定地址以指向函数。这称为重定位。
为了将跳转表与代码分开维护,编译器将其存储在 .DATA 部分中。这样,我们也可以给它写权限(通常.DATA段有写权限)并在不牺牲稳定性和安全性的情况下进行必要的修改。
3。
在进程的虚拟地址空间中加载的每个模块都包含它自己的部分 - 这就是为什么您会看到每个模块的一组不同的 .text、.data、.reloc 等。 “所有者”列是模块名称。
附:请在每个帖子中提出一个问题 - 这样在您得到回答后其他用户可以轻松访问,并且每个问题都可能得到更准确的答案。