2010-01-26 21 views
8

¿Hay una forma rápida de enganchar un dll en C++? Sé que existe la cosa de Microsoft Detours, pero ¿no hay una forma rápida y sencilla de enganchar algunas funciones dll?C++ enganchando un dll?

Por ejemplo, quiero enganchar la función void mytestfunction() en el dll mytestdll.dll en hook_mytestfunction().

gracias de antemano!

+0

¿Está intentando conectar una DLL dentro de su propio proceso, o una DLL que se ha cargado en otro proceso? –

+0

las estrategias disponibles para enganchar todas las funciones que se utilizan en un dll son diferentes de las estrategias para enganchar solo una de las funciones utilizadas. Las estrategias fuera de proceso son diferentes de las estrategias en proceso. ¿Podría darnos más detalles? –

+0

sí, intentando conectar un dll de otro proceso. algo similar, por ejemplo, sería como enganchar el archivo opengl32.dll e interceptar glBegin..glEnd y etc ... – enuree

Respuesta

3

desvíos es la manera rápida y sencilla!

+2

Excepto si desea trabajar en 64 bits, donde tiene que pagar una tarifa de licencia de 10k $ :( – CharlesB

3

Asumo si usted está conectando un archivo DLL que se está conectando las exportaciones de esa DLL?

En ese caso, se puede realizar una sencilla IAT (y potencialmente comer si es necesario) gancho. La ventaja de los ganchos IAT/EAT sobre Detours es que la aplicación y la eliminación de los ganchos es 100% segura (ya que no está reemplazando el código, está reemplazando un puntero, por lo que no hay posibilidad de una carrera). condición), y es fácil hacer los enganches en procesos x64 nativos también (que la biblioteca Detours de Microsoft no puede hacer a menos que desembolses 10 mil para la edición Prof).

Sí, hay bibliotecas de desvío de terceros que tienen soporte x64 y se ocupan de la mayoría de las condiciones de carrera y otras, pero algunas son realmente caras y otras son simplemente un dolor para trabajar.

Los ganchos IAT/EAT son rápidos y fáciles, y hay un código de muestra para realizarlos disponibles en el libro "Windows a través de C/C++" (junto con una multitud de lugares en las interwebs).

Esta es una respuesta bastante genérica que sé, pero es difícil entrar en más detalle sin más información sobre lo que está tratando de hacer exactamente.

4

Probablemente la manera más fácil es poner su propio contenedor DLL con el mismo nombre en el directorio del EXE, y poner una copia de la DLL enganchada en el mismo directorio con un nuevo nombre. Luego, en el IAT de su DLL contenedora, redirija cualquier llamada no interceptada a la DLL empaquetada (reenvío de exportación) e implemente las otras usted mismo.

Para redirigir funciones, ponga la siguiente línea en el archivo .def: Foo=wrapped_mytestdll.Foo donde foo es el nombre de la función (destrozado) y wrapped_mytestdll es el nuevo nombre de la DLL copiado.

Como resultado, el EXE afectada carga el contenedor DLL, ya su vez la DLL envueltos. Las funciones en su DLL contenedora tienen prioridad sobre la DLL empaquetada. Las únicas llamadas no interceptados son llamadas por la DLL envuelto a sí mismo, como aquellos que no pasan por el IAT.

(He encontrado desde a link to a tool para generar un archivo ".DEF" básico, pero no lo he probado yo mismo. Utilice bajo su propio riesgo.)

2

Simplemente llame a GetProcAddress (hDll, "mytestfunction") y escriba jmp hook_mytestfunction allí, luego coloque las instrucciones al inicio de mytestfunction en hook_mytestfunction.

Es muy rápido y fácil, por supuesto si lo entiendes. Si no lo hace, use MS Detours u otra biblioteca. Usualmente puedes hacerlo sin entender cómo funciona.