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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Interceptar Opengl32 con Detours y obtener un WH
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Interceptar Opengl32 con Detours y obtener un WH  (Leído 2,323 veces)
85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Interceptar Opengl32 con Detours y obtener un WH
« en: 9 Abril 2013, 19:29 pm »

Para terminar de redondear el tema de interceptar Opengl32 usando detours, muestro una pequeña base para crear un WH, utiliza una función personalizada para instalar un hook del tipo DETOUR.
Habíamos visto en otros tutoriales como se hace, y que se trata de una técnica intrusiva porque requiere parchear la memoria (código) del proceso víctima.
http://foro.elhacker.net/programacion_cc/detours-t168884.0.html
No tiene nada que ver con otros tutoriales que muestran como se modifican los valores de algunos punteros que corresponden a datos en el proceso.
Ej: http://foro.elhacker.net/programacion_cc/codigo_fuente_cheat_cs_16-t387341.0.html

Dejo el código funcional y el proyecto para descargar como siempre, dejo unas imágenes..

En este caso para diferenciarnos de otros tutoriales, explico la forma en que se puede cargar esta DLL en el proceso "hl.exe" que corresponde al juego Counter-Strike.

Se trata de ir a la carpeta del juego, y buscar una DLL de las que sabemos que no son necesarias en el juego pero de todas formas son cargadas al proceso.
Hay otras DLLs que son cargadas y algunas de sus funciones o todas, son utilizadas en el proceso, por lo que no se puede quitarlas, sino más bien hacer un 'wrapper' de ellas. Pero no quitarlas.

Vamos a ver una DLL que si la podemos quitar que se llama "DemoPlayer.dll". Vamos a quitarla y poner nuestra DLL con el WH en su lugar. Obviamente la tenemos que renombrar a "demoplayer.DLL" si es que no tiene ese nombre toda via.





Al final quiero decir que los sistemas de seguridad suelen escanear en la memoria, por ejemplo los primeros 5 bytes de algunas funciones para determinar si tienen 'detours'.
Pero a veces hacen otras comprobaciones como CRC32 de toda una función, o quien sabe que otras comprobaciones.. el tema es que este es un método intrusivo.

