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


 


Tema destacado: Deseas probar algunas mejoras a la interfaz del foro? Prueba cake! acerca de


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse)
| | |-+  Tutorial: Crear un parche 2 (Inyección de DLL)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Tutorial: Crear un parche 2 (Inyección de DLL)  (Leído 801 veces)
85

Desconectado Desconectado

Mensajes: 205



Ver Perfil WWW
Tutorial: Crear un parche 2 (Inyección de DLL)
« en: 16 Marzo 2013, 10:27 »

NIVEL: Beginner
Test: WinXP SP3

Considerando los tutoriales anteriores que no usaban una DLL,
http://foro.elhacker.net/programacion_cc/tutorial_crear_un_parche_1-t384060.0.html
http://foro.elhacker.net/programacion_cc/tutorial_crear_un_parche_1_desde_otro_proceso-t384798.0.html

... o bien la cargaban por medio de un LoadLibrary en el ejecutable víctima. En realidad, la mayoría de las veces nadie va a cargar nuestra DLL voluntariamente por lo que va a ser necesario forzar al proceso víctima a que la cargue, o también se puede hacer que el sistema operativo lo haga.
Podemos crear un cargador (Loader), y hacer lo que se conoce como inyección de DLL.

CreateRemoteThread
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437(v=vs.85).aspx
Con esta función podemos crear un hilo en un proceso víctima y hacer que se haga un  LoadLibrary de nuestra DLL.
Una cosa, esto es una técnica muy conocida y si la finalidad es hacer un hack lo que va a pasar es que cualquier antivirus o sistema de seguridad va a detectarlo. Por eso, esta creo que es la forma que más se conoce para cargar una DLL en un proceso víctima, pero no es ni la única ni la mejor.
Pero si la finalidad es cargar una DLL en algún proceso que no involucre por ejemplo, un sistema antitrampas, entonces no hay drama.

