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

 

 


Tema destacado: (TUTORIAL) Aprende a emular Sentinel Dongle By Yapis


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

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Tutorial: Crear un parche 1 (desde otro proceso)
« en: 6 Marzo 2013, 04:09 am »

NIVEL: Beginner
La continuación de este tutorial:
http://foro.elhacker.net/programacion_cc/tutorial_crear_un_parche_1-t384060.0.html

En este caso contamos con 2 ejecutables .EXE ;
dummy.EXE va a ser el proceso víctima y parche1_externo.EXE
va a ser el proceso atacante, por decirlo así..


Cuando se abre el 2do ejecutable mencionado, el proceso atacante queda a la espera de encontrar al proceso víctima.








Dummy.EXE
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.  

parche1_externo.EXE
Código
  1.  
  2. //
  3. // By 85
  4. // GetModuleBase (googleada en 5 segundos XD)
  5. // elhacker.net
  6. // etalking.com.ar
  7. // 2013
  8. //
  9.  
  10. ///////////////////
  11.  
  12. #include<windows.h>
  13. #include<stdio.h>
  14. #include<tlhelp32.h>
  15.  
  16. //////////////////////
  17.  
  18. HANDLE hProcess;  
  19. HANDLE hModule;
  20. DWORD dwPatchPlace = 0x00000000;
  21. BYTE Opcode_JZ = 0x74;
  22. BYTE Opcode_JNZ = 0x75;
  23. BYTE pReaden;
  24.  
  25. ///////////
  26.  
  27. VOID Patch() {
  28.  
  29. // printf("0x%X\n",pReaden);
  30. // system("pause");
  31.  
  32. if(!hProcess) return;
  33. if(pReaden!=Opcode_JZ) return;
  34.  
  35. DWORD dwOldProtect;
  36.    VirtualProtect( (LPVOID)dwPatchPlace,
  37.                    1,
  38.                    PAGE_EXECUTE_WRITECOPY,
  39.                    &dwOldProtect );
  40.  
  41.    WriteProcessMemory( hProcess,
  42.                        (LPVOID)dwPatchPlace,
  43.                        &Opcode_JNZ,
  44.                        1,
  45.                        NULL );
  46.  
  47.    VirtualProtect( (LPVOID)dwPatchPlace,
  48.                    1,
  49.                    dwOldProtect,
  50.                    &dwOldProtect );
  51. }
  52.  
  53. //
  54. ////////////////////
  55.  
  56. DWORD GetModuleBase(LPSTR lpModuleName, DWORD dwProcessId)
  57. {
  58.   MODULEENTRY32 lpModuleEntry = {0};
  59.   HANDLE hSnapShot = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, dwProcessId );
  60.  
  61.   if(!hSnapShot)
  62.      return NULL;
  63.   lpModuleEntry.dwSize = sizeof(lpModuleEntry);
  64.   BOOL bModule = Module32First( hSnapShot, &lpModuleEntry );
  65.   while(bModule)
  66.   {
  67.   //printf("%s\n",lpModuleEntry.szModule);
  68.      if(!strcmp( lpModuleEntry.szModule, lpModuleName ) )
  69.      {
  70.         CloseHandle( hSnapShot );
  71.         return (DWORD)lpModuleEntry.modBaseAddr;
  72.      }
  73.      bModule = Module32Next( hSnapShot, &lpModuleEntry );
  74.   }
  75.   CloseHandle( hSnapShot );
  76.   return NULL;
  77. }
  78.  
  79. int main(){
  80.  
  81. // We have to replace JZ with JNZ.
  82.  
  83. //TODO: Obtener privilegios
  84. //
  85.  
  86. char l_exe[] = {'d','u','m','m','y','.','e','x','e',0};
  87. char l_window[] = {'D','u','m','m','y',0};
  88. HWND hwnd;          
  89. hwnd = FindWindow(0, l_window);    
  90. if (!hwnd)    
  91. {        
  92. printf("Abre %s ahora.\n", l_exe);        
  93. while (1)      
  94. {            
  95. Sleep(1000);            
  96. hwnd = FindWindow(0, l_window);            
  97. if (hwnd) break;
  98. if (GetAsyncKeyState(VK_END)>0) ExitProcess(45);
  99. }            
  100. }
  101.  
  102. unsigned long pid;    
  103. GetWindowThreadProcessId( hwnd, &pid);    
  104. // hProcess=OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_QUERY_INFORMATION,0,pid);
  105. // hProcess=OpenProcess(PROCESS_VM_WRITE|PROCESS_VM_OPERATION,0,pid);
  106. hProcess=OpenProcess(PROCESS_ALL_ACCESS,0,pid);
  107.  
  108. HANDLE baseAddress = (HANDLE)GetModuleBase(l_exe, pid);
  109. if(!baseAddress)
  110. {
  111. printf("No se obtubo la baseAddress!\n");
  112. system("pause");
  113. ExitProcess(45);
  114. }
  115.  
  116. //Lugar del parche
  117. dwPatchPlace=(DWORD)baseAddress;
  118. dwPatchPlace+=0x00001000;
  119. dwPatchPlace+=0x6C;
  120.  
  121. //Logs
  122. printf("hProcess: 0x%X\n",hProcess);
  123. printf("pid: %d\n",pid);
  124. printf("dwPatchPlace: 0x%X\n",dwPatchPlace);
  125. // printf("0x%X\n",*(PBYTE)dwPatchPlace);//No se puede hacer esto para otro proceso
  126. if(ReadProcessMemory(hProcess,(void*)(dwPatchPlace),&pReaden,sizeof(pReaden),0))
  127. {
  128. printf("Lugar antes de parchear: 0x%X\n",pReaden);
  129. }
  130. else
  131. printf("ReadProcessMemory failed: %d\n",GetLastError());
  132.  
  133. system("pause");
  134.  
  135. //Se procede a parchear el proceso objetivo
  136. Patch();
  137.  
  138. if(ReadProcessMemory(hProcess,(void*)(dwPatchPlace),&pReaden,sizeof(pReaden),0))
  139. {
  140. printf("Lugar luego de parchear: 0x%X\n",pReaden);
  141. }
  142. else
  143. printf("ReadProcessMemory failed: %d\n",GetLastError());
  144.  
  145.  
  146. CloseHandle(hProcess);
  147. system("pause");
  148. return 0;
  149. }
  150.  
  151. //
  152.  

