调试器中的内存映射

时间:2018-04-29 05:55:51

标签: assembly memory ollydbg

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

  1. 怎么知道。
  2. 以下是代码:

    ; ----------------------------------------------------------------------------
    ; 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
    

1 个答案:

答案 0 :(得分:0)

调试器可以在可移植可执行(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处,您将找到带有 PE标头的FA的DWORD,例如0x00000090 = 144。 从文件开头跳过144个字节,您应该看到DWORD PEsignature ,然后是 20字节的 CoffFileHeader 。 CoffFileHeader的16.byte有WORD SizeOfOptionalHeader, 值0x00E0 = 224。 OptionalHeader 的这几个字节紧跟在CoffFileHeader之后。 在OptionalHeader中的偏移量0xC4 = 196处,存在名为 ImageBase 的DWORD字段,其中VA为图像 映射在内存中。大多数链接器使用ImageBase = 0x00400000。

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