调试器中的内存映射
Memory map in Debuggers
我在调试器(x32dbg)中打开了一个由Nasm编译的exe文件。在内存映射中,它显示了程序 section .text
和 section .data
的启动位置。
- 它怎么知道的。
代码如下:
; ----------------------------------------------------------------------------
; 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。
这是你问题的答案。
我在调试器(x32dbg)中打开了一个由Nasm编译的exe文件。在内存映射中,它显示了程序 section .text
和 section .data
的启动位置。
- 它怎么知道的。
代码如下:
; ----------------------------------------------------------------------------
; 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。 这是你问题的答案。