【问题标题】:Is entry point on correct place?入口点在正确的位置吗?
【发布时间】:2013-03-09 12:40:51
【问题描述】:

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

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

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

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

【问题讨论】:

  • 给我看你的代码来读取PE,至少到头信息

标签: c windows file assembly exe


【解决方案1】:

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

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

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

【讨论】:

  • 那么,可选地,我如何计算文件中某些东西的实际位置?
  • @user35443 我试图将其全部放在评论中,但它有点长,请参见此处:tech-juice.org/2011/02/21/…
猜你喜欢
  • 2018-04-14
  • 1970-01-01
  • 2012-10-20
  • 1970-01-01
  • 2014-03-19
  • 2018-12-21
  • 2017-03-18
  • 2015-04-16
  • 1970-01-01
相关资源
最近更新 更多