0

helloworld.exe我用简单的一行用 C写了一个基本的printf("helloworld!\n");

然后我使用 UltraEdit 查看 EXE 文件的字节,并使用 PE Explorer 查看标头值。当涉及到入口点地址时,PE Explorer 显示0x004012c0

魔术 010Bh PE32
链接器版本 1902h 2.25
代码大小 00008000h
初始化数据的大小 0000B000h
未初始化数据的大小 00000C00h
入口点地址 004012C0h
代码基数 00001000h
数据基础 00009000h
图像库 00400000h

但是在 UltraEdit 中,我0x000012c0在 magic 数完 16 个字节后看到了0x010B

3F 02 00 00 E0 00 07 03 0B 01 02 19 00 80 00 00
00 B0 00 00 00 0C 00 00 C0 12 00 00 00 10 00 00
00 90 00 00 00 00 40 00 00 10 00 00 00 02 00 00
04 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00
00 10 01 00 00 04 00 00 91 F6 00 00 03 00 00 00
00 00 20 00 00 10 00 00 00 00 10 00 00 10 00 00
00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 00
00 E0 00 00 C0 06 00 00 00 00 00 00 00 00 00 00

哪一个是正确的?

4

1 回答 1

1

只需阅读有关IMAGE_OPTIONAL_HEADER结构的信息

入口地址

指向入口点函数的指针,对于图像基地址。对于可执行文件,这是起始地址。对于设备驱动程序,这是初始化函数的地址。入口点函数对于 DLL 是可选的。当不存在入口点时,此成员为零。

所以绝对地址EntryPointAddressOfEntryPoint ? ImageBase + AddressOfEntryPoint : 0

在你的情况AddressOfEntryPoint == 12c0ImageBase == 400000

结果是的绝对EntryPoint地址12c0+400000==4012c0

于 2017-04-07T09:32:47.350 回答