C sharp - Leer variables de un proceso

 
Vista:
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 18/03/2014 01:13:49
Hola:

Si abro una aplicación, con Cheat Engine puede buscar las variables de un juego. Son 3, se llaman Vida, Balas y Maná. Al menos quiero centrarme en la variable Vida, cuya dirección se puede ver abajo en "2. VIDA" ya encontrada.



Usando el lenguaje C# en modo consola, preferiblemente con Windows Form, el más que les guste, quiero lograr leer esas variables de ese proceso y mostrarlo C# en tiempo real, es decir, si el juego tiene 100 Vidas, en tu aplicación C# debe aprecer también 100, si de repente tienes 95 en el juego o proceso, también debe aparecer 95 en tu aplicación.

Hace un tiempo estuve con ello bajo C++ 2013 y que va, me pego media vida y encima creando dll.

Al menos si alguien es capaz de enseñar como se hace realmente. O algún ejemplo si es posible y entendible.

Saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 18/03/2014 10:49:11
La manera más sencilla de hacer eso es metiendo código tuyo en ese proceso. De ahí viene lo de la dll; una manera de meter código en otro proceso es haciéndole cargar una dll tuya. Si no te gusta hacer dlls, hay más maneras. Basta con usar CreateRemoteThread. Esa función crea un hilo nuevo en el proceso que quieras. Ese hilo forma parte del proceso destino exactamente igual que lo que escribió su autor, y no tienes más que leer la posición de memoria que quieras, como si lo hubieras hecho tú, y mandarle lo leído a otro programa en c#, c++, c, pascal, vb o lo que quieras.

Pero eso es sólo el principio. Puede ser que el desarrollador del programa no haya hecho nada por impedir que leas su memoria, y entonces sería fácil de encontrar, o puede ser que sí lo haya hecho, y entonces podría ser poco menos que imposible aún sabiendo muchísimo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 18/03/2014 14:46:53
Hola:

Lo de la dll es inyectar códigos, si no me queda más remedio, pues se usará DLL. Me han aconsejado mucho usar el ReadProcessMemory y WriteProcessMemory. Al menos quiero saber códigos de ejemplo.

Puedeo hacer un ejemplo sin protección de memoria un ejemplo de incrementar una variable o decrementarlo bajo código C++ de Visual 2013 a Win32 sin protección. Luego con C#, extraer dicha variable y mostrarlo.

Mira que he estado tres días volviéndome loco de la cabeza buscando ejemplos y nada, y una semana con las DLL que nadie me rcomienda porque es muy complicado.

Si quieres hacgo un ejemplo o un ejecutable que solo incremente cuando pulse una tecla, lo detecta Cheat Engine.

¿Cuál es el código necesario teniendo con C# teniendo eta dirección fija como este 0x01215444?

Si logro leeer esa dirección que no se como se hace, ya puedo ver la variable Vida en C#.

Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 18/03/2014 16:08:09
Muy majo el Cheat Engine. He estado mirándolo. Para que te hagas una idea, en la página web pone:

Fixed dll injection for 64-bit targets (also fixes speedhack for 64-bit and windows 8)

Usa inyección de código a través de una dll. Y no sólo hace eso, sino que también usa funciones de debugg del windows. O sea, se pone a debuggear el programa. Y por si fuera poco, además tiene 2 drivers, con lo que puede controlar todo lo que haga el sistema.

Si sólo quieres leer una posición de memoria que ya sabes cuál es y siempre es la misma, te vale el ReadprocessMemory. El uso es sencillo. La función es tal que

BOOL ReadProcessMemory(

HANDLE hProcess, // handle of the process whose memory is read
LPCVOID lpBaseAddress, // address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // address of number of bytes read
);

que quedaría definida para usar en c# tal que

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(
int hProcess,
int lpBaseAddress,
byte[] lpBuffer,
int dwSize,
ref int lpNumberOfBytesRead);

La dirección de memoria 0x01215444 iría en el lpBaseAddress. El parámetro hProcess lo da la función OpenProcess

HANDLE OpenProcess(

DWORD dwDesiredAccess, // access flag
BOOL bInheritHandle, // handle inheritance flag
DWORD dwProcessId // process identifier
);

definida en c# como