Los parámetros 4 y 5 de CreateRemoteThread son los que hacen evidente lo que pasa. Se le pasa la dirección de  LoadLibrary y luego una dirección en el proceso víctima en donde se ha escrito el nombre de nuestra DLL.
Es decir que cuando se ejecute el hilo en el proceso remoto va a ejecutarse LoadLibrary cargando nuestra DLL.
Fuera de esa explicación básica sólo queda dejar la información necesaria para hacer algo así:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366890(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366894(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms682437(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686736(v=vs.85).aspx

El código del inyector:
Código
  1.  
  2. //
  3. // By 85
  4. // elhacker.net
  5. // etalking.com.ar
  6. // 2013
  7. //
  8.  
  9. ///////////////////
  10.  
  11. #include<windows.h>
  12. #include<stdio.h>
  13. #include<tlhelp32.h>
  14.  
  15. //////////////////////
  16.  
  17. HANDLE hProcess;  
  18. typedef DWORD ((__stdcall*Add_t)(void *));//Typedef para el argumento 4 de CreateRemoteThread
  19.  
  20. /////////////////
  21.  
  22. bool fileExists(const char* filename)
  23. {
  24. WIN32_FIND_DATA finddata;
  25. HANDLE handle = FindFirstFile(filename,&finddata);
  26. return (handle!=INVALID_HANDLE_VALUE);
  27. }
  28.  
  29. //////////////////////////////////
  30.  
  31. int main(){
  32.  
  33. // We have to replace JZ with JNZ in another process.
  34.  
  35. const char* dll_name = "hack.dll\0";
  36. if(!fileExists(dll_name))
  37. {
  38. printf("La DLL no se encuentra!\n");
  39. system("pause");
  40. ExitProcess( 0 );
  41. }
  42. char l_exe[] = {'d','u','m','m','y','.','e','x','e',0};
  43. char l_window[] = {'D','u','m','m','y',0};
  44. HWND hwnd;          
  45. hwnd = FindWindow(0, l_window);    
  46. if (!hwnd)    
  47. {
  48. printf("El proceso objetivo debe estar corriendo!\n");
  49. system("pause");
  50. ExitProcess( 0 );            
  51. }
  52. Add_t AddLoadLibrary = (DWORD(__stdcall *)(void *))GetProcAddress(GetModuleHandle("kernel32"), "LoadLibraryA");
  53. unsigned long pid;    
  54. GetWindowThreadProcessId( hwnd, &pid);    
  55. HANDLE hProcess = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, false, pid);
  56. HANDLE hModule = VirtualAllocEx( hProcess, 0, sizeof(dll_name), MEM_COMMIT, PAGE_EXECUTE_READWRITE );
  57. WriteProcessMemory( hProcess, hModule, (LPVOID)dll_name, sizeof(dll_name), NULL );
  58. CreateRemoteThread( hProcess, NULL, 0, AddLoadLibrary, hModule, 0, NULL );
  59. CloseHandle( hProcess );
  60. VirtualFreeEx(hProcess, (LPVOID)hModule, 0, MEM_RELEASE);
  61.  
  62. //Los loaders deben generalmente cerrarse inmediatamente luego de cargar la dll en el proceso foráneo
  63. //ExitProcess( 0 );
  64. return 0;
  65. }
  66.  
  67. //////////////
  68.  

El código de la DLL atacante:
Código
  1.  
  2. //
  3. // By 85
  4. // elhacker.net
  5. // etalking.com.ar
  6. // 2013
  7. //
  8.  
  9. //////////////////////
  10.  
  11. #define WIN32_LEAN_AND_MEAN
  12. #include<windows.h>
  13. #include<stdio.h>
  14. #include<stdlib.h>
  15.  
  16. /////////////////////////////////////
  17.  
  18. DWORD dwPatchPlace = 0x00000000;
  19. BYTE Opcode_JZ = 0x74;
  20. BYTE Opcode_JNZ = 0x75;
  21.  
  22. ///////////
  23.  
  24. inline void Patch(){//Función de parche
  25.  
  26. if(*(PBYTE)dwPatchPlace!=Opcode_JZ) return;
  27.  
  28. DWORD dwOldProtect;
  29.    VirtualProtect( (LPVOID)dwPatchPlace,
  30.                    1,
  31.                    PAGE_EXECUTE_WRITECOPY,
  32.                    &dwOldProtect );
  33.  
  34. WriteProcessMemory( GetCurrentProcess(),
  35.                        (LPVOID)dwPatchPlace,
  36.                        &Opcode_JNZ,
  37.                        1,
  38.                        NULL );
  39.  
  40. VirtualProtect( (LPVOID)dwPatchPlace,
  41.                    1,
  42.                    dwOldProtect,
  43.                    &dwOldProtect );
  44. }
  45.  
  46. ////////////////////////
  47.  
  48. void Thread(void)
  49. {
  50. dwPatchPlace=(DWORD)GetModuleHandle(NULL);//Retorna la BaseAddress
  51.  
  52. //Sumamos el offset obtenido del desensamblado
  53. dwPatchPlace+=0x00001000;
  54. dwPatchPlace+=0x6C;
  55.  
  56. //Logs
  57. printf("\nYou have the DLL inside! (Frases memorables XD)\n");
  58. printf("0x%X\n",(DWORD)GetModuleHandle(NULL));
  59. printf("0x%X\n",dwPatchPlace);
  60. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  61. printf("\n");
  62. system("pause");
  63.  
  64. Patch();
  65. }
  66.  
  67. ///
  68. bool WINAPI DllMain(HINSTANCE, DWORD fdwReason, LPVOID)
  69. {
  70. if (fdwReason==DLL_PROCESS_ATTACH)
  71. {
  72. //Creamos un hilo local en el proceso objetivo (proceso local)
  73. CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)Thread, NULL, NULL, NULL );
  74. }
  75. return(true);
  76. }
  77.  
  78. //
  79.  

