PE文件 – 缺less什么?

我试图生成PE格式的可执行文件 – Windows 7,64位,最初是一个最小的文件用于testing目的,没有什么比

mov eax, 42 ret 

我已经得到了一个,dumpbin似乎很满意,并包含所有字段的显然有效值,我可以find实际使用的各种来源,但是当我尝试运行它,Windows说'不是有效的Win32应用程序'。 dumpbin输出如下; 任何人都可以从这看到我失踪?

 Dump of file a.exe PE signature found File Type: EXECUTABLE IMAGE FILE HEADER VALUES 8664 machine (x64) 1 number of sections 0 time date stamp Thu Jan 01 00:00:00 1970 0 file pointer to symbol table 0 number of symbols F0 size of optional header 22 characteristics Executable Application can handle large (>2GB) addresses OPTIONAL HEADER VALUES 20B magic # (PE32+) 2.05 linker version 0 size of code 0 size of initialized data 0 size of uninitialized data 1000 entry point (0000000140001000) 0 base of code 140000000 image base (0000000140000000 to 0000000140000FFF) 1000 section alignment 200 file alignment 0.00 operating system version 0.00 image version 4.00 subsystem version 0 Win32 version 1000 size of image 200 size of headers 0 checksum 3 subsystem (Windows CUI) 8100 DLL characteristics NX compatible Terminal Server Aware 100000 size of stack reserve 1000 size of stack commit 100000 size of heap reserve 1000 size of heap commit 0 loader flags 10 number of directories 0 [ 0] RVA [size] of Export Directory 0 [ 0] RVA [size] of Import Directory 0 [ 0] RVA [size] of Resource Directory 0 [ 0] RVA [size] of Exception Directory 0 [ 0] RVA [size] of Certificates Directory 0 [ 0] RVA [size] of Base Relocation Directory 0 [ 0] RVA [size] of Debug Directory 0 [ 0] RVA [size] of Architecture Directory 0 [ 0] RVA [size] of Global Pointer Directory 0 [ 0] RVA [size] of Thread Storage Directory 0 [ 0] RVA [size] of Load Configuration Directory 0 [ 0] RVA [size] of Bound Import Directory 0 [ 0] RVA [size] of Import Address Table Directory 0 [ 0] RVA [size] of Delay Import Directory 0 [ 0] RVA [size] of COM Descriptor Directory 0 [ 0] RVA [size] of Reserved Directory SECTION HEADER #1 .text name 6 virtual size 1000 virtual address (0000000140001000 to 0000000140001005) 200 size of raw data 200 file pointer to raw data (00000200 to 000003FF) 0 file pointer to relocation table 0 file pointer to line numbers 0 number of relocations 0 number of line numbers 60000020 flags Code Execute Read RAW DATA #1 0000000140001000: B8 2A 00 00 00 C3 ©*...+ Summary 1000 .text 

你的“图像大小”只包括标题区域; .text部分和入口点位于它之外。 将其设置为至少1006,该文件应该工作。


我是如何找到它的:

  1. 做了一个最小的C程序:

    int entry(){return 42; }

  2. 编译它没有库和自定义条目:

    cl test.cpp / link / nodefaultlib / entry:entry / subsystem:console

  3. 开始编辑标题以匹配您的列表,并在每次更改后运行exe。 一旦我将SizeOfImage更改为1000,我得到了“不是有效的Win32应用程序”消息。

我看不到你的dumpbin输出,但有一个很好的实用工具, CFF资源管理器 ,你可以用它来检查PE文件的每一个细节。 它是交互式的,并显示各种表格,您也可以在飞行中编辑大部分值以进行实验。

过去我发现比使用dumpbin比较CFF资源管理器中的PE规格值更容易。