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

为什么我的pe文件无效?

  •  1
  • Pindatjuh  · 技术社区  · 14 年前

    我已经问过类似的问题, "PE Header requirements" ,但我不太满意这个答案。

    我在JavaSE 1.6中构建了一个汇编器/链接器。我已经阅读了关于pe/coff头和文件格式的5个不同的文档/规范,但是我遇到了一个问题:

    我生成的文件无效,Windows说: “x不是有效的win32应用程序。” 我不知道什么是错误的;我已经仔细检查了pe头和pe可选头中的每个条目,所有的似乎都是正确的。
    我有三个部分:

    • code (RVA) 0x1000 文件 0x400 )
    • data (RVA) 0x2000 文件 0x600 )
    • import (RVA) 0x3000 文件 0x800 )

    我的入口点值为 0x1000 (开始 代码 )我的图像库是 0x400000 . 断面线形为 0x1000 文件对齐是 0x200 .

    请参阅此问题的修订以查看整个文件。

    所以:我获取了一个有效的pe文件(一个简单的“hello world”消息框应用程序),并使用hex编辑器(hxd)开始修改它。我收到了很多不同的错误信息, “x不是有效的win32应用程序。”:

    我知道 代码 内容不是“有效”代码,但我已经测试过了:无效代码会导致应用程序崩溃错误。

    如果“hello world”pe文件中的导入节内容无效,则会出现错误“在[…]中找不到过程点”,或“由于找不到[…]dll,应用程序无法启动”,或应用程序崩溃。这些错误都是非常有用的,它们都给了我一些错误的线索。

    但是我的pe文件,错误是“x不是有效的win32应用程序。”,让我疯狂: 我的体育档案怎么了?

    垃圾箱输出:

    E:\Documenten\CP Language\compiler\Win32Builder>dumpbin /ALL test.exe
    Microsoft (R) COFF/PE Dumper Version 10.00.21003.01
    Copyright (C) Microsoft Corporation.  All rights reserved.
    Dump of file test.exe
    PE signature found
    File Type: EXECUTABLE IMAGE
    FILE HEADER VALUES
             14C machine (x86)
               3 number of sections
        32EB4BF5 time date stamp Sun Jan 26 13:20:05 1997
               0 file pointer to symbol table
               0 number of symbols
              E0 size of optional header
             703 characteristics
                   Relocations stripped
                   Executable
                   32 bit word machine
                   Debug information stripped
                   CD - run from swapfile
    
    OPTIONAL HEADER VALUES
             10B magic # (PE32)
            8.00 linker version
            1000 size of code
            1000 size of initialized data
               0 size of uninitialized data
            1000 entry point (00401000)
            1000 base of code
            2000 base of data
          400000 image base (00400000 to 0040088F)
            1000 section alignment
             200 file alignment
            4.00 operating system version
           13.37 image version
            4.00 subsystem version
               0 Win32 version
             890 size of image
             400 size of headers
               0 checksum
               2 subsystem (Windows GUI)
               0 DLL characteristics
           40000 size of stack reserve
           11000 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
            3000 [    1000] 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
       .code name
        1000 virtual size
        1000 virtual address (00401000 to 00401FFF)
          23 size of raw data
         400 file pointer to raw data (00000400 to 00000422)
           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
      00401000: 68 00 00 00 00 68 0D 20 40 00 68 00 20 40 00 68  h....h. @.h. @.h
      00401010: 00 00 00 00 E8 64 30 40 00 68 00 00 00 00 E8 6C  ....èd0@.h....èl
      00401020: 30 40 00                                         0@.
    
    SECTION HEADER #2
       .data name
        1000 virtual size
        2000 virtual address (00402000 to 00402FFF)
          23 size of raw data
         600 file pointer to raw data (00000600 to 00000622)
           0 file pointer to relocation table
           0 file pointer to line numbers
           0 number of relocations
           0 number of line numbers
    C0000040 flags
             Initialized Data
             Read Write
    RAW DATA #2
      00402000: 48 65 6C 6C 6F 20 57 6F 72 6C 64 21 00 48 65 6C  Hello World!.Hel
      00402010: 6C 6F 20 53 74 61 63 6B 20 4F 76 65 72 66 6C 6F  lo Stack Overflo
      00402020: 77 21 00                                         w!.
    
    SECTION HEADER #3
     .import name
        1000 virtual size
        3000 virtual address (00403000 to 00403FFF)
          90 size of raw data
         800 file pointer to raw data (00000800 to 0000088F)
           0 file pointer to relocation table
           0 file pointer to line numbers
           0 number of relocations
           0 number of line numbers
    50000040 flags
             Initialized Data
             Shared
             Read Only
    RAW DATA #3
      00403000: 54 30 00 00 00 00 00 00 00 00 00 00 3C 30 00 00  T0..........<0..
      00403010: 64 30 00 00 5C 30 00 00 00 00 00 00 00 00 00 00  d0..\0..........
      00403020: 47 30 00 00 6C 30 00 00 00 00 00 00 00 00 00 00  G0..l0..........
      00403030: 00 00 00 00 00 00 00 00 00 00 00 00 75 73 65 72  ............user
      00403040: 33 32 2E 64 6C 6C 00 6B 65 72 6E 65 6C 33 32 2E  32.dll.kernel32.
      00403050: 64 6C 6C 00 74 30 00 00 00 00 00 00 82 30 00 00  dll.t0.......0..
      00403060: 00 00 00 00 74 30 00 00 00 00 00 00 82 30 00 00  ....t0.......0..
      00403070: 00 00 00 00 00 00 4D 65 73 73 61 67 65 42 6F 78  ......MessageBox
      00403080: 41 00 00 00 45 78 69 74 50 72 6F 63 65 73 73 00  A...ExitProcess.
    
      Section contains the following imports:
    
    user32.dll
                403064 Import Address Table
                403054 Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference
    
                    0 MessageBoxA
    
    kernel32.dll
                40306C Import Address Table
                40305C Import Name Table
                     0 time date stamp
                     0 Index of first forwarder reference
    
                    0 ExitProcess
    
    Summary
        1000 .code
        1000 .data
        1000 .import
    
    3 回复  |  直到 9 年前
        1
  •  0
  •   Hans Passant    14 年前

    你肯定是从错误的角度来解决这个问题。破解hex永远不会得到你想要的,pe文件结构太复杂了。你需要两样东西。

    • 马特·皮特里克的 seminal article 是理解结构的必要阅读。在你至少理解了75%的代码之前,不要开始编写代码。
    • 你需要Windows的sdk。include/winnt.h文件包含pe格式中使用的结构的声明。它从文件的第一个块,即映像头开始。

    编写代码以从它们的声明中创建结构,这是最终获得有效可执行文件的唯一方法。

    注意:你的hex dump会挂断任何试图查看你问题的人的浏览器。

        2
  •  0
  •   bmargulies    14 年前

    一个快速的谷歌透露:

    http://rcecafe.net/?p=26 . 这里没有人会为你卑躬屈膝,你能期待的最好的是指向工具的指针。

        3
  •  0
  •   Pindatjuh    14 年前

    根据dumpbin,图像的大小是 890 ,而它应该是内存中图像的大小,即最新节的rva+该节的四舍五入大小(例如 0x5000 在这种情况下)。

    它起作用了。谢谢你的回答,尤其是 dumpbin !