December 14th, 2011
Este artículo pertenece a una serie de dudas antiguas que fueron publicadas en foros de internet antes de la creación del blog, lo plasmo aquí para no perderlas y que formen parte de la antología.
Post:
Saludos,
Aqui les dejo un programa que modifica la memoria del buscaminas para sobreescribir las direcciones donde hayan bombas en mapa.
[code language=”cpp”]
#include <iostream>
#include <windows.h>
#include <Tlhelp32.h>using namespace std;
DWORD Buscar_Proceso();
/*
Name: trainer buscaminas
Author: @aps
Date: 14/12/11 17:51
*/HANDLE CProc;
HANDLE hProc;
PROCESSENTRY32 Proceso;
DWORD pid;int main()
{BYTE *celda;
DWORD mapa = 0x01005360;
DWORD aux;if(Buscar_Proceso() != 0)
{
cout << "Se encontro el proceso. " << endl;
cout << "El pid es : " << hex << pid << endl;
}else cout << "No se encontro el proceso." ;if( (hProc = OpenProcess(PROCESS_ALL_ACCESS, false, pid) ) == NULL)
{
cout << "No se pudo abrir el proceso. " << endl;
}else cout << "Se abrio el proceso." << endl;if( (VirtualProtectEx(hProc ,(void *)mapa, 0x2FF, PAGE_EXECUTE_READWRITE, &aux)) == 0)
{
cout << "Error al cambiar los permisos de la zona " << mapa << endl;
}else cout << "Se modificaron los permisos en " << mapa << endl;for(int x(0); (mapa+x) <= (mapa + 0x2ff ); x++ )
{if ( ReadProcessMemory( hProc, (LPVOID)(mapa+x), celda, 1, NULL) == 0)
{
cout << "Error al leer en " << (mapa+x) << endl;
}else cout << "Se leyo en " << (mapa+x) << " el valor " << celda << endl;if( *celda == 0x8f )
{
*celda = 0x48;if( WriteProcessMemory(hProc, (void *)(mapa+x), celda,
1, NULL) == 0 )
{
cout << "Error al escribir en " << (mapa+x) << endl;
}else{ cout << "Se modifico " << (mapa+x) << endl;}}
}setbuf(stdin, NULL);
cin.get();
return 0;
}DWORD Buscar_Proceso()
{//Con esto creamos una captura de la lista de procesos y la guardamos en CProc
CProc = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);Proceso.dwSize = sizeof(PROCESSENTRY32);
Process32First(CProc,&Proceso); //Leemos el primer proceso
//Mientras haya procesos para leer leemos el siguiente
while(Process32Next(CProc,&Proceso))
{if(!strcmp(Proceso.szExeFile, "winmine.exe") )
{
return pid = Proceso.th32ProcessID;}
}
return pid = 0;
}
[/code]Y aqui una dll que hookea la api CreatePen, intente hacer una combinacion de dos metodos para hacer api-hooking de practica. Esto me llevo toda la tarde hacerlo asi que apreciaria si alguien puede hacerle algun comentario, verle un fallo, algo a mejorar? : )
[code language=”cpp”]
/* Replace "dll.h" with the name of your header */#include <windows.h>
#include <Tlhelp32.h>
#include <stdio.h>/*
Name: trainer buscaminas
Author: @aps
Date: 14/12/11 17:51
*/void HookImport();
HPEN __stdcall CreatePenF( int , int , COLORREF );BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
HookImport();
break;case DLL_PROCESS_DETACH:
break;case DLL_THREAD_ATTACH:
break;case DLL_THREAD_DETACH:
break;
}/* Returns TRUE on success, FALSE on failure */
return TRUE;
}void HookImport()
{
HMODULE Prog = GetModuleHandle(0);
HMODULE Gdi32 = GetModuleHandle("Gdi32.dll");
DWORD CreatePen = (DWORD)GetProcAddress(Gdi32, "CreatePen");
int x;PIMAGE_DOS_HEADER Img = (PIMAGE_DOS_HEADER)Prog;
//e lfanew apunta a donde empieza el encabezado nt
PIMAGE_NT_HEADERS Pe = (PIMAGE_NT_HEADERS) ((BYTE*)Img + Img->e_lfanew);// obtengo la direccion del import en la seccion .text
LPDWORD ImportAddr = (LPDWORD)(
Pe->OptionalHeader.BaseOfCode + (DWORD)Img);DWORD old;
//le cambio los privilegios
VirtualProtect(ImportAddr,
Pe->OptionalHeader.SizeOfCode, PAGE_READWRITE, &old);for ( x= 0; x < Pe->OptionalHeader.SizeOfCode; x += 4, ImportAddr++)
{
//si la funcion es CreatePen
if (*ImportAddr == CreatePen)
{
//cambio los primeros cuatro bytes que apuntan a la direccion de memoria de CreatePen
//por los de mi funcion
*ImportAddr = (DWORD)&CreatePenF;
break;
}}
}
HPEN __stdcall CreatePenF( int fnPenStyle, int nWidth, COLORREF crColor )
{
fnPenStyle = PS_DASHDOT;
nWidth = 20;
crColor = RGB(255, 0, 0);BYTE *Buffer = (BYTE *)malloc(5);
BYTE *DirApi = (BYTE *)GetProcAddress(GetModuleHandle("Gdi32.dll"),"CreatePen");*Buffer=0xE9;
Buffer++;//api menos el principio del buffer
*((signed int *) Buffer) = DirApi – Buffer – 4;return ( (HPEN(__stdcall *) (int,int, COLORREF) ) Buffer-1)(fnPenStyle, nWidth, crColor);
}
[/code]Para inyectar la dll usen http://www.portalhacker.net/index.php/topic,146134.0.html
Luego cuando abran el buscaminas vayan a game, activen y desactiven la casilla color y ya esta.Espero q alguien le sirva!
PD. Estoy en windows sp3, ingles y me funciona a la perfeccion.
Saludos. 😛
Respuesta:
Haha tienes razon no lo comente. 😛
Fijate en el buscaminas se reserva memoria para el mapa y cada una de las celdas. Cuando no hay nada en la celda es porque esta este byte (0x0F). Cuando hay un 1 o un 2, 3, etc, estan estos bytes (0x41 o 0x42, 0x43, etc.). Cuando hay una mina en la celda esta este byte (0x8f).
El mapa comienza en esta direccion 0x01005360 y termina en 0x01005360+0x2ff. Por lo tanto lo que hago es recorrer el mapa en busqueda de este byte 0x8f y lo cambio por este 0x48 (8).
En la dll lo que hago es hookar la api CreatePen, usando el import addres table hooking. En el buscaminas las importaciones estan dentro de la seccion .text al principio.
Asi que busco donde esta la seccion .text y le sumo el ImageBase. Luego voy avanzado cada 4 bytes hasta que encuentro la direccion d Create Pen, y la sustituyo por la direccion de mi funcion.
Luego en la funcion cambio los parametros y creo un buffer que haga un salto hacia la funcion original pasandole los parametros modificados. : D
Queda asi cuando ejecutas la dll y el cheat.
Es la primera vez que hago este tipo de cosas asi que han de haber muchos errores y formas de hacerlo mejor. xPun saludos. : )
Saludos,
Ángel