La finalidad es la misma que la primer parte del tutorial, es decir parchear un OPCODE en la memoria del proceso víctima. Las novedades son que se hizo desde otro proceso por lo que SI se tuvo que usar ReadProcessMemory y WriteProcessMemory (Sin mencionar las otras API's).

Para detectar si la ventana del proceso víctima se encuentra abierta se ha usado FindWindow.

Para obtener un manejador (handle) del proceso víctima usamos OpenProcess.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684320(v=vs.85).aspx

Algo también que van a querer saber:
Citar
To open a handle to another local process and obtain full access rights, you must enable the SeDebugPrivilege privilege. For more information, see Changing Privileges in a Token.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms717797(v=vs.85).aspx

y conocer los posibles derechos de acceso a un proceso:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684880(v=vs.85).aspx

Al terminar las operaciones se debe cerrar el handle del proceso.

Sobre la forma de buscar los procesos activos, se usó la función googleada 'GetModuleBase' que utiliza TOOLHELP32, para obtener la dirección base:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms686832(v=vs.85).aspx

Recuerden que son dos procesos separados con sus espacios de direcciones respectivos, por lo cual se requiere ReadProcessMemory para leer la memoria de otro proceso, y para modificarla, WriteProcessMemory.

O sea que algo como esto:
Código:
printf("0x%X\n",*(PBYTE)dwPatchPlace);//No se puede hacer esto para otro proceso

No sirve porque la dirección guardada en dwPatchPlace es del proceso víctima, no del proceso atacante.
Por eso se pasa como parámetro a ReadProcessMemory.

Si quieren saber como obtener su propia 'dwPatchPlace' de un programa cualquiera, van a tener que desensamblarlo (mejor si no está protegido) o en otro caso depurarlo en funcionamiento con un depurador como el OllyDBG.
Es decir, el tutorial da por sabido que cada uno ya sabe lo que quiere parchear y adonde debe parchear. El tutorial apunta a cómo se parchea.

Disculpen si faltan cosas en este humilde tutorial, pero es para beginners por lo tanto si faltan cosas pueden aportarlas  ;D.

Proyecto vc6: http://www.mediafire.com/?8a65cuufh2dd4um


« Última modificación: 6 Marzo 2013, 04:26 am 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
Desde un exe crear otro
Programación Visual Basic
Tyrz 9 2,879 Último mensaje 1 Mayo 2007, 19:51 pm
por Tyrz
como hacer que un proceso ejecutado por otro proceso no sea hijo
Programación General
z_ane_666 0 2,046 Último mensaje 8 Diciembre 2011, 02:36 am
por z_ane_666
como hacer que un proceso ejecutado por otro proceso no sea hijo
Programación C/C++
z_ane_666 2 3,455 Último mensaje 9 Diciembre 2011, 15:24 pm
por z_ane_666
Tutorial: Crear un parche 1
Programación C/C++
85 2 3,288 Último mensaje 27 Febrero 2013, 03:36 am
por 85
Tutorial: Crear un parche 2 (Inyección de DLL)
Programación C/C++
85 0 3,412 Último mensaje 16 Marzo 2013, 10:27 am
por 85
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines