Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Keyen Night en 16 Abril 2011, 05:42 am



Título: Inyección de Codigo para API Hook
Publicado por: Keyen Night en 16 Abril 2011, 05:42 am
LLevo no mucho tiempo programando en C++ estoy intentando hacer un hook por inyección de código, tengo el código que inyecta código directamente en un proceso y tengo la funciones que hacen un hook por tramplín a una función (API). Quisas este equivocado o suene ignorante XD soy nuevo con los hook y estas cosas quisiera que me corrigieran si estoy equivocado, mi pregunta es: ¿debo inyectar en el proceso externo las funciones que se encargan del hook?, quiero decir para que el proceso externo ejecute el mismo la función que hookea el API. Pero no entiendo como hacerlo llevo horas y me tiene confundido :-X si me pudiesen hechar una mano solo darme el camino para seguir estaria agredecido. Les dejo los sources:

Hook por Trampolín (Ejemplo en el mismo Proceso)
Código
  1. #include <windows.h>
  2. #include <stdio.h>
  3.  
  4. DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup);
  5. BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup);
  6. int Hooked_MessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType);
  7.  
  8. BYTE BackUp[6];
  9.  
  10. LPCSTR Function = "MessageBoxExA";
  11.  
  12. void WinMainCRTStartup()
  13. {
  14.  
  15. MessageBoxA(0, "=( Sin Hook", "", MB_OK); // Mensaje
  16.  
  17. HookFunction("user32.dll", Function, Hooked_MessageBox, BackUp); // Hookear Función
  18.  
  19. MessageBoxA(0, "=( Sin Hook", "", MB_OK); // Mensaje
  20.  
  21. }
  22.  
  23. int Hooked_MessageBox(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) // Función a la que se desvia la función original
  24. {
  25. UnHookFunction("user32.dll", Function, BackUp); // Se llama a la función UnHook para evitar la recursividad
  26.  
  27. int x = MessageBoxA(hWnd, "=) Hooked", lpCaption, uType); // Se llama la función original
  28.  
  29. HookFunction("user32.dll", Function, Hooked_MessageBox, BackUp); // Se aplica el Hook nuevamente
  30. return x; // Se retorna el resultado de la función original
  31. }
  32.  
  33. DWORD HookFunction(LPCSTR lpModule, LPCSTR lpFuncName, LPVOID lpFunction, unsigned char *lpBackup) // Función que realiza el Hook al API
  34. {
  35. DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName); // Obtiene la dirección de la API
  36.       // Array de opcodes en lenguaje de maquina (ASM) para desviar la función
  37. BYTE jmp[6] = { 0xe9, //jmp
  38. 0x00, 0x00, 0x00, 0x00, //address
  39. 0xc3
  40. }; //retn
  41.  
  42. ReadProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0); // Se guardan los primeros 6 bytes de la función
  43.  
  44. DWORD dwCalc = ((DWORD)lpFunction - dwAddr - 5); // ( to - from) - 5 // Se calcula la posición donde se escribira el salto
  45.  
  46. memcpy(&jmp[1], &dwCalc, 4); // Se copia en memoria el salto
  47.  
  48. WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, jmp, 6, 0); // Se escribe en memoria los 6 bytes del salto
  49.  
  50. return dwAddr; // Se retorna la dirección del API
  51. }
  52.  
  53. BOOL UnHookFunction(LPCSTR lpModule, LPCSTR lpFuncName, unsigned char *lpBackup) // Función que retira el Hook de la API
  54. {
  55. DWORD dwAddr = (DWORD)GetProcAddress(GetModuleHandle(lpModule), lpFuncName); // Se obtiene la dirección de la API
  56.  
  57. if (WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwAddr, lpBackup, 6, 0)) // Si se logra escribir los bytes guardados en la función HookFunction
  58. {
  59. return TRUE; // Se retorna TRUE
  60. }
  61. return FALSE; // Sino entonces se retorna FALSE
  62. }
  63.  

