私の PE ファイルが無効なのはなぜですか?
-
21-09-2019 - |
質問
すでに同様の質問をしましたが、 「PEヘッダー要件」, しかし、私はその答えにあまり満足していません。
Java SE 1.6でアセンブラ/リンカを構築しています。PE/COFF ヘッダーとファイル形式に関する 5 つの異なるドキュメント/仕様を読みましたが、次の問題で行き詰まっています。
生成されたファイルは無効です、と Windows が表示します: 「X は有効な Win32 アプリケーションではありません。」 何が問題なのか全く分かりません。PE ヘッダーと PE オプション ヘッダーのすべてのエントリを再確認しましたが、すべて正しいようです。
3 つのセクションがあります。
code
(RVA0x1000
, 、 ファイル0x400
)data
(RVA0x2000
, 、 ファイル0x600
)import
(RVA0x3000
, 、 ファイル0x800
)
私のエントリポイント値は次のとおりです 0x1000
(の始まり code
)そして私のイメージベースは 0x400000
. 。セクションの配置は 0x1000
ファイルの配置は 0x200
.
ファイル全体を確認するには、この質問のリビジョンを参照してください。
それで:私は有効な PE ファイル (単純な「Hello World」メッセージ ボックス アプリケーション) を取得し、16 進エディタ (HxD) を使用して変更を開始しました。色々なエラーメッセージが出てきましたが、 ない 「X は有効な Win32 アプリケーションではありません。」:
私はそれを知っています code
コンテンツは「有効な」コードではありませんが、テストしてみました。無効なコードによりアプリケーション クラッシュ エラーが発生します。
「Hello World」PE ファイルのインポート セクションの内容が無効な場合、「[...] にプロシージャ ポイントが見つかりません」または「[..] dll が存在しないため、アプリケーションを開始できませんでした」というエラーが表示されます。見つかりません。」、またはアプリケーションのクラッシュ。これらのエラーはすべて非常に役立ちます。それらはすべて、何が間違っていたのか手がかりを与えてくれます。
しかし、私の PE ファイルには、「X は有効な Win32 アプリケーションではありません。」というエラーが表示され、私は気が狂いました。 私の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
解決 3
は、メモリに画像の大きさでなければならないしながら画像のサイズは、DUMPBIN 890
によれば、つまり最新のセクションのRVA +そのセクションの切り上げサイズ(例えば0x5000
この場合)。
これは動作します。 anserws、dumpbin
に特にヒントをありがとう!
他のヒント
あなたは間違いなくこの問題に間違った方向から取り組んでいます。PE ファイルの構造が洗練されすぎているため、16 進数をハッキングしても望むものは得られません。2 つのものが必要です。
- マット・ピートレックの 独創的な記事 構造を理解するために必読です。コードの少なくとも 75% を理解するまでは、コードを書き始めないでください。
- Windows SDK が必要になります。include/winnt.h ファイルには、PE 形式で使用される構造体の宣言が含まれています。ファイルの最初のチャンクである _IMAGE_DOS_HEADER から始まります。
宣言から構造体を作成するコードを記述します。これが、有効な実行可能ファイルを作成する唯一の方法です。
追伸:あなたの 16 進ダンプは、あなたの質問を見ようとする人のブラウザをハングさせます。
簡単にGoogleは明らかにします:
http://rcecafe.net/?p=26 に。ここでは誰もあなたが期待することができる最高のツールへのポインタである、あなたのためにバイトを通じて屈服するつもりはありません。