Código
  1.  
  2. //
  3. // Modifications: By 85
  4. // Credits: gamedeception (detour function), SharkBoy999 base
  5. // elhacker.net
  6. // etalking.com.ar
  7. // david_bs@live.com
  8. // 2013
  9. //
  10.  
  11. ///////////////////////////////////////////////////////////////////////////////////////
  12.  
  13. #pragma comment(lib,"OpenGL32.lib")
  14. #include <windows.h>
  15. #include <gl/gl.h>
  16. #include <tlhelp32.h>
  17. #include<stdio.h>
  18.  
  19. ///////////////////////////////////////////////////////////////////////////////////////
  20.  
  21. #define wallhack_key     GetAsyncKeyState(VK_NUMPAD1) &1
  22. #define lambert_key GetAsyncKeyState(VK_NUMPAD2) &1
  23. #define nosmoke_key GetAsyncKeyState(VK_NUMPAD3) &1
  24. #define noflash_key GetAsyncKeyState(VK_NUMPAD4) &1
  25.  
  26. bool wallhack = true;
  27. bool lambert = true;
  28. bool nosmoke = true;
  29. bool noflash = true;
  30.  
  31. bool bDrawingSmoke = false;
  32. bool bDrawingFlash = false;
  33.  
  34. ///////////////////////////////////////////////////////////////////////////////////////
  35.  
  36. typedef FARPROC (APIENTRY* GetProcAddress_t)(HMODULE, LPCSTR);
  37. typedef void (APIENTRY* glBegin_t)(GLenum mode);
  38. typedef void (APIENTRY* glViewport_t)(GLint x, GLint y, GLsizei width, GLsizei height);
  39. typedef void (APIENTRY* glVertex3fv_t)(const GLfloat* v);
  40. typedef void (APIENTRY* glVertex2f_t)(GLfloat,GLfloat);
  41.  
  42. ///////////////////////////////////////////////////////////////////////////////////////
  43.  
  44. GetProcAddress_t pGetProcAddress = 0;
  45. glBegin_t pglBegin;
  46. glViewport_t pglViewport;
  47. glVertex3fv_t pglVertex3fv;
  48. glVertex2f_t pglVertex2f;
  49.  
  50. ///////////////////////////////////////////////////////////////////////////////////////
  51.  
  52. void toggle(bool var)
  53. {
  54.    var = !var;
  55. }
  56.  
  57. ///////////////////////////////////////////////////////////////////////////////////////
  58.  
  59. void* Detour1(BYTE* src, const BYTE* dst, const int len)
  60. {
  61. BYTE* jmp = (BYTE*)malloc(len+5);
  62. DWORD dwback;
  63. while(!VirtualProtect(src, len, PAGE_READWRITE, &dwback));
  64. memcpy(jmp, src, len);jmp+=len;
  65. jmp[0] = 0xE9;
  66. *(DWORD*)(jmp+1)=(DWORD)(src+len-jmp)-5;
  67. src[0] = 0xE9;
  68. *(DWORD*)(src+1)=(DWORD)(dst-src)-5;
  69. while(!VirtualProtect(src, len, dwback, &dwback));
  70. return (jmp-len);
  71. }
  72.  
  73. ///////////////////////////////////////////////////////////////////////////////////////
  74.  
  75. FARPROC APIENTRY new_GetProcAddress(HMODULE hModule, LPCSTR lpProcName)
  76. {
  77. //FARPROC fpResult = (*pGetProcAddress)(hModule, lpProcName);
  78. FARPROC fpResult = pGetProcAddress(hModule, lpProcName);
  79. if(HIWORD(lpProcName))
  80. {
  81. if(!lstrcmp(lpProcName,"GetProcAddress"))
  82. return((FARPROC)&new_GetProcAddress);
  83. }
  84. return fpResult;
  85. }
  86.  
  87. ///////////////////////////////////////////////////////////////////////////////////////
  88.  
  89. void APIENTRY new_glBegin(GLenum mode)
  90. {
  91. if(wallhack)
  92. {
  93. if(mode == GL_TRIANGLE_STRIP || mode == GL_TRIANGLE_FAN)
  94. glDepthRange( 0, 0.5 );
  95. else
  96. glDepthRange( 0.5, 1 );
  97. }
  98.  
  99. if(lambert)
  100. {
  101. if(mode == GL_TRIANGLE_STRIP || mode == GL_TRIANGLE_FAN)
  102. glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
  103. }
  104.  
  105. if(nosmoke)
  106. {
  107. if(mode==GL_QUADS)
  108. {
  109. GLfloat curcol[4];
  110. glGetFloatv(GL_CURRENT_COLOR, curcol);
  111. if(mode==GL_QUADS
  112. && (curcol[0]==curcol[1])
  113. && (curcol[0]==curcol[2])
  114. && (curcol[0]!=0.0)
  115. && (curcol[0]!=1.0))
  116. {
  117. bDrawingSmoke = true;
  118. }
  119. else
  120. bDrawingSmoke = false;
  121. }
  122. }
  123.  
  124. if(noflash)
  125. {
  126. GLfloat color[4];
  127. glGetFloatv(GL_CURRENT_COLOR, color);
  128. if(mode == GL_QUADS && (color[0]==1 && color[1]==1 && color[2]==1) )
  129. {
  130. bDrawingFlash = true;
  131. }
  132. else
  133. bDrawingFlash = false;
  134. }
  135. pglBegin(mode);
  136. }
  137.  
  138. ///////////////////////////////////////////////////////////////////////////////////////
  139.  
  140. void APIENTRY new_glViewport(GLint x, GLint y, GLsizei w, GLsizei h)
  141. {
  142. if(wallhack_key)
  143. toggle(wallhack);
  144. if(lambert_key)
  145. toggle(lambert);
  146. if(nosmoke_key)
  147. toggle(nosmoke);
  148. if(noflash_key)
  149. toggle(noflash);
  150. pglViewport(x,y,w,h);
  151. }
  152.  
  153. ///////////////////////////////////////////////////////////////////////////////////////
  154.  
  155. void APIENTRY new_glVertex3fv(const GLfloat* v)
  156. {
  157. if(bDrawingSmoke)
  158. return;
  159.  
  160. pglVertex3fv(v);
  161. }
  162.  
  163. ///////////////////////////////////////////////////////////////////////////////////////
  164.  
  165. void APIENTRY new_glVertex2f(GLfloat x,GLfloat y)
  166. {
  167. /* if (bDrawingFlash)
  168. {
  169. GLfloat color[4];
  170. glGetFloatv(GL_CURRENT_COLOR, color);
  171. //color[0]=0, color[1]=0, color[2]=0;
  172. glDisable(GL_TEXTURE_2D);
  173. glColor4f(color[0], color[1], color[2], 0.01f);
  174. }*/
  175. pglVertex2f(x,y);
  176. }
  177.  
  178. ///////////////////////////////////////////////////////////////////////////////////////
  179.  
  180. void Hook(void)
  181. {
  182. pglBegin =        (glBegin_t)       Detour1((LPBYTE)glBegin,       (LPBYTE)new_glBegin, 6);
  183. pglViewport =     (glViewport_t)    Detour1((LPBYTE)glViewport,    (LPBYTE)new_glViewport, 7);
  184. pglVertex3fv =    (glVertex3fv_t)   Detour1((LPBYTE)glVertex3fv,   (LPBYTE)new_glVertex3fv, 6);
  185. pglVertex2f =     (glVertex2f_t)    Detour1((LPBYTE)glVertex2f,    (LPBYTE)new_glVertex2f, 6);
  186. }
  187.  
  188. ///////////////////////////////////////////////////////////////////////////////////////
  189.  
  190. bool APIENTRY DllMain(HANDLE hModule, DWORD  dwReason, LPVOID lpReserved)
  191. {
  192. if(dwReason == DLL_PROCESS_ATTACH)
  193. {
  194. // No es necesario este Detour para la demostración..
  195. pGetProcAddress = (GetProcAddress_t)Detour1((LPBYTE)GetProcAddress,
  196. (LPBYTE)new_GetProcAddress, 5);
  197.  
  198. if(GetModuleHandle("Opengl32.dll"))
  199. Hook();
  200. }
  201. else if(dwReason == DLL_PROCESS_DETACH)
  202. {
  203. // Restaurar bytes en GPA
  204.  
  205. // (no hace falta suspender el mismo hilo! no sirve para nada XD)
  206.  
  207. // Salida con retardo.
  208. // Permite que se ejecuten los últimos llamados a GPA
  209. // (Y no hace falta restaurar los bytes parcheados XD)
  210. ExitProcess(100);
  211. }
  212. return (true);
  213. }
  214.  
  215. ///////////////////////////////////////////////////////////////////////////////////////
  216.  
  217.  

