Bound Import - error 0xc000007b
Error (0xc000007b)
"La aplicación no se pudo iniciar correctamente (0xc000007b)". Es un error que puede ocurrirte al ejecutar un programa en Windows. Buscando información por la red, este error se puede producir por muchos y variados motivos, es por ende que no voy a generalizar y seguramente tu error 0xc000007b no esté contemplado en este artículo. Aquí voy a mostrar un caso real en el que sí nos puede aparacer dicho error y está intimamente ligado a los dos tutoriales anteriores sobre el PE header.
Antes de seguir con este artículo, te recomiendo que leas los dos artículos anteriores sobre el Bound Import Directory, están enlazados con lo que vamos a ver hoy aquí y deberías entenderlo.
Esto me ocurrió tras la programación de la versión 0.1.1 de Add PE bytes. Recuerdo que en un ejecutable en Visual Basic 6, si añadías una nueva sección con Add PE bytes el programa hecho en VB6 dejaba de funcionar y saltaba la siguiente ventana de error:
¿De dónde procede este error? Bueno, pues todo viene relacionado con el Bound Import Directory. Como ya he dicho muchas veces, una de las formas de reparar este error es poner tanto el valor Bound Import RVA como el Bound Import Size a cero. Estos datos ya los expliqué detenidamente en los dos artículos anteriores y comenté qué ocurre si se ponen a cero.
¿Por qué se produce?
Tiene una explicación muy lógica. Voy a usar el mismo programa ejemplo9.exe que usé al hablar sobre el Bound Import y que puedes descargar. Si lo analizas con un visor PE verás lo siguiente:
| RVA | Size |
BoundImport | 00000228 | 00000020 |
Viendo esto voy a "echar un vistazo" al PE header alrededor del RVA 228:
...
00000200 2E72737263000000 ; SECTION ".rsrc"
00000208 CC080000 ; VirtualSize = 8CC (2252.)
0000020C 00C00000 ; VirtualAddress = C000
00000210 00100000 ; SizeOfRawData = 1000 (4096.)
00000214 00C00000 ; PointerToRawData = C000
00000218 00000000 ; PointerToRelocations = 0
0000021C 00000000 ; PointerToLineNumbers = 0
00000220 0000 ; NumberOfRelocations = 0
00000222 0000 ; NumberOfLineNumbers = 0
00000224 40000040 ; Characteristics = INITIALIZED_DATA|READ
00000228 46BF0248 ; TimeDateStamp
0000022C 1000 ; OffsetModuleName
0000022E 0000 ; NumberOfModuleforwarderRefs
...
Como puedes observar, lo que he puesto de color verde es la estructura IMAGE_BOUND_IMPORT_DESCRIPTOR y lo más importante de todo es que está ¡pegada a la última sección!. Después está simplemente en letra la librería de Visual Basic (como ya expliqué) y todo lleno de ceros hasta la sección .text.
Si observas las secciones con un programa que hice (File Location Calculator) y que muestra también el PE header, verás esto:
Observa que la sección (me refiero al Header, al encabezado, sección no es totalmente correcto) en el archivo físico son 1000h bytes. ¿Qué ocurre al añadir una nueva sección? Pues sencillamente que pisoteamos la estructura IMAGE_BOUND_IMPORT_DESCRIPTOR. Se rellena de valores no permitidos y nos salta el error 0xc000007b.
Solución
Saltan a la vista dos posibles soluciones:
- Poner tanto el valor Bound Import RVA como Bound Import Size a cero.
- Cambiar de sitio la estructura IMAGE_BOUND_IMPORT_DESCRIPTOR y el dato Bound Import RVA apuntando a esta estructura.
Como la primera ya la he probado muchas veces sé que funciona. En estos momentos estoy probando la segunda... un momento...¡correcto!, funciona también perfectamente.
Poner tanto el valor Bound Import RVA como Bound Import Size a cero.
Es muy sencillom, si no sabes pregunta de nuevo...