2013-03-09 22 views
3

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

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

0x55 means PUSH EBP and 0x5D means POP EBP

代码(在项目属性我已经选中除了标准库):

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

让我看看你的代码来读取PE,至少可以得到头文件信息 – 2013-03-09 13:40:11

回答

2

你在文件中看到的不匹配它会是什么样子在内存中。如您所见,文件对齐方式为$ 200,而内存部分对齐方式为$ 1000。这通常意味着文件的填充比它表示的图片少。

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

因此不,地址设置不正确 - .text开始于$ 1000(相对于图像库),这就是入口点指向的地方。

+0

因此,optionaly,我该如何计算文件中某个东西的真实位置? – user35443 2013-03-09 13:14:44

+1

@ user35443我试图把它全部放在注释中,但有点长,请看这里:http://www.tech-juice.org/2011/02/21/portable-executable-converting-rva-to-file偏移处和回/ – harold 2013-03-09 13:25:44

相关问题