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

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


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

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Tutorial: Crear un parche 1
« en: 25 Febrero 2013, 09:12 am »

Estaba mirando un tema acerca de como se pasaba por alto la detección de un anticheat y se me ocurrió la idea de mostrar como se puede hacer un parche básico dentro de un mismo proceso. Es decir tenemos un ejecutable, lo ejecutamos y parcheamos nuestra propia memoria. Esto se puede hacer de varias formas, una de ellas es inyectando una DLL , pero esto es algo más fácil :p

Cómo es una demostración el propio programa se parchea así mismo, por lo que necesitamos saber en que lugar vamos a querer modificar las cosas.
Para eso en el programa puse un bloque condicional que es el que me interesa parchear para poder accederlo aunque no se cumpla la condición.
Por Ejemplo:
Código:
if( 0 == 1){ /* no se cumple */ }
Eso no se cumple, pero parcheándolo se logra acceder de todas formas..

Con un desensamblador, abro el ejecutable (el archivo EXE) y procedo a mirar el código ensamblador.


Identifico el OPCODE que me interesa cambiar, en este caso es JZ (0x74), y procedo a obtener la posición en donde se encuentra (dirección de memoria).

Es 0x40106C

En realidad lo que nos interesa es saber el desplazamiento en bytes que hay desde la dirección base del ejecutable hasta el punto en el que queremos parchear.
Se puede tomar en cuenta la sección de código también pero no es la base del ejecutable, recordar al momento de hacer la cuenta..


Bueno el offset (desplazamiento) es 0x6C y 0x1000 de la sección de código.

Bueno sabiendo estas cosas, ya vamos al código..
Con respecto al código, como decía antes, la idea viene de algo que estaba mirando sobre llamadas seguras a funciones para evitar detecciones de un anticheat por ejemplo,,
Por eso fui a crear una función (Check()) que trata de ser en forma figurativa la detección de modificaciones en la memoria.
Aunque en realidad una función de este tipo no tiene mucho sentido en el mismo hilo de ejecución, se debería hacer desde otro..

Y otro concepto que se puede apreciar en todo esto, es la importancia de restaurar la memoria luego de modificarla y lograr lo deseado.
Por eso , en este programa luego de realizar el parche y de llamar a la función de prueba (Target()) , se procede a restaurar la memoria a como estaba antes, para que las detecciones no se disparen.

