¿Por qué mi PE de archivo no válido?
-
21-09-2019 - |
Pregunta
Ya me hicieron una pregunta similar, "PE Encabezado requisitos", pero no estoy realmente satisfecho con su respuesta.
Estoy construyendo un ensamblador/enlazador, en Java SE 1.6.He leído sobre 5 diferentes documentaciones/especificaciones acerca de la PE/COFF encabezado y el formato de archivo, pero estoy atascado en un problema:
Mi archivo generado no es válida, dice Windows: "X no es una aplicación Win32 válida". Yo soy la menor idea de lo que puede ser malo;He verificado que cada entrada en el Encabezado PE y PE Encabezado Opcional, y todo parece ser correcto.
Tengo tres secciones:
code
(RVA0x1000
, Archivo0x400
)data
(RVA0x2000
, Archivo0x600
)import
(RVA0x3000
, Archivo0x800
)
Mi valor se encuentra en el punto de entrada 0x1000
(el principio de code
) y mi imagebase es 0x400000
.La sección de alineación es 0x1000
y archivo de la alineación es 0x200
.
Ver las revisiones de esta pregunta para ver el archivo completo.
Así:Me agarró un válido archivo PE (un simple "Hola Mundo" cuadro de mensaje de la aplicación), y comenzó a modificar con un editor hexadecimal (HxD).Tengo un montón de mensajes de error diferentes, no la "X no es una aplicación Win32 válida".:
Soy consciente de que mi code
el contenido no es "válido" de código, pero he probado:código no válido da un Bloqueo de la Aplicación de error.
Si la importación-contenido de la sección no es válido en el "Hola Mundo" archivo PE, me da el error "el Procedimiento no se puede encontrar en [...]", o "Aplicación no pudo iniciar porque [..] archivo dll no se encuentra.", o un Bloqueo de la Aplicación.Estos errores son muy útiles;todos ellos me dan alguna pista de lo que estaba mal.
Pero mi archivo PE, con el mensaje de error "X no es una aplicación Win32 válida"., me conduce loco: Lo que está mal con mi archivo PE?
Dumpbin de salida:
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
Solución 3
El tamaño de la imagen es, según 890
dumpbin, mientras que debería ser el tamaño de imagen en la memoria, es decir RVA de la última sección + tamaño redondeado plano de esa sección (por ejemplo 0x5000
en este caso).
Funciona. Gracias por anserws, especialmente la indirecta a dumpbin
!
Otros consejos
Usted está definitivamente abordar este problema desde un ángulo equivocado.Cortar el hex no es nunca va a obtener lo que desea, el PE de la estructura del archivo es demasiado sofisticado.Usted necesitará dos cosas.
- Matt Pietrek del artículo seminal es una lectura imprescindible para entender la estructura.No empezar en el código hasta que usted comprenda al menos el 75% de la misma.
- Necesitas el SDK de Windows.El include/winnt.h archivo contiene las declaraciones de las estructuras que se utilizan en el formato PE.Se inicia en _IMAGE_DOS_HEADER, el primer fragmento del archivo.
Escribir el código para crear las estructuras de sus declaraciones, que la única manera de terminar con una válida archivo ejecutable.
PS:su hex vertederos de colgar los navegadores de alguien que intenta mirar a su pregunta.
Una rápida de Google reveló:
http://rcecafe.net/?p=26 . Aquí nadie va a arrastrarse a través de los bytes para usted, lo mejor que puede esperar es punteros de herramientas.