Bound Import - error 0xc000007b

Tamaño de letra:

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:

Error 0xc000007b

¿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:

File Location Calculator - bound import

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.

 

Última actualización: Domingo, 18 Septiembre 2011
Comentarios  
0 # Editor 28-08-2013 21:32
Eso es porque tienes que modificar con un editor de PE dos valores:
Poner tanto el valor Bound Import RVA como Bound Import Size a cero.

Es muy sencillom, si no sabes pregunta de nuevo...
0 # Sergio 28-08-2013 06:28
Que prolija es tu exposición! Es para agradecer, especialmente de parte de los que sabemos poco. Te escribo porque, siendo que tengo un comercio, hice mi propia aplicación de gestión en VB6 y Access 2003, que corre en un par de PC con XP. Al intentar instalar en una NetBook ya viejita con Win7 Starter me da este error. ¿Puede ocurrir que porque falta registrar algún OCX se origine este error? (Perdón por la pregunta pero mis conocimientos son limitados)

No tiene privilegios para responder a los comentarios.


 
Visitas: 8488014