otra cosa que quiero agregar, es que el 'hook' a GetProcAddress no es necesario, pero está hecho y sirve para demostrar algo importante.

cuando salimos del juego, osea del proceso, antes se descargan las DLLs entre otras cosas, pero cuando se descarga nuestra DLL la memoria del proceso continua parcheada (los hooks que instalamos), y las referencias a los hooks son inválidas ya que la DLL se ha descargado.

Esto no importa para Opengl32 porque nadie va a utilizar Opengl32 al salir, pero con GetProcAddress si pasa esto. Por eso se debería considerar restaurar los bytes parcheados en GetProcAddress, o más fácil es hacer que la DLL se descargue cuando ya no sea necesaria (cuando no se haga más referencia a los hooks). Con un ExitProcess(100) queda resuelto, en realidad no investigué acerca de este tema, sólo traté de arreglarlo de alguna forma. Pero es un detalle a considerar.

PROYECTO
http://www.mediafire.com/?qfb65fsfgaf5doa



« Última modificación: 25 Abril 2013, 08:19 am por 85 » En línea

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

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Interceptar Opengl32 con Detours y obtener un WH
« Respuesta #1 en: 10 Abril 2013, 02:55 am »

puede ser que los GetAsyncKeyState no funcionen? lo probe y no me andubo


