是否知道Window 7和Windows 8 PE加载器之间的区别是什么?

我正在尝试手工制作一个简单的可执行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