Con Cheat Engine busco las direcciones fijas de color verde para las variables. He hecho con Visual C# 2013 una palicación que lee las variables y me lo muestra en tiempo real como el juego. Si el juego marca 100 de vidas, en C# me lo refleja, si en el momento me marca 99, en C# pone 99. El problema es que al cerrar el proceso y lo vuelvo abrir, cambian las direcciones de las variables.
Me han contado, que existe la posibilidad encontrar variables fijas en los ejecutables de los juegos, aunque sea el notepad, la calculadora de Windows o tu propio exe. A parte del Cheat Engine, me recomiendan usar ollydbg.
Hago estas preguntas. 1) ¿Realmente es cierto que Cheat Engine es capaz de encontrar direcciones totalmente fijas? (Es decir, que al volver abrir un proceso, encuentre una dirección que jamás varía).
2) Con OllyDBG me confirman que se busca un offset que nunca cambia, este si que lo hace. Lo que es complejo de buscar, pero existe la posibilidad. La pregunta es. ¿Qué usan ustedes para buscar variables fijas, Cheat Engine o ollydbg?
Tendré que ponerme con Ollydbg para lograrlo. Si existe la posiblidad en el Cheat Engine, me alegra saberlo.
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.
// Nivel 3 // PUNTERO (ESTRUCTURA) -> DIRECCION (ADDRESS) + OFFSET -> VIDA if (estructura != 0) { *(DWORD*)(estructura + 4) = 10; } }
if (mana) { // Nivel 1 *(DWORD*)(entryPoint + 0x545C) = 100;
// Nivel 2 // PUNTERO -> DIRECCION (ADDRESS) -> MANA DWORD direccion = *(DWORD*)(entryPoint + 0x5450); if (direccion != 0) { *(DWORD*)(direccion) = 100; }
// Nivel 3 // PUNTERO (ESTRUCTURA) -> DIRECCION (ADDRESS) + OFFSET -> VIDA if (estructura != 0) { *(DWORD*)(estructura + 8) = 100; } }
Sleep(200); // 200 milisegundos // Sleep(1); } }
void Teclado() { while (!salir) { // 'a' => vida = activar/desactivar (true/false) if (GetAsyncKeyState(VkKeyScan('a')) & 1) { vida = !vida; // ! "NO"/"LO CONTRARIO" /* vida es true vida = "NO" true => vida = false vida = "NO" false => vida = true */ }
Usando Visual C# 2013, creando otro proyecto a parte con Windows Form, coloco la dll llamada HackDLL.dll en el directorio del proyecto del C#.
Creao en C# una clase que se llama Super_DLL.cs. Dentro de ella tiene este código que en realidad no es nada.
Código:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
using System.Runtime.InteropServices; // No olvidar. Para Dllimport.
namespace Prueba_DLL { class Super_DLL { [DllImport("HackDLL.dll")]
} }
El formulario principal solo he colocado un using.
Código:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;
using Prueba_DLL; // No olvidar este using. Para llamar a la clase Super_DLL.cs.
namespace Prueba_DLL { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }
En Windows Form de C# solo tiene tres label para mostrar dichas variables. Los label para no condundir se llama su nombre interno.
label_vida
label_balas
label_mana
No se si es posible hacerlo con el código mostrado. Lo que hace simplente ejecutar un juego básico hecho con C++ 2013 (no tengo código fuente y puede ser el ejecutable de cualquier juego).
Se crea una dll a parte con otro proyecto del código de arriba.
Luego creo otro proyecto con Windows Form bajo C# como dije antes arriba. Solo tiene que leer las variables del juego cuando está en ejecución. La dll hace el trabajo principal leyendo y C# solo muestra información optenida gracias a la dll.
Quiero hacer un menú con Visual C/C++ 2013, la aplicación en en consola a Win32, nada de FrameWork .net y CLR.
Hice uno muy básico, estoy siguiendo tutriales por todas partes, por ahora parece que funciona pero las tildes como la ó al compilar el programa sale caracteres raros.
Por ahora solo he hecho esto sin las funciones.
Código
#include<iostream>
using namespace std;
void Imprimir_menu(){
cout <<"\n\nOpciones: ";
cout <<"\n(1) Ver variables.";
cout <<"\n(2) Variable tiempo.";
cout <<"\n(3) Sumar o restar variables.";
cout <<"\n(4) Opción pendiente 4.";
cout <<"\n(5) Opción pendiente 5.";
cout <<"\n(6) Salir del programa. \n";
cout <<"\nOpción: ";
}
void Ver_varibales(){
//Defines lo que debe hacer
}
void Variable_tiempo(){
//Defines lo que debe hacer
}
void Sumar_o_restar_variables(){
//Defines lo que debe hacer
}
void Opcion_pendiente_4(){
//Defines lo que debe hacer
}
void Opcion_pendiente_5(){
//Defines lo que debe hacer
}
int main(){
bool bContinuar =true;
int opcion =0;
while(bContinuar){
cout <<"\n\nSeleccione una opción del siguiente menu: ";
Imprimir_menu();
cin >> opcion;
switch(opcion){
case1:
Ver_varibales();
break;
case2:
Variable_tiempo();
break;
case3:
Sumar_o_restar_variables();
break;
case4:
Opcion_pendiente_4();
break;
case5:
Opcion_pendiente_5();
break;
case6:
bContinuar =false;
cout <<"\nEjecución terminada....";
break;
defualt:
cout <<"\nPor favor selecciona una opción del 1 al 6";
break;
}
}
}
A lo mejor el código base lo pueden mejorar si les apetece antes de seguir con las variables. Que es solamente hacer otro submenú que pregutne que haré con dichas variables, solamente si pulsas Q, incremente un punto en una variable, si pulsas W, disminuye un punto.
La variable de entrada vale 10 como int. luego se cambia cuando selecciones aumentar o disminuir como dije antes. Esa es la primera opción. La obsión 2 o el segundo menú, hay un temporizador que cuenta de 100 segundos a 0. Cuando llegue a 0 sale a otro submenú que diga "Se acabó el tiempo." El tiempo lo puedes detener pulsando P y continuar pulsado L.
Son detalles que todavía con este lenguaje no se hacer. Por eso quiero una ayudita.
Según vea las ayudas, seguiré haciendo por mi cuenta las otras opciones.
Un saludo.
Edito: Aquí hay algo más o menos que se entiende para hacer menús.
Usando un PIC16F877A a XT de 4 MHz con el PIC simulator IDE.
Pin RA0 como salida para encender un Led. Pin RB0 como entrada de un pulsador, no interruptor.
Lo que quiero hacer es lo siguiente, no tengo idea de estelenguaje pero quiero verlo como curiosidad de una vista rápida.
Al pulsar el pulsador, el Led se queda encendido durante 1 minuto, luego se apaga. Solo quiero hacer eso. ¿Cómo es el código?
Intenté hacer esta chapuza pero no va.
Código:
AllDigital TRISA = %00000000 TRISD = %00000001
inicio: If PORTB.0 = 1 Then '¿Pulsador en 1? (Sin pulsar). Goto motor 'Se cumple esta condición al motor. Else 'En caso contrario. PORTB.0 = 0 'Motor apagado. Endif Goto inicio 'Vuelve a escanear el pulsador.
motor: PORTD.0 = 1 'Activa el motor. WaitMs 250 '15 es un segundos. PORTD.0 = 0 'Se apaga elmotor. Goto inicio 'Vuelve a escanear o leer el pulsador. End
Un cordial saludo.
Edito:
Para hacerlo más complejo. Por el pin RB0 = Entrada digital, pulsador. RB1 = Igual. RB2 = Igual. RB3 = Detiene el tiempo. Stop.
RD0 = Motor encendido que puede ser de 5, 10 o 20 minutos. RD1 = Led encendido durante 5 minutos con el motor RD0. Los demás Led apgados. RD2 = Lo mismo pero a 10 minutos. RD3 = Lo mimso pero en 20 minutos.
El esquema es parecido a este pero con el PIC16F877A.
Como es un lenguaje que no conozco, me cuesta muchísimo coger el hilo.
En el visual C++ 2010 Express incluye el Windows Form de entrada, a partir del 2012 creí que lo han quitado, más de un usurario del foro piensa lo mismo y hablamos del tema de que íbamos a comprobar que realmente lo incluye o lo han quitado. Lo que no recuerdos sus nick del foro.
Se trata de usar Visual C++ Express 2013 y trabajar con el Windows Form de toda la vida, se incluye un button y que al pulsarlo diga "Hola Mundo".
Por ahora no hago bien el trabajo, les pondo el proceso de lo que he hecho para que me guíen los que sepan.
1) Hago click arriba en ARcHIVO->Archivo nuevo. Como nombre lo dejjo como está por defecto. Pulsa Aceptar.
2) Pulsar Siguiente.
3) Pulsa Proyecto vacío, que esté marcado y luego Finalizar.
4) Paso 4 leer en la imagen de abajo.
5) Por fin encontré que el Windows Form si se incluye en el Visual C++ 2013.
6) No queda otra que pulsar Sí, si quiere usarlo.
7) Por fin se ve en el Visual C++ 2013 la ventana perfecta para tarbajar con los componentes button y demás como en C# y VB .net.
8) Aquí mi duda. En el explorador de solucioines puedo agregar un Windows Form donde lo acabo de añadir "Archivos de códigos fuentes" y también se puede añadir en "Archivos de encabezado". Añade un label en el centro del formulario como indica abajo y luego, pulsa F7 que significa Compilar solución.
9) Mirando el código fuente del formulario, da errores como que no encuentran los using. En Visual C++ 2010 no es tan majadero crear un formulario Windows y no da problemas de este tipo. Tampoco deja depurar con F5.
A partir de aquí no se que hacer, a lo mejor no he hecho el procedimiento adecuado para crear formularios como proyecto principal. Al menos se que existe una forma de crear formularios Windows en Visual C++ Express 2013 y menos mal, no quiero siempre trabajar en modo consola.
Quiero hacer una prueba sencilla para lograr un objetivo. Intentar leer en la memoria RAM unos valores de las variables que no conoces, localizar esa variable, crear tu aplicación aunque sea en C# capaz de leer sus valores. Hay que crear dos proyectos. Uno como hice abajo, lo que hace es con un timer incrementar el valor del componente progressBar y mostrar su valor en label1.
Como muestra en la imagen de abajo, se ha incluido en el Form1, un lable, un button, un timer y progressBar.
int Valor = progressBar1.Value;// Guarda el valor actual.
progressBar1.Increment(1);// Incrementa a 1.
label1.Text= Valor.ToString();// Muestra el valor del incremento del ProgressBar.
// Si el valor llega a 100.
if(Valor ==100)
{
progressBar1.Value=0;// Empieza desde 0.
}
}
}
}
Este programa se recomienda ejecutarlo directamente del .exe compilado, no usando Visual Express 2013. Supuestamente no tengo idea del código fuente del .exe de arriba, tener claro que no lo conoces, se los dejo para dar ideas. Ahora hay que crear otro proyecto desde cero, puedes usar C++ que es más rápido a la hora de intercambiar información, para dejarlo más fácil ya que estamos aprendiendo, usaremos C#, y los que quieran VB .net.
Para leer los valores del archivo.exe, hay que verlo desde un descompilador o algún programa que lea en tiempo real el proceso. Aquí hay uno, es muy utilizado para cambiar vidas infinitas a los juegos de PC. Se logra buscar esa variable, se le suma nuevos valores y tiene más vida, en nuestro caso no trataremos este tema, se tratará de localizar dicha variable y ver como cambian sus estados. Luego crear un progrma a parte que lea dichas variables y mostrarla en un label.
Puedes usar otro programa y también recomendarlo si parece interesante.
La idea principal es, ser capaz de localizar esas variables, hacer una aplicación que los lea y muestre en un form1 con C# o otro lenguaje que más te guste.
El ejemplo que puse arriba quiero sacar los valores que muestra en label1, que es el mismo del progressBar1.
En un juego de Rally, quiero sacar el cuentakilómetros indicado en pantalla a mi propia aplicación, pero esto es otra historia mucha más adelante. Por ahora me conformo en entender lo más básico.