2

「PEヘッダーの要件」という同様の質問をすでにしましたが、その答えには本当に満足していません。

JavaSE1.6でアセンブラ/リンカを構築しています。PE / COFFヘッダーとファイル形式に関する5つの異なるドキュメント/仕様を読みましたが、問題が発生します。

生成されたファイルは無効です、とWindowsは言います:「Xは有効なWin32アプリケーションではありません。」私は何が間違っているのかわかりません。PEヘッダーとPEオプションヘッダーのすべてのエントリを再確認しましたが、すべて正しいようです。
私は3つのセクションを持っています:

  • code(RVA 0x1000、ファイル0x400
  • data(RVA 0x2000、ファイル0x600
  • import(RVA 0x3000、ファイル0x800

エントリポイントの値は0x1000(の先頭code)にあり、イメージベースは0x400000です。セクションの配置は0x1000で、ファイルの配置は0x200です。

ファイル全体を表示するには、この質問のリビジョンを参照してください。

つまり、有効なPEファイル(単純な「HelloWorld」メッセージボックスアプリケーション)を取得し、16進エディター(HxD)を使用して変更を開始しました。「Xは有効なWin32アプリケーションではありません」ではなく、さまざまなエラーメッセージが表示されました。

codeコンテンツが「有効な」コードではないことは承知していますが、テストしました。無効なコードを使用すると、アプリケーションのクラッシュエラーが発生します。

「HelloWorld」PEファイルのインポートセクションの内容が無効な場合、「[...]にプロシージャポイントが見つかりません」または「[..]dllが原因でアプリケーションを開始できませんでした」というエラーが表示されます。見つかりません。」、またはアプリケーションのクラッシュ。これらのエラーはすべて非常に便利です。それらはすべて私に何が悪かったのかについての手がかりを与えてくれます。

しかし、「Xは有効なWin32アプリケーションではありません。」というエラーが表示された私のPEファイルは、私を狂わせます。私のPEファイルの何が問題になっていますか?

ダンプビン出力:

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
4

3 に答える 3

3

あなたは間違いなく間違った方向からこの問題に取り組んでいます。16 進数をハッキングしても、必要なものが得られることはありません。PE ファイル構造は洗練されすぎています。必要なものは 2 つあります。

  • Matt Pietrek の重要な記事は、構造を理解するために欠かせないものです。コードの少なくとも 75% を理解するまで、コードを開始しないでください。
  • Windows SDK が必要です。include/winnt.h ファイルには、PE 形式で使用される構造体の宣言が含まれています。これは、ファイルの最初のチャンクである _IMAGE_DOS_HEADER から始まります。

宣言から構造を作成するコードを記述します。これが、有効な実行可能ファイルを作成する唯一の方法です。

PS: あなたの 16 進ダンプは、あなたの質問を見ようとする人のブラウザーをハングアップさせます。

于 2010-03-20T14:38:33.307 に答える
0

簡単なグーグルが明らかにした:

http://rcecafe.net/?p=26 . ここにいる誰もあなたのためにあなたのバイトをうろつくことはありません.あなたが期待できる最高のものはツールへのポインタです.

于 2010-03-20T14:39:05.733 に答える
0

画像のサイズは、 dumpbin によると890、メモリ内の画像のサイズ、つまり、最新のセクションの RVA + そのセクションの切り上げサイズ (0x5000この場合) である必要があります。

できます。anserws、特にへのヒントをありがとうdumpbin!

于 2010-03-20T15:06:36.400 に答える