Hola buenas
He hecho este code, pero no funciona, será la suma? o que no he puesto bien el offset, lo del 0x00.. no se si se pone así o se quitan los 0s de la izquierda :-\:
void ChangeAddr(int toadd)
{
system("cls");
long offset = 0x00005578;
long pointer = 0x00187F34;
long finalAddr = offset + pointer/*, sumaHex = 0x18D4AC*/, Leer;
WriteProcessMemory ( process, ( LPVOID )finalAddr, &toadd, sizeof ( toadd ), NULL );
ReadProcessMemory ( process, ( LPVOID )finalAddr, &Leer, sizeof ( Leer ), NULL );
printf("Valor: %d", Leer);
}
Gracias de antemano!
Depuralo linea por linea y asi sabras que retornan WriteProcessMemory y ReadProcessMemory. Tambien podes depurar el otro programa, por ejemplo desde WinDbg podes hacer dd 0x18D4AC ... un cero a la izquierda es eso, irrelevante.
El caso es que según el cheat engine está bien y WriteProcessMemory y ReadProcessMemory retornan true ambas :/
Lo de los 0s a la izquierda me refiero que no se si al poner 0x se quitan los 0 de la izq o se deja así:
00187F34 -> 0x187F34
00005578 -> 0x5778
Gracias
Los ceros a la izquierda son irrelevantes, 0x indica que la notacion es hexadecimal.
Sera sobreescrito el valor, fijate que pasa si depuras el otro programa y lo suspendes ...
Ok ya resolví el problema:
Primero hay que leer el pointer, luego sumarle el offset de lo que hayas obtenido, y después escribir en esa dirección.
Lo siento si he hecho perder tiempo, soy newbie jiji
Gracias de todas formas
Hola, tengo otro problema
Ésta vez quiero cambiar las instrucciones (no se si se llaman así) de un address:
0043579C - 01 50 50 - add [eax+50],edx
->
0043579C - 81 40 50 50C30000 - add [eax+50],0C350
Y hasta ahora lo que hago es crear 2 variables: una para el nuevo código y otra para el default, pero se crashea el programa (es una inyección de DLL):
char Default[] = "\x01\x50\x50"; // 3 bytes
char New[] = "\x81\x40\x50\xC3\x00\x00"; //Aqui el error, no se si la cadena esta mal o si son mas de 4 bytes...
Son 7 bytes (te falta 1) pero no podes simplemente poner eso ahi, vas a sobreescribir lo que haya despues del Default ... tenes que hacer un salto y ejecutar codigo en alguna zona libre.
Es lo que quiero ;D y lo de 7 bytes... seguro? O sea tal y como lo cambio está bien?:
Op code en debugger:
81 40 50 50C30000
El cambio a C++:
"\x81\x40\x50\xC3\x00\x00"
Te falta uno ahi, son 6, te falta otro byte con valor 0:
"\x81
\x40
\x50
\xC3
\x00
\x00"
Me sigue crasheando el programa, ahora lo cambie por:
"\x81\x40\x50\xC3\x00\x00\x00"
Y puse 7 bytes, lo que dijiste no?
Alomejor es por lo que has dicho de lo de despues del default, yo pretendo sobreescribir el opcode que tiene el address
Y obvio ... ¿Que viene despues de lo que sobreescribis? Es casi imposible que quede una instruccion valida ... como te dije tenes que hacer un salto a alguna zona libre donde pongas estas instrucciones y despues saltar a la instruccion siguiente (previa ejecucion de la que destruis al sobreescribir con tu salto).
Una buena practica seria hacerlo a mano con un depurador como WinDbg, asi entenderias mas rapido (podes comprobar inmediatamente si funciono) y despues escribis lo necesario con el programa.
Okey ahora sí funciona, con el cheat engine, es un lujo, 10000000 gracias!!
De nadas ;D