我在调试器(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发布于 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。这就是你问题的答案。
https://stackoverflow.com/questions/50083808
复制相似问题