Una pequeña pregunta sobre .idata

Iniciado por Usuario887, 15 Noviembre 2021, 17:31 PM

0 Miembros y 1 Visitante están viendo este tema.

Usuario887

Se que .idata mantiene una tabla de las direcciones a las funciones de las importaciones... Mi pregunta es... ¿Todas las importaciones?

Hice un programa "Hello world" para analizar esta tabla y veo un millon de direcciones, cuando mi programa usa pocas funciones (en relacion).

Entonces, ¿Se carga todo?

Esto es trabajo del dynamic linker por lo que me imagino que no tiene idea de que funciones son las que va a utilizar el programa, por lo que las carga todas, ¿No?

MCKSys Argentina

Hola!

El nombre de la sección es irrelevante, lo que importa es lo que contiene la sección.

En el caso del Import Directory y la IAT, todas las funciones deben ser resueltas antes de ejecutar el programa. Por eso están ahí. Si quieres usar API's luego de caragdo el .exe, usas LoadLibrary + GetProcAddress.

Siempre conviene usar un parser de PE Header (por ejemplo CFF Explorer o PE-bear) para ver qué hay en cada sección.

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


Usuario887

Citartodas las funciones deben ser resueltas antes de ejecutar el programa

OK, eso era lo que queria saber.
Gracias por tu respuesta.
Un saludo.

Eternal Idol

Cita de: marax en 15 Noviembre 2021, 17:31 PM
Se que .idata mantiene una tabla de las direcciones a las funciones de las importaciones... Mi pregunta es... ¿Todas las importaciones?

Hice un programa "Hello world" para analizar esta tabla y veo un millon de direcciones, cuando mi programa usa pocas funciones (en relacion).

Entonces, ¿Se carga todo?

Esto es trabajo del dynamic linker por lo que me imagino que no tiene idea de que funciones son las que va a utilizar el programa, por lo que las carga todas, ¿No?

¿Que es todas? Todas las que tu programa enlaza estaticamente si, todas las que existen no. Y ojo que no las referencies directamente en tu codigo no significa que la RTL no lo haga.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 15 Noviembre 2021, 19:54 PM
¿Que es todas? Todas las que tu programa enlaza estaticamente si, todas las que existen no. Y ojo que no las referencies directamente en tu codigo no significa que la RTL no lo haga.

Justo venia a aclarar que acabo de usar una herramienta del depurador para mostrarme las importaciones del programa y efectivamente no carga todas las referencias en .idata/.rdata/etc. Carga solo unas. (las que necesita, aparentemente).

Una pregunta, como exactamente es que el enlazador dinamico sabe que librerias cargar? Lo especifica en alguna parte el PE header?

Iba a preguntar si para anyadir nuevas referencias habria que modificar el fichero. Tomare por hecho que si pero como recuerdo hace tiempo haber visto un virus que las cargaba dinamicamente prefiero dejar la duda abierta

Eternal Idol

Esta todo en el PE, el nombre de las DLLs y funciones importadas.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

¿Y si la funcion no esta importada de la DLL y no hay referencias a LoadLibrary + GetProcAddress, no hay manera de acceder a una funcion?

(No se si se crea que pregunto para desarrollo de malware, porque parece, pero es curiosidad. Si vamos al caso yo infectaria un binario con referencias a las funciones que normalmente uso y tengo una lista larga. Es que es interesante imaginar como se podria acceder a una funcion "Fuera del alcance" del binario en memoria).




O en disco. Mas en disco. Si vamos al caso nunca he hecho un run PE.

Saludiños

Eternal Idol

No sin hacer lo mismo (o algo muy semejante) que hacen esas funciones, leer el archivo, procesarlo, mappearlo en memoria como ejecutable por un lado y procesar el PE para encontrar las funciones por el otro. Si mañana creo una DLL y la copio en system32 no se va a cargar en todos los procesos innecesariamente, solo se cargara en los que la referencien de alguna manera.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Usuario887

Cita de: Eternal Idol en 16 Noviembre 2021, 15:15 PM
Si mañana creo una DLL

No dejes para mañana lo que puedes hacer hoy.  :silbar:

Cita de: Eternal Idol en 16 Noviembre 2021, 15:15 PM
no se va a cargar en todos los procesos innecesariamente

Entonces debe haber algo como una "Lista de importaciones" ¿No? ¿Como se llama...?

Gracias por tu ayuda.

Danielㅤ

Cita de: marax en 16 Noviembre 2021, 18:56 PM
No dejes para mañana lo que puedes hacer hoy.  :silbar:


El compañero Ídolo Eterno no se refería a que realmente mañana vaya a crear una DLL, sinó que sólo fue un ejemplo para poder expresar su explicación.


Saludos
¡Regresando como cual Fenix! ~
Bomber Code © 2021 https://www.bombercode.net/foro/

Ayudas - Aportes - Tutoriales - Y mucho mas!!!