Y el código del programa ‘Dummy’:
Código
  1.  
  2. //
  3. // By 85
  4. // elhacker.net
  5. // etalking.com.ar
  6. // 2013
  7. //
  8.  
  9. ///////////////////
  10.  
  11. #include<windows.h>
  12. #include<stdio.h>
  13.  
  14. //////////////////////
  15. //////////////////////
  16.  
  17. DWORD dwPatchPlace = 0x00000000;
  18. BYTE Opcode_JZ = 0x74;
  19.  
  20. ///////////
  21. ////////////////////
  22.  
  23. void Target(){
  24.  
  25. while(1){
  26.  
  27.  
  28. #define MASTERNUM 85
  29. int master=0x99999997;
  30. char* ingreso = new char[256];
  31.  
  32. system("cls");
  33. printf("Ingrese la llave maestra\n");
  34. scanf("%s", ingreso);
  35.  
  36. if(!strcmpi(ingreso, new char[]= "key85\0")){
  37.  
  38. master = 85;
  39. }
  40.  
  41. delete []ingreso;
  42. if(master==MASTERNUM)
  43. {
  44. printf("FELICITACIONES! USTE HA INGRESADO\n");
  45. printf("\n");
  46. system("pause");
  47. break;
  48. }
  49.  
  50. // if(GetAsyncKeyState(VK_END)) break;// En otro hilo
  51. if(!strcmpi(ingreso, new char[]= "exit\0")) break;
  52. }
  53. }
  54.  
  55. //
  56. void Check()//Función que representa un método de seguridad
  57. {
  58. if(*(PBYTE)dwPatchPlace != Opcode_JZ)
  59. {
  60. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  61. printf("Memoria alterada!, se sale del programa..\n");
  62. printf("\n");
  63. system("pause");
  64. ExitProcess(45);
  65. }
  66. }
  67.  
  68. /////////
  69.  
  70. int main(){
  71.  
  72. SetConsoleTitle("Dummy");
  73.  
  74. dwPatchPlace=(DWORD)GetModuleHandle(NULL);//Retorna la BaseAddress
  75.  
  76. //Sumamos el offset obtenido del desensamblado
  77. dwPatchPlace+=0x00001000;
  78. dwPatchPlace+=0x6C;
  79.  
  80. //Logs
  81.  
  82. printf("LOG DE SEGURIDAD PRIMARIO:\n");
  83. printf("0x%X\n",(DWORD)GetModuleHandle(NULL));
  84. printf("0x%X\n",dwPatchPlace);
  85. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  86. printf("\n");
  87. system("pause");
  88.  
  89. //Llamamos a la función
  90. Target();
  91.  
  92. printf("LOG DE SEGURIDAD SECUNDARIO:\n");
  93. printf("0x%X\n",(DWORD)GetModuleHandle(NULL));
  94. printf("0x%X\n",dwPatchPlace);
  95. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  96. printf("\n");
  97. system("pause");
  98.  
  99. //Se deja que las comprobaciones de seguridad sigan su curso
  100. Check();
  101.  
  102. return 0;
  103. }
  104.  

Otras formas de cargar DLL’s:
AppInit_DLLs
Agregar o utilizar imports
DLL wrappers
DBG API
SetWindowsHookEX
Usar un driver (modo kernel)
Otras..

Project:
http://www.mediafire.com/?24yxijb4ce66jiv

Nota: La descarga no tiene virus, debe ser que se detecta el uso de CreateRemoteThread.

No iba a dejar imágenes pero dejo una que explica como se usan los archivos del ejemplo:


Por una cuestión de construcción, se debe abrir el programa 'dummy' en primer lugar y luego el inyector de DLL.

Saludos



« Última modificación: 16 Marzo 2013, 10:32 por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Parche de inyección/edición de tráfico desde Wireshark/Ethereal « 1 2 »
Hacking Wireless
axi 24 10,166 Último mensaje 21 Mayo 2007, 17:55
por JustSushi
Parche inyeccion
Hacking Wireless
j4np0l 5 818 Último mensaje 3 Mayo 2007, 13:16
por djdava
RT2500, wifislax 3.1, Parche Inyección, PWR=-1
Wireless en Linux
hispacoder 1 3,187 Último mensaje 25 Julio 2008, 11:19
por pianista
Tutorial: Crear un parche 1
Programación C/C++
85 2 866 Último mensaje 27 Febrero 2013, 03:36
por 85
Tutorial: Crear un parche 1 (desde otro proceso)
Programación C/C++
85 0 330 Último mensaje 6 Marzo 2013, 04:09
por 85
Powered by SMF 1.1.19 | SMF © 2006-2008, Simple Machines