入口点位置正确吗?

3
在这些日子里,我正在阅读一些PE可执行文件规范。然后我编写了一个简单的C程序,用到了"push ebp, pop ebp"语句,并对其进行了编译。编译成功后,我在可执行文件中打开了PE文件并查看了位置"PE_magic + PE_header_size + PE_OPTHDR_entrypoint",其中PE magic是文件中第一次出现的“PE”字符串,PE_header_size根据PE和COFF规范为24,PE_OPTHDR为16。在那个位置上,我发现地址是0x1000,但我的文件长度仅为0x600。那么我是否在正确的位置,或者入口点(顺便提一下,入口点在0x200)地址设置不正确呢?
我附上了我的文件内容和我的代码的图片。
代码(在项目属性中我取消了添加标准库的选项):
int main() {
    int a = 0;
    __asm {
        push ebp
        pop ebp
    }
}

展示你的代码以读取PE文件,至少包括头部信息。 - Grijesh Chauhan
1个回答

2
您在文件中看到的内容与它在内存中的样子不同。您可以看到,文件对齐方式为$200,而内存中的部分对齐方式为$1000。这通常意味着文件的填充比它所代表的映像要少。
更重要的是,您可以看到.text节的部分表条目具有相对虚拟地址$1000(相对于映像基址),但原始地址为$200(相对于文件开头)。几乎所有指示某个特定位置的字段都是RVA(即它们存储从映像基址在内存中引用的东西的偏移量)。
因此,不,地址没有设置错误-.text 从$1000开始(相对于映像基址),这就是入口点所指向的位置。

那么,可选的是,我如何计算文件中某个东西的实际位置? - user35443
1
@user35443,我试图把它全部放在评论里,但是有点长,请看这里:http://www.tech-juice.org/2011/02/21/portable-executable-converting-rva-to-file-offset-and-back/。 - harold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接