[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

Con eso ya puedes hacerlo. Si quieres un ejemplo completo, de donde he sacado todo eso, por cierto, ahí lo tienes.

http://www.codeproject.com/Articles/670373/Csharp-Read-Write-another-Process-Memory
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 18/03/2014 17:55:16
Hola:

Para buscar variables se aconseja http://www.cheatengine.org
A pesar que tiene su propio debug, aún así, para ello se conseja http://www.ollydbg.de
Es lo que recomiendan en vídeotutoriales e Internet en general.

Gracias a tu ayuda, por finnnnnnnnnnnnn entiendo algo.
Hay algo que no se hacer. Quiero que me muestre la variable actual y sincronizado en tiempo real junco a C#, es decir, que me muestre en pantalla de C# 100 si el juego tiene 100, cuando cambie de variable en el proceso o juego, también debe hacerlo C#.

Por lo que he entendido, lo subo en imágenes.

Ver pantalla completa.
http://www.subeimagenes.com/img/sin-titulo-2-881892.gif

¿Cómo leo la variable? ¿O cuál es el código necesario para leerlo?

Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 18/03/2014 19:22:21
¿Eso que has puesto es el ejemplo de codeproject o tu programa?

Ese código lee la dirección 0x00E85444 del proceso HackMe_0.1.6. Si quieres leer otra cosa pon otra dirección y otro proceso. La b es el valor ascii de lo leído. Lee 98 y lo muestra como ascii. Si lo quieres como número ponle que lo saque como número. Y si quieres que lea cada segundo o cada medio segundo ponle un timer.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 19/03/2014 07:16:30
Buenas:

Ya me funciona.

1
2
3
4
            // Vida.
            ReadProcessMemory((int)processHandle, 0x005713C0, buffer, buffer.Length, ref bytesRead);
            int Vida = BitConverter.ToInt32(buffer, 0);
            label_Vida.Text = (Vida.ToString());

Otra cosa que quiero hacer. Si te fijas, en el Cheat Engine aparece la dirección de memoria en la RAM junto al nomobre del proceso. Cada vez que se inica, la dirección de memoria es diferente. Lo que quiero hacer en C#, que cuando detecte el proceso ejecutado, se muestre la dirección de memoria tal como lo hace Cheat Engine.

Por ahora he intentado hacer esto pero no me sale. Este es su código en C#.
1
2
int entryPoint = (int)GetModuleHandle(null);
            label3.Text = (entryPoint.ToString());

Por lo que se ve, se muestra en la propia aplicación, me da esa impresión.

¿Cómo se hace para ver la dirección de la RAM del proceso?

Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 19/03/2014 17:21:20
¿Qué dirección de memoria?¿De dónde has sacado eso de GetModuleHandle?¿Qué RAM del proceso?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHole (122 intervenciones) el 19/03/2014 18:53:17
Hello man:

Me refiero la dirección del proceso ejecutado que se guarda en la RAM. En esta caso, no tiene nada que ver con las variables o direcciones internar del proceso.


Si Cheat Engine es capaz de saber la dirección de memoria al ver el proceso, me imagino que C# puede hacer lo mismo. Es lo que quiero lograr.

Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 19/03/2014 19:28:46
¿Pero de dónde has sacado que eso es una dirección de memoria? Yo no sé lo que es, pero en la imagen anterior dices que se corresponde con el PROCESS_WM_READ, y eso son los derechos de acceso con los que se abre el proceso. PROCESS_WM_READ se lo pasa al OpenProcess como primer parámetro.

El Cheat Engine es capaz de muchas cosas, inyectando dlls en el proceso e instalando drivers. En c# se puede usar el api de windows y poco más. GetModuleHanle te da la dirección en la que se ha cargado el programa, pero no tiene que ver con nada RAM, es dirección virtual.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 19/03/2014 23:45:40
Buenas:

Error mío. Disculpe usted.
Precisamente esa dirección es la que quiero que me muestre en C# que me lea en un label o textBox, me da igual. Así no tengo que ponerlo manualmente cada vez que cierro y abro el mismo proceso.

Saludo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 20/03/2014 11:38:09
Claro, es que esa es la parte complicada del asunto.

Tanto esa variable como todas las demás que has puesto al principio son memoria reservada, no inicializadas al cargar el exe. Por eso cambia de posición. Lo que seguramente sea fijo se la variable donde se guarda el puntero a esa memoria. Si buscas eso y lo encuentras con el Cheat Engine tienes todo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 168
Bronce
Ha mantenido su posición en C sharp (en relación al último mes)
Gráfica de C sharp

Leer variables de un proceso

Publicado por REHome (122 intervenciones) el 20/03/2014 14:33:21
La verad, que en el Cheat Engine no he encontrado que la dirección esté fija. Suele cambiar los 2 primeros bytes. Deja investigar. En l aprimera imagen del primer post, están todas buscadas.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

Leer variables de un proceso

Publicado por Pico (114 intervenciones) el 20/03/2014 15:33:54
Mira a ver si una variable que empieza por 0040 tiene como valor algo cercano al valor de la dirección de memoria que buscas. O exactamente el mismo valor o un poco menor. Eso te daría la base de esa variable, y el desplazamiento sí es fijo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar