elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Ingeniería Inversa (Moderadores: karmany, .:UND3R:., MCKSys Argentina)
| | |-+  Carga de DLLs Forward
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Carga de DLLs Forward  (Leído 4,586 veces)
paulagarcum

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Carga de DLLs Forward
« en: 6 Noviembre 2013, 14:06 pm »

Hola a todos.

Pregunto sobre una DLL que tiene funciones que a su vez importa de otras DLL. Ejemplo:

El Kernel32.dll tiene funciones que están implementadas dentro del Kernel32.dll por ejemplo Beep. Pero tiene otras funciones que son implementadas en otras DLLs, por ejemplo OpenProcessToken que está implementada en la DLL API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL. (Hablo por ejemplo en Windows 7)

Es por ello que si se ve la Export Address Table del Kernel32.dll, la función OpenProcessToken aparece como Forwarded a API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0.DLL.

Entonces, la pregunta por la que viene todo esto:

¿Cuando mi programa se carga en memoria para ejecutarse, y el loader de Windows carga la Kernel32.dll en el espacio de direcciones del proceso de mi programa, también carga automáticamente la DLL API-MS-WIN-CORE-PROCESSTHREADS-L1-1-0?

O sea: ¿cuando el loader de Windows carga una DLL que un programa necesita, también carga automáticamente todas las DLL Forwarded, que la primera DLL necesita?

Dicho de otra manera: Si yo cargo una DLL con LoadLibrary, pongamos la Kernel32.dll -> LoadLibrary("kernel32.dll") ¿LoadLibrary cargará además de la Kernel32, también todas las DLL Forwarded que la Kernel32 importe?

Gracias.
« Última modificación: 6 Noviembre 2013, 14:08 pm por paulagarcum » En línea

The Swash

Desconectado Desconectado

Mensajes: 194


Programmer


Ver Perfil WWW
Re: Carga de DLLs Forward
« Respuesta #1 en: 6 Noviembre 2013, 15:07 pm »

Creo que esto te responderá algo:

Citar
Export Forwarding
      A particularly slick feature of exports is the ability to "forward" an export to another DLL. For example, in Windows NT®, Windows® 2000, and Windows XP, the KERNEL32 HeapAlloc function is forwarded to the RtlAllocHeap function exported by NTDLL. Forwarding is performed at link time by a special syntax in the EXPORTS section of the .DEF file. Using HeapAlloc as an example, KERNEL32's DEF file would contain:
   EXPORTS
   •••
   HeapAlloc = NTDLL.RtlAllocHeap
      How can you tell if a function is forwarded rather than exported normally? It's somewhat tricky. Normally, the EAT contains the RVA of the exported symbol. However, if the function's RVA is inside the exports section (as given by the VirtualAddress and Size fields in the DataDirectory), the symbol is forwarded.
      When a symbol is forwarded, its RVA obviously can't be a code or data address in the current module. Instead, the RVA points to an ASCII string of the DLL and symbol name to which it is forwarded. In the prior example, it would be NTDLL.RtlAllocHeap.
En línea

paulagarcum

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Carga de DLLs Forward
« Respuesta #2 en: 6 Noviembre 2013, 17:07 pm »

Gracias por responderme,

Sin embargo decirte que eso no responde a lo que yo preguntaba.

Ahí en lo que tú me has puesto explica cómo se ve en la EAT (Export Address Table) si una función está o no Forwarded.

Pero no explica lo que yo preguntaba:

¿Si cargo una DLL, por ejemplo con LoadLibrary, todas las DLLs que esa DLL importa, LoadLibrary también las carga? ¿O sólo carga la DLL que se le pasa a LoadLibrary?


En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 5.518


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Carga de DLLs Forward
« Respuesta #3 en: 6 Noviembre 2013, 20:04 pm »

Cuando cargas una DLL, LoadLibrary cargará (o al menos tratará de hacerlo) todas las DLL que estén referenciadas en la IAT de dicha DLL.

Además, ejecutará el entrypoint de la DLL, lo que podría también generar la carga de otras DLLs que no están en la IAT.

No estoy muy seguro (pero creo que es posible) que si una DLL tiene TLS y se cargan DLLs en el mismo, estas tambien se cargarán.

Saludos!
En línea

MCKSys Argentina

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

paulagarcum

Desconectado Desconectado

Mensajes: 55


Ver Perfil
Re: Carga de DLLs Forward
« Respuesta #4 en: 7 Noviembre 2013, 00:33 am »

¡¡Muy bueno!! Gracias por tu respuesta MCKSys Argentina. Me has aclarado finalmente.

Mira, (mirad), he hecho la prueba con este programilla ASM:

;------------------------------------------------------------------------------
.386p
.model flat

extrn   LoadLibraryA: proc
extrn   GetProcAddress: proc
extrn   ExitProcess: proc


.data
kernel32            db   "KERNEL32.DLL", 0
funcion              db   "SetDefaultDllDirectories", 0

.code
@inicio:   push   offset kernel32
               call      LoadLibraryA
         
               push     offset funcion
               push   eax
               call      GetProcAddress

               push     200h
               call      eax ; llama a SetDefaultDllDirectories

               push   0
               call      ExitProcess

               end     @inicio
;------------------------------------------------------------------------------

La API SetDefaultDllDirectories está declarada en la DLL Kernel32.dll
Sin embargo está forwarded y está implementada en la API API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL (Windows 7)

Cuando el programilla EXE se carga, el Loader de Windows carga la Kernel32.dll ya que el EXE importa 3 funciones de ella: LoadLibraryA, GetProcAddress y ExitProcess. Aún así, quizás de forma redundante, el propio programa vuelve a cargar la Kernel32.dll al inicio.

Cuando el programilla se ejecuta y llama a la función SetDefaultDllDirectories, (call  eax), la llamada se hace correctamente y todo va ok.
Eso permite concluir que como decía MCKSys Argentina, al llamar a LoadLibrary, se carga no sólo la DLL que se le pasa, sino todas las demás DLLs que son importadas por la primera. O sea, se carga API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL, ya que es importada por la Kernel32.dll.
(yo no había importado a mano  API-MS-WIN-CORE-LIBRARYLOADER-L1-1-0.DLL)

Gracias de nuevo MCKSys. Saludo a todos.
« Última modificación: 7 Noviembre 2013, 01:01 am por paulagarcum » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Guaranteeing Forward Progress
Programación C/C++
wachi 0 1,620 Último mensaje 6 Marzo 2012, 16:49 pm
por wachi
Duda teórica. Iptables INPUT y FORWARD
Redes
‭lipman 4 4,368 Último mensaje 26 Junio 2012, 01:11 am
por ‭lipman
Perfect Forward Secrecy, el futuro de los cifrados de red
Noticias
wolfbcn 0 1,707 Último mensaje 12 Enero 2014, 14:08 pm
por wolfbcn
Forward http/s request.
Hacking
xustyx 4 3,571 Último mensaje 30 Julio 2014, 18:47 pm
por xustyx
IP Forward e Iptables papel y funcionamiento, cuál es?
Redes
Alenge 2 2,587 Último mensaje 16 Agosto 2015, 06:52 am
por Alenge
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines