3

在这些日子里,我正在阅读一些 PE 可执行规范。然后我做了一个小的C程序push ebp, pop ebp,我编译了它。成功编译后,我在可执行文件中打开了 PE 文件,并查看了PE_magic + PE_header_size + PE_OPTHDR_entrypointPE 魔术在文件中第一次出现“PE”字符串的位置,根据 PE 和 COFF 规范,PE_header_size 为 24,PE_OPTHDR 为 16。在那个位置我找到了地址 0x1000,但我的文件长度只有 0x600。那么我是在正确的位置上,还是入口点(顺便说一下在 0x200 上)地址设置不正确?

我包括我的文件内容和我的代码的图像。

0x55 表示 PUSH EBP,0x5D 表示 POP EBP

代码(在项目属性中我没有选中添加标准库):

int main() {
    int a = 0;
    __asm {
        push ebp
        pop ebp
    }
}
4

1 回答 1

2

您在文件中看到的内容与内存中的内容不符。如您所见,文件对齐为 200 美元,而内存中的部分对齐为 1000 美元。这通常意味着文件的填充比它所代表的图像少。

更重要的是,您可以看到 .text 的节表条目的相对虚拟地址为 $1000(相对于 Image Base),但原始地址为 $200(相对于文件的开头)。几乎所有说明某个事物在哪里的字段都是 RVA,这意味着它们将它们从 Image Base 中引用的事物的偏移量存储在内存中。

所以不,地址设置不正确 - .text 开始于 1000 美元(相对于 Image Base),这就是入口点指向的位置。

于 2013-03-09T12:50:24.933 回答