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 ..
#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 !
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?
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
(http://img838.imageshack.us/img838/2212/hl1b.png) (http://imageshack.us/photo/my-images/838/hl1b.png/)
utiliza GetProcAddress para resolver Opengl32,
fijate el log de GetProcAddress Luchoz95
(http://img687.imageshack.us/img687/6950/gpalog1.png) (http://imageshack.us/photo/my-images/687/gpalog1.png/)
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
a ver voy de apoco ... no soy muy bueno en programacion por eso , no entiendo mcuho ....
MCKSys ArgentinaCitarEl 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!
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!
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...
(http://i.imgur.com/hyMrXG3.png)
B#
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)
(http://img692.imageshack.us/img692/2427/gl1f.png) (http://imageshack.us/photo/my-images/692/gl1f.png/)
(http://img805.imageshack.us/img805/6691/gl2.png) (http://imageshack.us/photo/my-images/805/gl2.png/)
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).
(http://img855.imageshack.us/img855/2669/gl3.png) (http://imageshack.us/photo/my-images/855/gl3.png/)
Entonces vas a esa dirección y te encontrás con algo así..
(http://img9.imageshack.us/img9/1945/gl4.png) (http://imageshack.us/photo/my-images/9/gl4.png/)
Copiás esa dirección
(http://img843.imageshack.us/img843/613/gl45.png) (http://imageshack.us/photo/my-images/843/gl45.png/)
(http://img27.imageshack.us/img27/139/gl5.png) (http://imageshack.us/photo/my-images/27/gl5.png/)
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;
void __stdcall Mi_glBegin( GLenum mode )
{
glBegin(mode);
}
Si genteee logreee hacer el wallhack !!
Muchsisisiisimaaaas gracias a todoos !
aca dejo el source
#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;
}
Nice ::)
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;
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#
Lucho, queria hacerte una consulta, como hago ahora para usar el cheat? yo lo compilo pero me tira cuatro errores, vos me podrias pasar el .exe o lo necesario para poder usarlo?? muchas gracias!!
Cita de: IEAX en 18 Marzo 2013, 03:50 AM
De nada ;D
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#
Me parece una mejor opción hacer API Hooking a GetProcAddress y hacer strcmp(cadena, "glBegin"); si coinciden GPA devolverá la dirección a tu función si no, tiras un GPA normal para que el juego funcione bien ;).
No es algo difícil y haces el cheat más compatible con otras versiones y con otros PC ;).
Sa1uDoS
Cita de: mr.blood en 24 Mayo 2013, 08:13 AM
Me parece una mejor opción hacer API Hooking a GetProcAddress y hacer strcmp(cadena, "glBegin"); si coinciden GPA devolverá la dirección a tu función si no, tiras un GPA normal para que el juego funcione bien ;).
No es algo difícil y haces el cheat más compatible con otras versiones y con otros PC ;).
Sa1uDoS
Si esa es una, también se podría hacer inline hooks, EAT hooks (antes que llame a GPA), excepciones, etc... hay varias maneras, lo ideal sería utilizar una que no tenga tantos problemas y que funcione para cualquier versión del juego y sea soportada para cualquier tipo de pc como decís...
De todas maneras eso queda al criterio del programador, utilizar la que prefiera y si lo hace compatible o no.
B#