En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Interceptar Opengl32 con Detours y obtener un WH
« Respuesta #2 en: 10 Abril 2013, 03:06 am »

Si eso estaba en el código original de SharkBoy999, no lo quité pero eso no funciona así, es decir vos comprobás si GetAsyncKeyState es diferente de 0, ya que la especificación de la MSDN dice que si el bit más significativo es 1 es que la llave está presionada, y dice que no se tome en cuenta otros comportamientos, por lo tanto no hace falta usar máscara de bits, sólamente comprobando que no sea 0 es suficiente.

http://msdn.microsoft.com/en-us/library/windows/desktop/ms646293(v=vs.85).aspx


EDIT: XD aparte la función 'toggle' es cualquier cosa , es decir no le des bola al resto del código porque pertenece a la base de SharkBoy999, es un man que hizo un par de hacks en el pasado y siempre que publicaba códigos lo hacía poniendo errores para que no los compile cualquiera o para que no funcionen. Lo mismo hacían muchos otros.

Es decir, concentráte en el método del HOOK

Saludos
« Última modificación: 10 Abril 2013, 03:11 am por 85 » En línea

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

Desconectado Desconectado

Mensajes: 58


Ver Perfil
Re: Interceptar Opengl32 con Detours y obtener un WH
« Respuesta #3 en: 10 Abril 2013, 03:46 am »

jaja ! bueno me quedaba esa duda ! , dale voy a concentrarme en eso, excelente aporte 85!

Saludos!
En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Interceptar Opengl32 con Detours y obtener un WH
« Respuesta #4 en: 10 Abril 2013, 04:48 am »


Este es un ejemplo de uso también.. lo busqué en Google  :P
Código:
#define KEY_DOWN(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 1 : 0)
#define KEY_UP(vk_code) ((GetAsyncKeyState(vk_code) & 0x8000) ? 0 : 1)

if( KEY_DOWN(VK_LBUTTON) ){
keybd_event( VK_LBUTTON, 0, KEYEVENTF_KEYUP, 0 );
}

0x8000 = SHRT_MAX
http://www.cplusplus.com/reference/climits/

Lo que podés hacer es usar un hilo aparte para detectar las llaves, y usar una variable global por ejemplo para comprobar en alguna de las funciones de Opengl32. En los hacks se usa un sistema de variables de control, pero es otro tema ya que no se utiliza GetAsyncKeyState sino que hay una función del juego que sirve para obtener información de llaves presionadas.
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
hook a recv sin ms detours?
Programación C/C++
while 2 3,137 Último mensaje 6 Octubre 2010, 23:25 pm
por while
glTest 1: Interceptar Opengl32 con GPA
Programación C/C++
85 0 1,700 Último mensaje 7 Marzo 2013, 02:41 am
por 85
Wrapper de Opengl32.dll de Crusader (2002)
Programación C/C++
85 2 2,025 Último mensaje 5 Abril 2013, 21:00 pm
por 85
Interceptar con Detours el Opengl nativo por TEB
Programación C/C++
85 3 3,687 Último mensaje 11 Abril 2013, 00:23 am
por Luchoz95
[Librería C++] Detours, Codecaves, Return Adress Spoofing y mucho más
Ingeniería Inversa
blipi 1 2,345 Último mensaje 7 Febrero 2014, 00:33 am
por blipi
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines