windows memory segmentation& OllyDbg的

时间:2013-05-18 13:43:53

标签: windows ollydbg memory-segmentation

关于Windows内存分段的一些问题。

  1. Windows中的每个进程都有自己的虚拟内存。这是否意味着每个进程都有自己的任务 (我的意思是自己的任务描述符或任务门)?

  2. 我用ollydbg打开了一个简单的exe,我看到每个CALL对一个dll函数的引用都把我带到跳台。跳转表有像这样的跳转指令:

    JMP DWORD PTR DS:[402058]

    我的问题是为什么它使用数据段而不是基本地址的CS选择器? 如果我打开内存映射并找到存储在402058的内容,我发现它包含了resorces。 如果我正确理解存储在DS中的DLL函数的地址?

  3. 我注意到内存映射是由所有者组织的。不应该像DS等CS数据中的所有代码那样组织起来吗?

    谢谢

1 个答案:

答案 0 :(得分:0)

1。 Process拥有自己的虚拟地址空间。 我不明白你所指的是什么"任务描述符或任务门",但Windows操作系统为每个进程保存一个描述符,称为Process Control Block,其中包含有关的信息。进程(如标识,访问令牌,执行状态,虚拟内存映射等)。

Task是一个逻辑单元,可用于管理单个进程或多个进程。

工作 - >任务

任务 - >过程

流程 - >线程

2。 在你提到的编译器常见的情况下,程序使用.DATA部分在加载函数地址后存储跳转表。

首先发生这种情况的原因是因为编译器在编译时无法知道DLL基址,因此必须在加载时修复该地址以指向该函数。这称为重定位。

为了从代码中单独维护跳转表,编译器将其存储在.DATA部分中。这样,我们也可以赋予它写权限(通常.DATA段具有写权限)并根据需要进行修改,而不会牺牲稳定性和安全性。

3。 在过程中加载的每个模块'虚拟地址空间包含它自己的部分 - 这就是为什么你为每个模块看到一组不同的.text,.data,.reloc等。 "所有者" column是模块名称。

P.S。请在每个帖子中提出一个问题 - 这样,在您得到答案后,其他用户可以轻松访问该问题,并且每个问题都可能获得更准确的答案。