Inyecta código en un proceso externo (Ejemplo hacer que un proceso externo ejecute un MessageBox)
Código
  1. #include <windows.h>
  2. #include <tlhelp32.h>
  3. #include <stdio.h>
  4.  
  5. //Creamos un puntero a la api que queremos inyectar
  6. typedef int (WINAPI *datMessageBoxA) (HWND, LPCTSTR, LPCTSTR, UINT);
  7.  
  8. //La estructura que inyectaremos
  9. struct datos
  10. {
  11. datMessageBoxA apiMessageBoxA;
  12. char titulo  [20];
  13. char mensaje [20];
  14. };
  15.  
  16. //Declaración de funciones
  17. DWORD GetAdres(char *module, char *function);
  18.  
  19. //La función que inyectaremos
  20. DWORD inyectada (datos *data)
  21. {
  22. data -> apiMessageBoxA (0, data->mensaje, data->titulo, 0);
  23. return 0;
  24. }
  25.  
  26. //La función inyectora
  27. void inyectora()
  28. {
  29. int      pid;          // Este es el pid del proceso en el que nos queremos inyectar
  30. HANDLE  proc;        // El handle del proceso en el que inyectaremos
  31. datos    dat;          // El tipo de dato de la estructura
  32. DWORD    TamFun;      // El tamaño de la función a inyectar
  33. void*    esp;          // Lugar de memoria donde copiaremos nuestra función
  34.  
  35. HANDLE handle = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); //Obtenemos el pid
  36. PROCESSENTRY32 procinfo = { sizeof(PROCESSENTRY32) };
  37. while(Process32Next(handle, &procinfo))
  38. {
  39.  if(!strcmp(procinfo.szExeFile, "APIHOOK.exe"))
  40.  {
  41.      CloseHandle(handle);
  42.    pid = procinfo.th32ProcessID;
  43.  }
  44. }
  45. CloseHandle(handle);
  46.  
  47. //Abrimos el proceso en el que nos inyectaremos
  48. proc = OpenProcess(PROCESS_ALL_ACCESS, false, pid);
  49.  
  50. //Metemos la dirección de la api en la estructura llamando a la función GetAdres
  51. dat.apiMessageBoxA = (datMessageBoxA) GetAdres ("USER32.DLL", "MessageBoxA");
  52.  
  53. //Inicializamos las variables que contendrán el mensaje
  54. sprintf(dat.mensaje,"Mensaje");
  55. sprintf(dat.titulo,"Texto");
  56.  
  57. //Reservamos espacio para nuestra estructura en el proceso a inyectar y la escribimos
  58. datos *dat_ = (datos*) VirtualAllocEx(proc, 0, sizeof(datos), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
  59. WriteProcessMemory(proc, dat_, &dat, sizeof(datos), NULL);
  60.  
  61. //Calculamos el tamaño de la función a inyectar
  62. TamFun = (long unsigned int) inyectora - (long unsigned int)inyectada;
  63.  
  64. //Reservamos espacio para la función, escribimos en él y creamos un hilo
  65. esp = VirtualAllocEx(proc, 0, TamFun, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  66. WriteProcessMemory(proc, esp, (void*)inyectada, TamFun, NULL);
  67. CreateRemoteThread(proc, NULL, 0, (LPTHREAD_START_ROUTINE) esp, dat_, 0, NULL);
  68. }
  69.  
  70. //La función main
  71. int main()
  72. {
  73. inyectora();
  74. system("pause>nul");
  75. return EXIT_SUCCESS;
  76. }
  77.  
  78. //Función que nos devuelve un DWORD con la dirección de una api
  79. DWORD GetAdres(char *module, char *function)
  80. {
  81. HMODULE dh = LoadLibrary(module);
  82. DWORD pf = (DWORD)GetProcAddress(dh,function);
  83. FreeLibrary(dh);
  84. return pf;
  85. }
  86.  


Título: Re: Inyección de Codigo para API Hook
Publicado por: Karman en 16 Abril 2011, 05:58 am
no podes hookear funciones de un proceso externo justamente porque es externo (otro espacio de memoria) para hookear algo tenes que estar en el mismo espacio de memoria... a lo sumo lo que podes hacer es (sin inyectar una dll) copiar el código a ejecutarse en el espacio de memoria del programa víctima y crear el hook en base a eso, pero sigue siendo más simple y efectivo la inyección, de todas formas, de lo otro creo que hay varios códigos en esta misma web, sino google.

S2


Título: Re: Inyección de Codigo para API Hook
Publicado por: Keyen Night en 16 Abril 2011, 06:06 am
Lo que quiero es la primera opción inyectar el código de las funciones para hacer hook pero me tiene confundido lo de las estructuras, entiendo el principio, debo inicializar todas las variables, funciones y otras cosas y copiar en el espacio de memoria del proceso externo para que el ejecute y se hookee el mismo, lo que necesito es el primer paso para inyectar las funciones que puse en el primer post al menos un ejemplo de como se inyecta HookFuncion.


Título: Re: Inyección de Codigo para API Hook
Publicado por: Karman en 16 Abril 2011, 08:07 am
te repito, es poco productivo y poco compatible (lo más probable es que solo funcione en el SO que lo crees), de todas formas, si quieres seguir indagando en el tema fijate este link:

http://www.infomalware.net/t62-inyeccion-de-codigo-sin-dll

es de un user de este foro y lo más probable (como ya lo mensioné) es que esté publicado tb en este foro... ( hoo buscador, si te usaran! )

S2


Título: Re: Inyección de Codigo para API Hook
Publicado por: Keyen Night en 16 Abril 2011, 19:38 pm
Con respecto a la segunda forma que dijistes te refieres a inyección de DLL o a otra forma de hacer el hook inyectando código?


Título: Re: Inyección de Codigo para API Hook
Publicado por: Karman en 16 Abril 2011, 23:03 pm
Con respecto a la segunda forma que dijistes te refieres a inyección de DLL o a otra forma de hacer el hook inyectando código?

creo que la inyección de una dll suele ser la mejor opción, te permite hacer modificaciones de ser necesario en forma simple entre otras cosas (además de que es más fácil de implementar), la inyección de código es más para "parcheo" (cracking).

S2