Véase el bloque condicional donde se desea poder ingresar
Código:
...
if(master==MASTERNUM)//Aquí es donde queremos entrar XD
{ ...

Código
  1.  
  2. //
  3. // By 85
  4. // Credits: Organner
  5. // elhacker.net
  6. // etalking.com.ar
  7. // 2013
  8. //
  9.  
  10. ///////////////////
  11.  
  12. #include<windows.h>
  13. #include<stdio.h>
  14.  
  15. //////////////////////
  16.  
  17. DWORD dwPatchPlace = 0x00000000;
  18. BYTE Opcode_JZ = 0x74;
  19. BYTE Opcode_JNZ = 0x75;
  20.  
  21. ///////////
  22.  
  23. inline void Patch(){//Función de parcheadora
  24.  
  25. if(*(PBYTE)dwPatchPlace!=Opcode_JZ) return;
  26.  
  27. DWORD dwOldProtect;
  28.    VirtualProtect( (LPVOID)dwPatchPlace,
  29.                    1,
  30.                    PAGE_EXECUTE_WRITECOPY,
  31.                    &dwOldProtect );
  32.  
  33. WriteProcessMemory( GetCurrentProcess(),
  34.                        (LPVOID)dwPatchPlace,
  35.                        &Opcode_JNZ,
  36.                        1,
  37.                        NULL );
  38.  
  39. VirtualProtect( (LPVOID)dwPatchPlace,
  40.                    1,
  41.                    dwOldProtect,
  42.                    &dwOldProtect );
  43. }
  44.  
  45. //
  46. inline void UnPatch(){//Función restauradora
  47.  
  48. if(*(PBYTE)dwPatchPlace!=Opcode_JNZ) return;
  49.  
  50. DWORD dwOldProtect;
  51.    VirtualProtect( (LPVOID)dwPatchPlace,
  52.                    1,
  53.                    PAGE_EXECUTE_WRITECOPY,
  54.                    &dwOldProtect );
  55.  
  56. WriteProcessMemory( GetCurrentProcess(),
  57.                        (LPVOID)dwPatchPlace,
  58.                        &Opcode_JZ,
  59.                        1,
  60.                        NULL );
  61.  
  62. VirtualProtect( (LPVOID)dwPatchPlace,
  63.                    1,
  64.                    dwOldProtect,
  65.                    &dwOldProtect );
  66. }
  67.  
  68. ////////////////////
  69.  
  70. void Target(){//Función objetivo para ser alterada
  71.  
  72. while(1){
  73.  
  74. #define MASTERNUM 85
  75. int master=0x99999997;
  76. char* ingreso = new char[256];
  77.  
  78. system("cls");
  79. printf("Ingrese la llave maestra\n");
  80. scanf("%s", ingreso);
  81.  
  82. if(!strcmpi(ingreso, new char[]= "key85\0")){
  83.  
  84. master = 85;
  85. }
  86.  
  87. delete []ingreso;
  88. if(master==MASTERNUM)//Aquí es donde queremos entrar XD
  89. {
  90. printf("FELICITACIONES! USTED HA INGRESADO\n");
  91. printf("\n");
  92. system("pause");
  93. break;
  94. }
  95.  
  96. // if(GetAsyncKeyState(VK_END)) break;// En otro hilo
  97. if(!strcmpi(ingreso, new char[]= "exit\0")) break;
  98. }
  99. }
  100.  
  101. //
  102. void Check()//Función que representa un método de seguridad
  103. {
  104. if(*(PBYTE)dwPatchPlace != Opcode_JZ)
  105. {
  106. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  107. printf("Memoria alterada!, se sale del programa..\n");
  108. printf("\n");
  109. system("pause");
  110. ExitProcess(45);
  111. }
  112. }
  113.  
  114. /////////
  115.  
  116. int main(){
  117.  
  118. // We have to replace JZ with JNZ.
  119.  
  120. dwPatchPlace=(DWORD)GetModuleHandle(NULL);//Retorna la BaseAddress
  121.  
  122. //Sumamos el offset obtenido del desensamblado
  123. dwPatchPlace+=0x00001000;
  124. dwPatchPlace+=0x6C;
  125.  
  126. //Logs
  127. printf("0x%X\n",(DWORD)GetModuleHandle(NULL));
  128. printf("0x%X\n",dwPatchPlace);
  129. printf("0x%X\n",*(PBYTE)dwPatchPlace);
  130. printf("\n");
  131. system("pause");
  132.  
  133. //Parcheamos la memoria antes de llamar a la función
  134. Patch();
  135.  
  136. //Llamamos a la función objetivo
  137. Target();
  138.  
  139. //Volvemos a dejar la memoria como estaba antes
  140. // UnPatch();
  141.  
  142. //Se deja que las comprobaciones de seguridad sigan su curso normalmente
  143. Check();
  144.  
  145. return 0;
  146. }
  147.  

Unas imágenes, aunque voy a dejar el proyecto para descargar.


La llamada a UnPatch() está comentada, por eso la detección se dispara..


Un comentario acerca del uso de WriteProcessMemory, no es necesario,,
ya que con simplemente hacer esto:
Código:
*(PBYTE)dwPatchPlace= Opcode_JNZ;
es suficiente, ya que es un mismo proceso.
lo que pasa que ambas funciones fueron sacadas de un post de un tal Organner, que algunos deben saber quien es, sólo les cambié una cosa y listo, aunque tampoco son algo especial como para que deban tener un autor XD

Proyecto MSVC6
http://www.mediafire.com/?j7s6a85bp4k5p3t

Este tutorial está orientado a gente principiante en la programación, no sea considerado un tutorial avanzado  ;D

Hasta Luego


« Última modificación: 25 Febrero 2013, 09:20 am por 85 » En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: Tutorial: Crear un parche 1
« Respuesta #1 en: 25 Febrero 2013, 17:03 pm »

Ten el habito de usar las retornos de las funciones, por algo están.  ::)


En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Tutorial: Crear un parche 1
« Respuesta #2 en: 27 Febrero 2013, 03:36 am »

si gracias, VirtualProtect y WriteProcessMemory deben comprobarse.. usando incluso GetLastError en caso de excepción , para obtener información.

atte

« Última modificación: 27 Febrero 2013, 03:37 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
COMO CREAR UN PARCHE PARA JUEGO?¿
Juegos y Consolas
whnc 4 12,571 Último mensaje 25 Agosto 2004, 10:57 am
por bano
¿Como puedo crear el parche de los juegos para el PCSX2 sin usar el iso buster?
Juegos y Consolas
enzo123 1 2,408 Último mensaje 5 Marzo 2008, 21:26 pm
por Castiblanco
[Tutorial] Crear un servidor para WoW usando ArcEmu y NCDB [Tutorial] « 1 2 ... 210 211 »
Juegos y Consolas
Ariath 2,101 936,261 Último mensaje 2 Junio 2009, 22:54 pm
por Ariath
Tutorial: Crear un parche 1 (desde otro proceso)
Programación C/C++
85 0 1,921 Último mensaje 6 Marzo 2013, 04:09 am
por 85
Tutorial: Crear un parche 2 (Inyección de DLL)
Programación C/C++
85 0 3,632 Último mensaje 16 Marzo 2013, 10:27 am
por 85
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines