代码之家  ›  专栏  ›  技术社区  ›  oneat

Exe头中的奇怪值

  •  3
  • oneat  · 技术社区  · 15 年前

    我在exe头中看到一个奇怪的值

    00000000 :4D 5A 90 00 03 00 00 00 - 04 00 00 00 FF FF 00 00
    00000010 :B8 00 00 00 00 00 00 00 - 40 00 00 00 00 00 00 00
    00000020 :00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00
    00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00
    00000030 :00 00 00 00 00 00 00 00 - 00 00 00 00 A8 00 00 00 <-
    

    我不知道是什么 A8 但如果我用零替换它,程序就不会执行。

    一句话:那是什么?

    另外,你能给我一个完整的MS DOS头的链接吗?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Atempcode    15 年前

    dword at offset 0x3c是新的exe头的偏移量,也称为image_nt_头。因此,如果在那里更改值,则PE加载程序找不到新的exe头。

        2
  •  4
  •   Matteo Italia    15 年前

    PE的第一部分是msdos存根;在0x3c(其中您的“A8”是)有到PE文件签名的偏移量。如果将其归零,加载程序将无法找到PE签名,并且将拒绝加载它(或者将其作为MS-DOS可执行文件加载,我没有尝试)。 有关详细信息,请参阅 PE format specifications .

        3
  •  3
  •   Jongware    6 年前

    我怀疑这是到新PE头的偏移量,前30个奇数字节是MS-DOS头,偏移到“A8”所在的文件中对应于结构中的字段。 _IMAGE_DOS_HEADER 打电话 LONG e_lfanew; // File address of new exe header ; 它的价值“A8”将是新的 IMAGE_NT_HEADER 其中包含这个信息

    • 双字签名;
    • _图像文件头文件头;
    • _ image_optional_header optional header;

    前两个字节是进入可执行文件的原始MS-DOS头,如此常量所示: WORD IMAGE_DOS_SIGNATURE = 0x5A4D; // MZ ;image_nt_头具有此签名以标识它是NT平台的可执行文件。 DWORD IMAGE_NT_SIGNATURE = 0x00004550; // PE00 ;

    您将在名为 pe.h .

    发生了什么事?您删除了值“A8”,加载程序找不到 IMAGE NTH头 因此失败了。