我正在尝试手工制作一个简单的可执行PE映像文件。它在Windows 7中运行良好,但被Windows 8拒绝。
文件链接在这里:
http://lars.nocrew.org/tmp/W7-ok.exe
Microsoft (R) COFF/PE Dumper Version 8.00.50727.762
Dump of file W7-ok.exe
PE signature found
File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
14C machine (x86)
0 number of sections
0 time date stamp Thu Jan 01 00:00:00 1970
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
10F characteristics
Relocations stripped
Executable
Line numbers stripped
Symbols stripped
32 bit word machine
OPTIONAL HEADER VALUES
10B magic # (PE32)
0.00 linker version
0 size of code
0 size of initialized data
0 size of uninitialized data
24C entry point (0040024C)
0 base of code
0 base of data
400000 image base (00400000 to 0040025B)
4 section alignment
4 file alignment
0.00 operating system version
0.00 image version
4.00 subsystem version
0 Win32 version
25C size of image
230 size of headers
0 checksum
3 subsystem (Windows CUI)
0 DLL characteristics
0 size of stack reserve
0 size of stack commit
0 size of heap reserve
0 size of heap commit
0 loader flags
2 number of directories
0 [ 0] RVA [size] of Export Directory
1B8 [ 0] RVA [size] of Import Directory
Summary
#1 楼
区别在于Windows 8要求所有常规结构(导出,导入,TLS,异常处理程序,重定位...,即由数据目录条目描述的所有内容)全部位于一个部分内。唯一的例外是绑定导入表,该表存储在任何节的外部,以避免“污染”内容,因为绑定导入表数据在使用后会被丢弃。无论如何,绑定导入表在存在ASLR的情况下也毫无意义,因为地址几乎永远不会匹配。 。如果创建单个节来保存导入表,则它将在两种环境中加载。
评论
我添加了一个.text节来保存所有代码,数据和导入表。我尚未在Windows 8中对其进行测试。
– Lars Brinkhoff
2015年12月25日在9:06
我现在已经验证可以解决Windows 8中的问题。
– Lars Brinkhoff
15年12月29日在11:24
还必须从2增加数据目录的数量。尽管指向IAT的所有指针均为0,但16种有效。
– Lars Brinkhoff
2015年12月30日14:56
是的,我忽略了计数。它必须至少为13才能覆盖IAT目录,该目录也由加载程序检查。
–彼得·弗里
15年12月30日在16:42