在这些日子里,我正在阅读一些PE可执行规范。然后我做了一个小的C程序做push ebp, pop ebp
我编译了它。编译成功后,我在可执行文件中打开PE文件并查看位置PE_magic + PE_header_size + PE_OPTHDR_entrypoint
,其中PE magic在文件中首次出现“PE”字符串,PE_header_size为24,PE_OPTHDR为16,根据PE& COFF规格。在那个位置,我发现地址0x1000,但我的文件长度只有0x600。那我是正确的位置,还是入口点(顺便提一下在0x200)地址设置不正确?
我包括我的文件竞争和我的代码的图像。
代码(在项目属性中我未选中添加标准库):
int main() {
int a = 0;
__asm {
push ebp
pop ebp
}
}
答案 0 :(得分:2)
您在文件中看到的内容与内存中的内容不符。如您所见,文件对齐为200美元,而内存中部分对齐为1000美元。这通常意味着文件填充的次数少于它所代表的图像。
更重要的是,您可以看到.text的section表条目的相对虚拟地址为$ 1000(相对于Image Base),但原始地址为$ 200(相对于文件的开头)。几乎所有说出某个特定内容的字段都是RVA,这意味着它们在内存中存储它们从Image Base引用的东西的偏移量。
所以不,地址设置不正确 - .text从$ 1000开始(相对于Image Base),这就是入口点指向的地方。