Cambiar valor de un address de otro programa

Iniciado por Stereo, 22 Agosto 2013, 20:15 PM

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

Stereo

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 :-\:
Código (cpp) [Seleccionar]

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!

Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Stereo

#2
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

Eternal Idol

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 ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Stereo

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

Stereo

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):

Código (cpp) [Seleccionar]

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...


Eternal Idol

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.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Stereo

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"

Eternal Idol

Te falta uno ahi, son 6, te falta otro byte con valor 0:

"\x81
\x40
\x50
\xC3
\x00
\x00"
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Stereo

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