2008-10-21 26 views
11

Cómo interceptar las llamadas al método dll?Cómo interceptar las llamadas al método dll?

  • ¿Cuáles son las técnicas disponibles para ello?
  • ¿Se puede hacer solo en C/C++?
  • ¿Cómo se interceptan las llamadas a métodos de todos los procesos en ejecución a un dll determinado?
  • ¿Cómo se interceptan llamadas de método de un proceso dado a un dll determinado?
+0

¿Interceptar desde la aplicación que cargó el archivo DLL, o externamente? Externamente a un proceso específico, o a todos los procesos? ¡Podrías hacer un mejor trabajo al redactar tu pregunta! ;) – TheSoftwareJedi

+0

¿A qué idioma y plataforma de Windows desean dirigirse? –

Respuesta

0

En Linux, esto se puede hacer con la variable de entorno LD_PRELOAD. Establezca esta variable para que apunte a una biblioteca compartida que contenga un símbolo que desea anular, luego inicie su aplicación.

6

Siempre que conozca todas las funciones de DLL por adelantado, una técnica es escribir su propia DLL contenedora que reenviará todas las llamadas de función a la DLL real. Esta DLL no tiene que estar escrita en C/C++. Todo lo que necesita hacer es hacer coincidir la función de convención de llamada de la DLL original.

+0

Bien ... Pero, ¿cómo forzar los procesos en ejecución para llamar a mi dll en lugar del original? –

+2

Si coloca su archivo contenedor en la misma carpeta que el archivo ejecutable, el archivo ejecutable debe elegir su archivo DLL en lugar del que está en Windows/System32, etc. –

+0

¿Es cierto también para las DLL del sistema, es decir, user32.dll y amigos? – Demiurg

9

Hay dos formas estándar que se me ocurren para hacer esto

  • gancho DLL tabla de importación.
    Para esto necesita analizar el encabezado PE de la DLL, encontrar la tabla de importación y escribir la dirección de su propia función en lugar de lo que ya está escrito allí. Puede guardar la dirección de la función original para poder llamarla más tarde. Las referencias en los enlaces externos de este wikipedia article deben darle toda la información que necesita para poder hacer esto.

  • Modificación directa del código. Encuentre el código real de la función que desea enganchar y modifique los primeros códigos de operación para saltar a su propio código. necesita guardar el código de operación que estaba allí para que finalmente se ejecuten. Esto es más simple de lo que suena en su mayoría porque ya fue implementado por nada menos que los propios Microsoft en la forma de Detours library.
    Esto es algo realmente bueno de hacer. con solo un par de líneas de código puede, por ejemplo, reemplazar todas las llamadas a GetSystemMetrics() desde say outlook.exe y ver las maravillas que ocurren.

Las ventajas de un método son las desventajas del otro. El primer método le permite agregar un gancho quirúrgico exactamente a la DLL que desea donde se desenganchan todas las otras DLL. El segundo método le permite el tipo de gancho más global para interceptar todas las llamadas que realiza la función.

+0

¿No es esto un gran riesgo de seguridad? ¿Básicamente no le da a nadie la capacidad de hacer algo en una aplicación? – Micah

+0

Traté de modificar el código de una función, pero este fuego es un error de violación de acceso. ¿Hay algún detalle que deba ser arreglado antes? –

+0

Desvíos cuesta $ 10K OMG !!! –

2

Consulte Microsoft Detours para obtener una biblioteca con una API C/C++. No es trivial inyectarlo en todos los demás programas sin desencadenar virusscanners/detectores de malware. Pero tu propio proceso es un juego limpio.

Cuestiones relacionadas