首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Debugger中的内存映射

Debugger中的内存映射
EN

Stack Overflow用户
提问于 2018-04-29 05:55:50
回答 1查看 922关注 0票数 0

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

  1. 它怎么知道。

以下是代码:

代码语言:javascript
复制
; ----------------------------------------------------------------------------
; 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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-30 18:20:07

调试器可以在可移植可执行(PE)文件中找到程序部分的虚拟地址.它的结构用https://msdn.microsoft.com/library/windows/desktop/ms680547%28v=vs.85%29.aspx?id=19509描述,您可以使用一些专门工具检查可执行文件,例如PEview.exe from http://wjradburn.com/software/,或者查看"helloworld.exe“的十六进制转储。

在文件地址( FA ) 0x3C,您可以找到带有PE头的FA的DWORD,例如0x00000090=144。从文件开始跳过144个字节,您应该会看到DWORD PEsignature后面跟着20个字节的PEsignature在CoffFileHeader的16字节处有单词SizeOfOptionalHeader,值为0x00E0=224。这许多字节的OptionalHeader紧跟在CoffFileHeader后面。在偏移量0xC4=196 in OptionalHeader中,有一个名为ImageBase和VA的DWORD字段,其中映射到内存中的图像。大多数链接器使用ImageBase=0x00400000。

程序中使用的每个部分都有一个与SectionHeaders,一起使用的OptionaHeader。每个SectionHeader都有40个字节长,它在前8个字节中包含了SectionName,后面的节大小被舍入到SectionAlignment,后面跟着相对虚拟地址(RVA)开始部分。通常,第一部分是包含Name=.text、Size=0x00001000和RVA=0x00001000的代码部分。每个区段的RVA与ImageBase+RVA=0x00401000.相关,因此.text部分将映射到address ImageBase。这就是你问题的答案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50083808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档