【问题标题】:Can i set entry point at code in PE headers?我可以在 PE 标头中的代码处设置入口点吗?
【发布时间】:2013-08-25 01:44:41
【问题描述】:
如果我设置类似 0x00000040 的内容(我的代码位于此地址),则程序会因以下错误而崩溃:
The application was unable to start correctly (0xc000007b)
但如果我从代码部分跳转到 0x00400040 则它可以工作。
为什么我在那个奇怪的地址 (0xc000007b) 上出现错误?是否可以从位于段外的代码开始执行程序?
我使用的是 Windows 8。
【问题讨论】:
标签:
portable-executable
entry-point
【解决方案1】:
0xc000007b 是来自 Windows 的错误代码。您可以查找它们here。你的是STATUS_INVALID_IMAGE_FORMAT。
我假设您在 PE 标头中修改 AddressOfEntryPoint。对于here:
AddressOfEntryPoint:
指向入口点函数的指针,相对于图像基地址。对于可执行文件,这是起始地址。对于设备驱动程序,这是初始化函数的地址。入口点函数对于 DLL 是可选的。当不存在入口点时,此成员为零。
因此,如果您将此值设置为 0x40,它将指向 DOS 标头中的地址(模块的最开头)。内存中的 header block 没有正确的内存保护来执行,所以 OS loader 会失败。
我的猜测是,您实际上想跳转到 0x1040,在具有典型可执行文件的 Windows 8 系统上,该位置将位于代码部分的第一个地址之后的 0x40 字节处。