我在调试器(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
答案 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 。 这是你问题的答案。