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

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [C] Hook en DLL
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [C] Hook en DLL  (Leído 4,870 veces)
calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
[C] Hook en DLL
« en: 16 Septiembre 2011, 15:53 pm »

Buenas a todos nuevamente. Estoy haciendo una DLL normal en C, la cual inyecto a un programa. Tengo que hookear una parte del programa el cual tengo el hwnd e interceptar un mensaje. Qué función debería usar para instalar el hook? SetWindowLong? Podrían dejarme algún ejemplo?

Gracias!


En línea

naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: [C] Hook en DLL
« Respuesta #1 en: 17 Septiembre 2011, 05:48 am »

SetWindowLongPtr

Con la DLL una vez inyectada puedes hacer esto teniendo el handle de la ventana.

Código
  1. WNDPROC default_procedure;
  2. LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
  3.  
  4. int main(){
  5. HWND hwnd = 0;
  6. default_procedure = (WNDPROC)SetWindowLongPtr(hwnd, GWLP_WNDPROC, (LONG)hook);
  7. }
  8.  
  9. LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
  10. // Haces tu trabajo...
  11.  
  12. return CallWindowProc(default_procedure, hwnd, message, wParam, lParam);
  13. }
  14.  


En línea

calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: [C] Hook en DLL
« Respuesta #2 en: 17 Septiembre 2011, 14:59 pm »

Gracias! Me sirve un montón esto. Mira como a quedado mi código:

Código:
WNDPROC default_procedure;
LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
 
int main(){
HWND hwnd = 590396;
default_procedure = (WNDPROC)SetWindowLongPtr(hwnd, WM_SETTEXT, (LONG)hook);
}
 
LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
// Haces tu trabajo...
    MessageBox (0, "Message Detected", "DLL", MB_ICONINFORMATION);
 
return CallWindowProc(default_procedure, hwnd, message, wParam, lParam);
}

Pero al compilar me da un error, sobre el "HWND hwnd = 590396;". El error es: "[Warning] initialization makes pointer from ineteger without a cast". Que estoy haciendo mal?

Gracias nuevamente :)
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [C] Hook en DLL
« Respuesta #3 en: 17 Septiembre 2011, 15:04 pm »

Ahi te lo dice claramente, tenes que hacer un casting

Código:
HWND hwnd = (HWND)590396;

Igual eso no sirve, el HWND cambiara con cada ejecucion asi que tenes que conseguir un metodo para encontrar la ventana en tiempo de ejecucion ...

PD. Las DLLs tienen DllMain y no main.
En línea

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
calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: [C] Hook en DLL
« Respuesta #4 en: 17 Septiembre 2011, 15:52 pm »

Ahi te lo dice claramente, tenes que hacer un casting

Código:
HWND hwnd = (HWND)590396;

Igual eso no sirve, el HWND cambiara con cada ejecucion asi que tenes que conseguir un metodo para encontrar la ventana en tiempo de ejecucion ...

PD. Las DLLs tienen DllMain y no main.

Gracias. El hwnd lo puedo obtener en cada ejecución de forma automática eso no es problema. Ya puse para que haga el hook en el hwnd indicado al cargarse la DLL. Pero aún así sigue sin interceptar el mensaje... hay algún error en donde indiqué el mensaje o el hwnd? Ya que creo que esta todo bien pero no me avisa al interceptar el mensaje WM_SETTEXT como debería hacerlo. También probé con WM_MOUSEMOVE y otros, pero tampoco funciona. Te dejo mi código:

Código:
WNDPROC default_procedure;
LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )

{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        HWND hwnd = (HWND)590396;
        default_procedure = (WNDPROC)SetWindowLongPtr(hwnd, WM_MOUSEMOVE, (LONG)hook);

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}

LRESULT CALLBACK hook(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam){
        // Haces tu trabajo...
        MessageBox (0, "Message Detected", "DLL", MB_ICONINFORMATION);
        return CallWindowProc(default_procedure, hwnd, message, wParam, lParam);
}

En este caso usé la constante WM_MOUSEMOVE

Gracias :)
« Última modificación: 17 Septiembre 2011, 16:20 pm por calk9 » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [C] Hook en DLL
« Respuesta #5 en: 17 Septiembre 2011, 17:55 pm »

A SetWindowLongPtr no le pasas un mensaje en particular: tenes que usar GWLP_WNDPROC.

http://msdn.microsoft.com/en-us/library/ms644898%28v=vs.85%29.aspx

GWLP_WNDPROC Sets a new address for the window procedure.
En línea

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
calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: [C] Hook en DLL
« Respuesta #6 en: 17 Septiembre 2011, 18:41 pm »

Pues me quedaría GWLP_WNDPROC en nIndex donde tengo WM_MOUSEMOVE. Donde es que debería poner el mensaje que quiero interceptar?

Gracias.
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [C] Hook en DLL
« Respuesta #7 en: 17 Septiembre 2011, 19:11 pm »

En la funcion hook donde tenes el parametro message ... tenes que comprender que hace tu codigo, estas reemplazando el procedimiento de la ventana, lee la documentacion.
En línea

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
calk9

Desconectado Desconectado

Mensajes: 69


Ver Perfil
Re: [C] Hook en DLL
« Respuesta #8 en: 17 Septiembre 2011, 20:01 pm »

¡Gracias!  ;-) Ya pude capturar el mensaje con una simple condición "if".

Suerte  :D
En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.966


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: [C] Hook en DLL
« Respuesta #9 en: 17 Septiembre 2011, 20:19 pm »

De nada  ::)
En línea

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
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
VEH Api Hook
Análisis y Diseño de Malware
bizco 9 8,884 Último mensaje 10 Junio 2012, 01:39 am
por pipaman
api hook
Programación Visual Basic
Cromatico 7 5,898 Último mensaje 21 Marzo 2011, 18:52 pm
por ntaryl
VB6 Hook Api
Programación Visual Basic
philipjfry99 0 2,782 Último mensaje 19 Marzo 2011, 23:51 pm
por philipjfry99
Sabeis por que no se crea el hook?. codedom compileinmemory
.NET (C#, VB.NET, ASP)
70N1 1 2,461 Último mensaje 2 Febrero 2012, 17:27 pm
por 70N1
Hook al mouse [C++]
Programación C/C++
carbon1 0 1,515 Último mensaje 27 Julio 2012, 19:07 pm
por carbon1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines