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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  WH_CALLWNDPROC llamada de forma rara
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: WH_CALLWNDPROC llamada de forma rara  (Leído 1,797 veces)
patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
WH_CALLWNDPROC llamada de forma rara
« en: 8 Julio 2015, 01:18 am »

Hola estuve probando cositas y en este codigo:

Código
  1. //Main.cpp
  2. typedef void(_MakeHook)(DWORD threadID, int dlgID);
  3.  
  4. int _tmain(int argc, _TCHAR* argv[])
  5. {
  6. HWND hwnd = FindWindow("wxWindowNR", "FileZilla");
  7. if (hwnd == 0){
  8. printf("FileZilla not found\n");
  9. getchar();
  10. return 0;
  11. }
  12.  
  13. HMODULE library = LoadLibrary("C:\\Users\\User\\Documents\\Visual Studio 2013\\Projects\\stealPwDll_real\\x64\\Debug\\stealPwDll_dll.dll");
  14. if (library == NULL){
  15. printf("error library %d\n",GetLastError());
  16. }
  17. _MakeHook * MakeHook = (_MakeHook *)GetProcAddress(library, "MakeHook");
  18. if (MakeHook == 0){
  19. printf("getpw error\n");
  20. }
  21. MakeHook(GetWindowThreadProcessId(hwnd, 0), 0xFFFF83C4);
  22.  
  23. MSG msg;
  24. while (!GetMessage(&msg, 0, 0, 0)){
  25. TranslateMessage(&msg);
  26. DispatchMessage(&msg);
  27. }
  28.  
  29. getchar();
  30. return 0;
  31. }


Código
  1. //Código del main_dll.cpp
  2. #include <Windows.h>
  3. #include "main.h"
  4. #include <stdio.h>
  5.  
  6. #pragma warning(disable:4996)
  7.  
  8. HMODULE hmodule;
  9. HHOOK hook;
  10. bool msgSend = false;
  11. int g = 0;
  12.  
  13. BOOL WINAPI DllMain(HMODULE hmodule,DWORD reason,LPVOID){
  14. if (reason == DLL_PROCESS_ATTACH){
  15. ::hmodule = hmodule;
  16. }
  17. return 1;
  18. }
  19.  
  20.  
  21.  
  22.  
  23. void MakeHook(DWORD id, int dlgID){
  24. hook = SetWindowsHookEx(WH_CALLWNDPROC, getPw, hmodule, id);
  25. if (hook == NULL){
  26. char msg[100];
  27. sprintf(msg, "Hook error -> %d", GetLastError());
  28. MessageBox(0, msg, "Hook error", MB_ICONERROR);
  29. }
  30. }
  31.  
  32.  
  33. LRESULT CALLBACK getPw(int code,WPARAM wparam,LPARAM lparam){
  34. if (code != HC_ACTION){
  35. return (CallNextHookEx(hook, code, wparam, lparam));
  36. }
  37. else if(!wparam){
  38. if (!msgSend){
  39. g++;
  40. char msg[100];
  41. sprintf(msg, "%d", g);
  42. MessageBox(0, "Not current thread call", msg, MB_ICONINFORMATION); //  ----------- Parte rara --------
  43. msgSend = true;
  44. }
  45. }
  46. return 1;
  47. }

Si utilizo el código del main_dll.cpp me muestra 30 MessageBox empezando desde g = 30
Si cambio el código:
Código
  1. LRESULT CALLBACK getPw(int code,WPARAM wparam,LPARAM lparam){
  2. if (code != HC_ACTION){
  3. return (CallNextHookEx(hook, code, wparam, lparam));
  4. }
  5. else if(!wparam){
  6. if (!msgSend){
  7. msgSend = true; // ----- Parte cambiada -> msgSend = true; sube primero
  8. g++;
  9. char msg[100];
  10. sprintf(msg, "%d", g);
  11. MessageBox(0, "Not current thread call", msg, MB_ICONINFORMATION);
  12.  
  13. }
  14. }
  15. return 1;
  16. }

Me muestra solo un MessageBox como debe ser.

Porque???

Un saludo


« Última modificación: 14 Agosto 2015, 13:44 pm por patilanz » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #1 en: 8 Julio 2015, 01:35 am »

Solo por si acaso, ¿despues del MessageBox se sigue ejecutando código? Pon otro MessageBox a ver.


En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #2 en: 8 Julio 2015, 01:39 am »

Solo por si acaso, ¿despues del MessageBox se sigue ejecutando código? Pon otro MessageBox a ver.

Si, en ambos casos (msgSend primero y ultimo).
En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #3 en: 8 Julio 2015, 01:41 am »

Sin palabras. Si encuentras la solución, coméntala :p
« Última modificación: 8 Julio 2015, 02:04 am por ivancea96 » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #4 en: 8 Julio 2015, 01:56 am »

¿Es posible que MessageBox() acabe provocando un timeout en el hook? Tengo entendido de que Windows 7 y en adelante eliminan hooks si se pasan del timeout. Puedes comprobarlo. Aunque no seguro que tenga que ver con eso.

Edito: A todo esto:

Código
  1. while (!GetMessage(&msg, 0, 0, 0))

