Warum ist die PE-Datei ungültig?
-
21-09-2019 - |
Frage
Ich fragte bereits eine ähnliche Frage, „PE-Header Anforderungen“ , aber ich bin nicht wirklich es Antwort zufrieden mit.
Ich baue einen Assembler / Linker, in Java SE 1.6. Ich habe über 5 verschiedene Dokumentationen / Spezifikationen über die PE / COFF-Header und Dateiformat lesen, aber ich bin an einem Problem stecken:
Meine erzeugte Datei nicht gültig ist, sagt Windows-: „X keine gültige Win32-Anwendung.“ Ich bin ratlos, was falsch sein kann; Ich habe doppelt geprüft jeden Eintrag in den PE-Header und PE Optional-Header, und alles scheint richtig zu sein.
Ich habe drei Abschnitte:
-
code
(RVA0x1000
, Datei0x400
) -
data
(RVA0x2000
, Datei0x600
) -
import
(RVA0x3000
, Datei0x800
)
Ihr Einstiegspunkt Wert bei 0x1000
(Anfang code
) und meine Imagebase ist 0x400000
. § Ausrichtung ist 0x1000
und Datei Ausrichtung ist 0x200
.
Sehen Sie Revisionen dieser Frage die gesamte Datei zu sehen.
Also: packte ich eine gültige PE-Datei (ein einfaches „Hallo Welt“ Message-Box-Anwendung), und begann, ihn zu ändern, mit einem Hex-Editor (HxD). Ich habe viele verschiedene Fehlermeldungen, nicht „X ist keine gültige Win32-Anwendung.“
Ich bin mir bewusst, dass mein code
Inhalt ist nicht „gültig“ Code, aber ich habe es ausprobiert aus: ungültiger Code gibt einen Absturz Fehler
Wenn der Import-Abschnitt Inhalt in der „Hallo Welt“ PE-Datei ungültig ist, es gibt ich die Fehlermeldung „Punkt Vorgehensweise kann nicht in [...]“ oder „Anwendung konnte nicht, weil starten [.. ] dll wurde nicht gefunden. ", oder ein Absturz der Anwendung. Diese Fehler sind alle sehr nützlich; sie alle geben mir etwas Ahnung, was falsch war.
Aber meine PE-Datei, mit dem Fehler "X ist keine gültige Win32-Anwendung.", Fährt mich verrückt: Was ist mit meiner PE-Datei ist falsch
Dumpbin Ausgabe:
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
Lösung 3
Die Größe des Bildes ist, nach dumpbin 890
, während es die Größe des Bildes im Speicher sein sollte, das heißt die RVA neuesten Abschnitt + dieser Abschnitt der aufgerundete Größe (z 0x5000
in diesem Fall).
Es funktioniert. Vielen Dank für anserws, vor allem der Hinweis auf dumpbin
!
Andere Tipps
Sie sind auf jeden Fall der Bekämpfung dieses Problems von der falschen Seite. Hacking ist die hex nicht immer Sie gehen zu bekommen, was Sie wollen, ist die PE-Datei-Struktur zu anspruchsvoll. Sie werden zwei Dinge benötigen.
- Matt Pietrek wegweisenden Artikel ist eine wichtige Lektüre, die Struktur zu verstehen . Lassen Sie sich auf Code erst gestartet, wenn Sie mindestens 75% davon zu verstehen.
- Sie finden das Windows SDK benötigen. Die include / winnt.h Datei die Deklarationen der Strukturen enthält im PE-Format verwendet. Es beginnt bei _IMAGE_DOS_HEADER, dem ersten Block der Datei.
Schreiben Sie den Code, die Strukturen aus ihren Erklärungen zu schaffen, dass der einzige Weg, mit einer gültigen ausführbaren Datei zu beenden.
PS:. Ihre Hexdumps den Browser von jemandem aufzuhängen, dass versucht auf Ihrer Frage zu suchen
Eine schnelle Google ergab:
http://rcecafe.net/?p=26 . Niemand hier wird Grovel durch Ihre Bytes für Sie gehen, das Beste, was Sie ist Zeiger auf Tools erwarten können.