Perché il mio file PE non valida?
-
21-09-2019 - |
Domanda
Ho già fatto una domanda simile, "Requisiti PE Header" , ma io non sono davvero soddisfatto della risposta.
Sto costruendo un assemblatore / linker, in Java SE 1.6. Ho letto circa 5 diverse documentazioni / specifiche sul formato PE / COFF intestazione e file, ma mi sono bloccato in un problema:
Il mio file generato non è valido, dice che Windows: "X non è un'applicazione di Win32 valida." Sono all'oscuro di ciò che può essere sbagliato; Ho ricontrollato ogni voce Intestazione PE e PE opzionale intestazione, e tutto sembra essere di destra.
Ho tre sezioni:
-
code
(RVA0x1000
, File0x400
) -
data
(RVA0x2000
, File0x600
) -
import
(RVA0x3000
, File0x800
)
Il mio valore entrypoint è a 0x1000
(all'inizio del code
) e il mio ImageBase è 0x400000
. allineamento Sezione è 0x1000
e l'allineamento file è 0x200
.
Vedi le revisioni di questa domanda per vedere l'intero file.
Quindi: ho afferrato un file PE valida (una semplice applicazione finestra di messaggio "Ciao Mondo"), e ha iniziato a modificarlo, con un editor esadecimale (HxD). Ho un sacco di diversi messaggi di errore, non "X non è un'applicazione di Win32 valida.":
Sono consapevole che il mio contenuto code
non è il codice "valido", ma ho provato fuori:. Codice non valido dà un errore di applicazione Crash
Se il contenuto di import-sezione è valida nel file PE "Ciao Mondo", mi dà l'errore "punto di Procedura non può essere trovato in [...]", o "L'applicazione non è riuscito ad avviare perché [.. ] dll non è stato trovato. ", o un crash dell'applicazione. Questi errori sono tutti molto utili; tutti mi danno qualche idea di cosa è stato sbagliato.
Ma il mio file PE, con l'errore "X non è un'applicazione di Win32 valida.", Mi spinge folle:? Cosa c'è di sbagliato con il mio file PE
Dumpbin uscita:
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
Soluzione 3
la dimensione dell'immagine è, secondo 890
dumpbin, mentre dovrebbe essere la dimensione di immagine nella memoria, cioè RVA l'ultima della sezione + dimensione arrotondati che della sezione (ad esempio 0x5000
in questo caso).
Funziona. Grazie per anserws, in particolare il suggerimento per dumpbin
!
Altri suggerimenti
Vi sono sicuramente affrontare questo problema dalla parte sbagliata. Hacking l'esagono non è mai andare a ottenere ciò che vuoi, la struttura dei file PE è troppo sofisticato. Avrete bisogno di due cose.
-
di
- seminale articolo è una lettura essenziale per comprendere la struttura . Non iniziare a codice fino a comprendere almeno il 75% di esso.
- È necessario l'SDK di Windows. Il file include / winnt.h contiene le dichiarazioni delle strutture utilizzate nel formato PE. Si inizia alle _IMAGE_DOS_HEADER, il primo blocco del file.
Scrivi il codice per creare le strutture da loro dichiarazioni, che è l'unico modo per finire con un file eseguibile valido.
PS: le vostre discariche hex riagganciare il browser di qualcuno che cerca di guardare alla tua domanda
.Una rapida di Google ha rivelato:
http://rcecafe.net/?p=26 . Nessuno qui sta per strisciare attraverso i byte per voi, il meglio che si può aspettare è puntatori agli strumenti.