【问题标题】:windows memory segmentation & Ollydbgwindows 内存分割 & Ollydbg
【发布时间】:2013-05-13 13:26:32
【问题描述】:

关于windows内存分割的几个问题。

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

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

    JMP DWORD PTR DS:[402058]

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

  3. 我注意到内存映射是由所有者组织的。不应该用段来组织,比如所有代码都在 DS 中的 CS 数据中吗?

    谢谢

【问题讨论】:

    标签: windows ollydbg memory-segmentation


    【解决方案1】:

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

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

    工作 -> 任务

    任务 -> 进程

    进程 -> 线程

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

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

    为了将跳转表与代码分开维护,编译器将其存储在 .DATA 部分中。这样,我们也可以给它写权限(通常.DATA段有写权限)并在不牺牲稳定性和安全性的情况下进行必要的修改。

    3。 在进程的虚拟地址空间中加载的每个模块都包含它自己的部分 - 这就是为什么您会看到每个模块的一组不同的 .text、.data、.reloc 等。 “所有者”列是模块名称。

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

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 2014-04-07
      • 2012-01-15
      • 2014-06-26
      相关资源
      最近更新 更多