GetMessage retorna 0 cuando obtiene el mensaje WM_QUIT.
« Última modificación: 8 Julio 2015, 02:40 am por ivancea96 » En línea

patilanz


Desconectado Desconectado

Mensajes: 481

555-555-0199@example.com


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #5 en: 8 Julio 2015, 11:33 am »

Ahora compruebo el timeout que me dijiste pero mientras pongo lo que estuve comprobando:

Código
  1. MessageBox(0, "data", "g++", 0);
  2. msgSend = true;
  3. g++;
  4. MessageBox(0, "data", "char msg[100]", 0);
  5. char msg[100];
  6. MessageBox(0, "data", "CWPSTRUCT *data = (CWPSTRUCT *)lparam;", 0);
  7. CWPSTRUCT *data = (CWPSTRUCT *)lparam;
  8. MessageBox(0, "data", "sprintf", 0);
  9.  
  10. sprintf(msg, "%d -> %x", g, data->message);
  11. MessageBox(0, msg, "Window title", 0);

Lo mismo que antes pero esta empieza desde 1 hasta 30 y el primer conjunto de  dialogboxes siempre se buquea y se queda sin texto como si msg estuviera vació. (Esto también pasaba antes)

Si pongo el msgSend antes de un messagebox todo perfecto.
Luego hice un log en un txt:

Código
  1. LRESULT CALLBACK getPw(int code,WPARAM wparam,LPARAM lparam){
  2. if (code != HC_ACTION){
  3. return (CallNextHookEx(hook, code, wparam, lparam));
  4. }
  5. else if(!wparam){
  6. if (!msgSend){
  7. if (file == NULL){
  8. file = fopen("holaholahola", "w");
  9. }
  10. w("\n\n ---- New call ----");
  11. w("g++");
  12. MessageBox(0, "data", "g++", 0);
  13. g++;
  14. w("char msg[100]");
  15. MessageBox(0, "data", "char msg[100]", 0);
  16. char msg[100];
  17. w("CWPSTRUCT *data = (CWPSTRUCT *)lparam;");
  18. MessageBox(0, "data", "CWPSTRUCT *data = (CWPSTRUCT *)lparam;", 0);
  19. CWPSTRUCT *data = (CWPSTRUCT *)lparam;
  20. w("sprintf");
  21. MessageBox(0, "data", "sprintf", 0);
  22.  
  23. sprintf(msg, "%d -> %x", g, data->message);
  24. w("msgSend = true;");
  25. MessageBox(0, msg, "MsgSend", 0);
  26. msgSend = true;
  27.  
  28. }
  29. }
  30. return 1;
  31. }
  32.  
  33. void w(char *str){
  34. fwrite(str, 1, strlen(str), file);
  35. fwrite("\n", 1, 2, file);
  36. fflush(file);
  37. }

Resultado:

Citar

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 

 ---- New call ----
 g++
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 char msg[100]
 CWPSTRUCT *data = (CWPSTRUCT *)lparam;
 sprintf
 msgSend = true;
 

@Edit: Usando el debugger while (!GetMessage(&msg, 0, 0, 0)) nunca entra en el bucle ni al pulsar al botón X de cerrar la consola.

@Editx2: Cambie el código para comprobar si el hook sigue activo y parece que no:

Código
  1. LRESULT CALLBACK getPw(int code,WPARAM wparam,LPARAM lparam){
  2. if (code != HC_ACTION){
  3. return (CallNextHookEx(hook, code, wparam, lparam));
  4. }
  5. else if(!wparam){
  6. if (!msgSend){
  7. if (file == NULL){
  8. file = fopen("holaholahola", "w");
  9. }
  10. w("\n\n ---- New call ----");
  11. ...
  12. msgSend = true;
  13. }
  14. else{
  15. CWPSTRUCT *data = (CWPSTRUCT *)lparam;
  16. if (data->message == WM_LBUTTONDOWN){
  17. MessageBox(0, "El hook sigue activo", "Buenos dias senior X!!", 0);
  18. }
  19. }
  20. }
  21. return 1;
  22. }

Después de los dialogbox del principio espero unos segundos y pulso con el ratón pero el evento parce que no se recibe porque no se muestra el dialogbox
« Última modificación: 8 Julio 2015, 11:41 am por patilanz » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #6 en: 8 Julio 2015, 14:11 pm »

Lo único que se me ocurre es que se llame 30 veces 30 hilos diferentes, y todos invoquen el MessageBox. Luego, cuando empiezas a cerrarlos, finalmente siguen y terminen los threads.

Haz una prueba: en vez de "g++" y " char msg[100]", saca al archivo "1 -> " + threadID y "2 -> " + threadID.

Si la teoría es cierta, el primer mensaje tendrá el mismo ID que el primer mensaje del segundo conjunto, y etc.
En línea

x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: WH_CALLWNDPROC llamada de forma rara
« Respuesta #7 en: 9 Julio 2015, 05:57 am »

Eso es un efecto de un mal diseño. patilanz, No sé que exactamente queres hacer pero llamando a alguna funcion sincronica del SO en un callback de mensajes es mala idea. Mejor deberias de decir qué es lo que quieres hacer.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
La forma facil o la forma dificil?
Java
fguzman31 1 1,899 Último mensaje 21 Septiembre 2014, 05:16 am
por ~ Yoya ~
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines