调试器中的内存映射

Memory map in Debuggers

我在调试器(x32dbg)中打开了一个由Nasm编译的exe文件。在内存映射中,它显示了程序 section .textsection .data 的启动位置。

  1. 它怎么知道的。

代码如下:

; ----------------------------------------------------------------------------
; helloworld.asm
;
; This is a Win32 console program that writes "Hello, World" on one line and
; then exits.  It needs to be linked with a C library.
; ----------------------------------------------------------------------------

        global  _main
        extern  _printf

        section .text
_main:
        push    message
        call    _printf
        add     esp, 4
        ret
message:
        db      'Hello, World', 10, 0

调试器可以在 portable-executable (PE) 文件中找到程序段的虚拟地址。 其结构描述于 https://msdn.microsoft.com/library/windows/desktop/ms680547%28v=vs.85%29.aspx?id=19509 您可以使用一些专门的工具检查可执行文件,例如 PEview.exe 来自 http://wjradburn.com/software/ ,或查看 "helloworld.exe".

的十六进制转储

在文件地址 (FA) 0x3C 处,您将找到 FA 为 PE Header 的 DWORD,例如 0x00000090=144。 从文件开头跳过 144 个字节,您应该看到 DWORD PEsignature 后跟 CoffFileHeader 的 20 个字节。在 CoffFileHeader 的 16.byte 有 WORD SizeOfOptionalHeader, 值为 0x00E0=224。 OptionalHeader 的这么多字节紧跟在 CoffFileHeader 之后。 在 OptionalHeader 中的偏移量 0xC4=196 处有一个名为 ImageBase 的 DWORD 字段,其中 VA 是图像 映射到内存中。大多数链接器使用 ImageBase=0x00400000。

OptionaHeader 后跟 SectionHeaders,一个用于程序中使用的每个部分。 每个 SectionHeader 的长度为 40 个字节,它的前八个字节包含 SectionName,然后是向上舍入到 SectionAlignment 的节大小,然后是相对虚拟地址 (RVA),其中该部分开始。通常第一段是Name=.text,Size=0x00001000,RVA=0x00001000的代码段。 每个section的RVA都与ImageBase相关,所以.text section会映射到地址ImageBase+RVA=0x00401000。 这是你问题的答案。