Ayuda , Opengl Wallhack DLL

Iniciado por Luchoz95, 17 Marzo 2013, 07:41 AM

0 Miembros y 2 Visitantes están viendo este tema.

Luchoz95

hola que tal , estoy tratando de hacer un wallhack para un juego y estoy aprendiendo de post de aca del foro, y me salio esto ..
Código (cpp) [Seleccionar]
#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

void __stdcall glBegin( GLenum mode )
{

if(!(mode==GL_TRIANGLES||mode==GL_TRIANGLE_STRIP||mode==GL_TRIANGLE_FAN||mode==GL_QUADS))
{
GLfloat curcol[4];
glGetFloatv(GL_CURRENT_COLOR, curcol);
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
glColor4f(curcol[0],curcol[1],curcol[2],0.5f);
glClearColor(0.0f,0.0f,0.0f,0.0f);
}
glBegin(mode);
}

BOOL __stdcall DllMain(HANDLE hInst, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
MessageBox(NULL,L"inject!",L"luchoooo",MB_ICONWARNING | MB_OK);
}
return TRUE;
}
}

Compila todo de 10 la dll, pero cuando la inyecto , no pasa nada en el juego , el Messagebox injecta , pero lo de opengl no , alguien tiene idea que me hace falta ? saludos !

MCKSys Argentina

El programa está llamando a glBegin de tu DLL?
Estás exportando la función?
Quizás deberías parchear la IAT del EXE en runtime para que redireccione a tu DLL?
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


85

Lo que te dice MCKSys Argentina está bien, digamos son las preguntas que deberías hacerte. Pero para este juego necesitás hacer otra cosa.
fijate primero esta imagen, son los imports del ejecutable del juego


utiliza GetProcAddress para resolver Opengl32,

fijate el log de GetProcAddress Luchoz95


El log completo
http://www.mediafire.com/?zdqbvczz20g33zf

Esto es justo lo que estábamos hablando el otro día MCKSys Argentina XD, sobre lo de interceptar GPA para luego interceptar Opengl32


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

Luchoz95

a ver voy de apoco ... no soy muy bueno en programacion por eso , no entiendo mcuho ....
MCKSys Argentina
CitarEl programa está llamando a glBegin de tu DLL?
Cuando te referis al programa , que programa decis vos ? hl?
CitarEstás exportando la función?
La funcion es glBegin no ? y no se exporta con void __stdcall ?
CitarQuizás deberías parchear la IAT del EXE en runtime para que redireccione a tu DLL?
me mataste . ja!

MCKSys Argentina

Me refiero al ejecutable del juego que estés intentando parchear. (Al parecer es el de Half-Life)

No conozco mucho de programación en C++, por eso te pregunto si estás exportando la función (en ASM no basta sólo la declaración, debe especificarse por separado para que se exporte.)

Si el programa importa la función buscada, directamente desde la IAT, sólo es cuestión de parchearla y redireccionarla al momento de cargar la DLL y listo (fijate las imagenes de 85).
Si está usando GetProcAddress para obtener la dirección, sería algo parecido: reemplazar el valor obtenido por tu direccion.

Ahora, en el último caso (direccion calculada con GetProcAddress) hay otros problemas que pueden ocurrir:

1) Que la dirección se calcule LUEGO de que tu DLL se carga. Ahi deberas tratar de hacer un callback o hook para que tu codigo se ejecute nuevamente. Acá debes recordar que hookear una API en mejor que tocar el propio EXE.

2) Que la direccion donde se guardará la direccion de GetProcAddress se calcule en runtime. De esta forma es dificil calcular luego la direccion, pues se crea en tiempo de ejecucion y normalmente no hay muchas referencias a dicha direccion (a menos que cometan el error de copiarla a una sección del EXE).

Saludos!
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


BloodSharp

El lo que realmente quiere hacer es hookear la función glBegin. En cuanto a GetProcAddress el juego al tener múltiples opciones de video software, opengl, d3d no puede tener los módulos cargados al principio (eso creo), por lo que lo carga en algún lado con LoadLibrary y después mediante GetProcAddress va metiendo las direcciones (en este caso de opengl) en un array de direcciones...




B#



85

Bienvenido IEAX  ;D gracias por tu contribución

como dijo my friend IEAX se trata de las direcciones de Opengl32 que se guardaron en un array. Te mostramos como tenés que hacer con el depurador para llegar a obtener las direcciones que quieras.

Lo primero es obtener la dirección de la función (glBegin)



Ponés un BP y cuando llegás al punto en el que fue llamada, vas
a tener que mirar la pila, específicamente la dirección de retorno,
que es donde estabas anteriormente (trace back).


Entonces vas a esa dirección y te encontrás con algo así..


Copiás esa dirección



Y la ponés en una variable puntero, así

DWORD* Ptr=(DWORD*)0x027E89EC;


y luego reemplazás su valor por el de la dirección de tu glBegin.
(función de reemplazo o hook).
*Ptr=(DWORD) Mi_glBegin;


Código (cpp) [Seleccionar]

void __stdcall Mi_glBegin( GLenum mode )
{
glBegin(mode);
}


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

Luchoz95

Si genteee logreee hacer el wallhack !!
Muchsisisiisimaaaas gracias a todoos !
aca dejo el  source
Código (cpp) [Seleccionar]

#include <windows.h>
#include <gl/gl.h>
#include <gl/glu.h>

DWORD* Ptr=(DWORD*)0x027E89EC;


void __stdcall NewglBegin( GLenum mode )
{
if(mode == GL_TRIANGLE_STRIP)

{

glDisable(GL_DEPTH_TEST);

}
glBegin(mode);
}

BOOL __stdcall DllMain(HANDLE hInst, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
*Ptr=(DWORD) NewglBegin;
}
return TRUE;
}

85

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

BloodSharp

#9
Cita de: 85 en 18 Marzo 2013, 01:59 AM
Bienvenido IEAX  ;D gracias por tu contribución

De nada  ;D

Cita de: 85 en 18 Marzo 2013, 01:59 AMY la ponés en una variable puntero, así

DWORD* Ptr=(DWORD*)0x027E89EC;


y luego reemplazás su valor por el de la dirección de tu glBegin.
(función de reemplazo o hook).
*Ptr=(DWORD) Mi_glBegin;


Código (cpp) [Seleccionar]

void __stdcall Mi_glBegin( GLenum mode )
{
glBegin(mode);
}

El ejemplo está muy bien, el único problema de poner esa dirección directamente como le sugerís a lucho es que solo va a funcionar para un par de versiones del juego. Esto se debe a que en las versiones antiguas los módulos no eran cargados normalmente, me refiero a que son mapeados directamente siempre en una misma zona específica de memoria, por lo cual siempre le va a funcionar con la misma dirección.
En las versiones del juego más actuales las dll son cargadas normalmente y seguramente estarán en otras posiciones de memoria cada vez que inicie el juego...


B#