Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Meta

#851
Hola:

Estoy con el código de ejemplo y me da errores por todas partes.

Lo he intentado compilar con Visual C++ 2013. Aquí esté el ejemplo.

Descargar

Saludo.

Edito:

Hola de nuevo.

Viendo ejemplo desde aquí.
http://www.codeproject.com/Articles/670373/Csharp-Read-Write-another-Process-Memory

Puedo leer algo, pero me da cosas raras.


Ver pantalla compelta.

Quiero que la variable que es 100 en el juego, aparezca en C# y no aparece. Sino signos que no viene a cuento, al menos de lo que busco.

Saludo.
#852
Hola:

Viendo el ejemplo que has hecho, no consigo que me funcione en C#. Dejo aquí el ejemplo. Solo creé un Windows Form C# 2013 y ya está.

Código (csharp) [Seleccionar]
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 System.Runtime.InteropServices; // No olovidar este using.

namespace AAA_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

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

        private IntPtr FindAddress(IntPtr pHandle, IntPtr BaseAddress, IntPtr StaticPointer, IntPtr[] Offsets)
        {
            // Create a buffer that is 4 bytes on a 32-bit system or 8 bytes on a 64-bit system.
            byte[] tmp = new byte[IntPtr.Size];
            IntPtr Address = BaseAddress;
            // We must check for 32-bit vs 64-bit.
            if (IntPtr.Size == 4)
            {
                Address = new IntPtr(Address.ToInt32 + StaticPointer.ToInt32);
            }
            else
            {
                Address = new IntPtr(Address.ToInt64 + StaticPointer.ToInt64);
            }
            // Loop through each offset to find the address
            for (int i = 0; i < Offsets.Length; i++)
            {
                ReadProcessMemory(pHandle, Address, tmp, IntPtr.Size, 0);
                if (IntPtr.Size == 4)
                {
                    Address = BitConverter.ToInt32(tmp, 0) + Offsets(i).ToInt32();
                }
                else
                {
                    Address = BitConverter.ToInt64(tmp, 0) + Offsets(i).ToInt64();
                }
            }
            return Address;
        }


        // I'm assuming p is a Process object that represents the game process.
        IntPtr pID = p.Handle;
        IntPtr @base = p.MainModule.BaseAddress;
        // Our static pointer...
        IntPtr sptr = 0x62b688;
        // And our offsets...
        IntPtr[] offsets = { 0xc, 0x38 };
        IntPtr addr = FindAddress(pID, @base, sptr, offsets);


    }
}


Saludo.
#853
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.
#854
A veces es mejor empezar por lo más simple.

Me han comentado amigos que vieron por el aire y no tienen tiempo para ver más, esa DLL es par injectar código a un exe, no para leer.

Así que, ya tengo las direcciones de memoriade las variables y en ella está Vida, que es la que quiero como ejemplo.

Para dejar claro lo que quiero. :)

1) Ejecutar un juego que alguien hizo con Visual C++ Win32 bajo console. No se su código fuente y en este caso no debo saberlo. El juego consiste en cambiar variables para detectarlas, como Vida, Balas y Maná.

2) Con el programa llamado Cheat Engine 6.3 encuentro las direcciones de las variables que me hace falta. Este programa en realidad es para hacer trampas en los juegos como vida infinita y cosas de estas. En mi caso es diferente que diré al final.

3) Crear una DLL en Visual C++ 213 Win32 para detectar la variable Vida, bala y Maná. Para hacer pruebas, me conformmo con la variable Vida.

4) Con Visual C#, usando Windows Form. También se puede hacer con modo consola, en mi caso el Form. Poner un label1 que nombraré como label_vida en el Form1.Windows Form de C# debe ser capaz de leer la variable Vida.

5) Dejo claro que quiero crear una DLL en C++ Win32 porque trabaja más rápido que FramWork .net. Motor interno para cálculo C++ Win32 y Interfaz para ver los valores, cualquiera basta, en mi caso usarlo con Visual C#.

6) Cada vez que el juego cambia el valor de la variable Vida, en tu aplicación hecha con Windows Form C# y la DLL, debe mostrar en pantalla en tiempo real la variable Vida. Abajjo, una imagen del juego sencillo con la variable Vida a 100.



7) Aquí abajo, Windows Form con sus variables que debe leer este llamado HackMe.



8) Cuando en el juego cambia de 100 a 99, en el Windows Form de C# debe aparecer lo mismo. Están como sincronizado.

Eso es todo. Sabía que para mi es complicado, pero no tanto, jajajaja.

Saludo.
#855
Hola:

Tengo una variable creada conVisual C++ 2013 en Win32. Su código es de abajo. Tiene variables que se llama Vida, Balas y Mana.

#include <stdio.h>
#include <Windows.h>

bool vida = false; // = true;
bool balas = false;
bool mana = false;

bool salir = false;

void Hacks()
{
DWORD entryPoint = (DWORD)GetModuleHandle(NULL);
while (!salir) // while ("NO" (salir == true)) => while (salir == false) --> "mientras no salir" --> "mientras no tengamos que salir"
{
DWORD estructura = *(DWORD*)(entryPoint + 0x544C);

// HACK VIDA = 100
if (vida) // if (vida == true) -> "Si la vida es verdadera"
{
// Nivel 1
*(DWORD*)(entryPoint + 0x5444) = 100;

// Nivel 2
// PUNTERO -> DIRECCION (ADDRESS) -> VIDA
DWORD direccion = *(DWORD*)(entryPoint + 0x5448);
if (direccion != 0)
{
*(DWORD*)(direccion) = 100;
}

// Nivel 3
// PUNTERO (ESTRUCTURA) -> DIRECCION (ADDRESS) + OFFSET -> VIDA
if (estructura != 0)
{
*(DWORD*)(estructura + 0) = 100;
}
}

if (balas)
{
// Nivel 1
*(DWORD*)(entryPoint + 0x5454) = 10;

// Nivel 2
// PUNTERO -> DIRECCION (ADDRESS) -> BALAS
DWORD direccion = *(DWORD*)(entryPoint + 0x5460);
if (direccion != 0)
{
*(DWORD*)(direccion) = 10;
}

// 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
*/
}

// 's' => balas = activar/desactivar (true/false)
if (GetAsyncKeyState(VkKeyScan('s')) & 1)
{
balas = !balas;
}

// 'd' => mana = activar/desactivar (true/false)
if (GetAsyncKeyState(VkKeyScan('d')) & 1)
{
mana = !mana;
}

Sleep(300);
}
}

// DllMain <---
// Cierra --> Dllmain
BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID reserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
// OK! Estamos dentro!
// Thread
// Hacks();
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Hacks, 0, 0, 0);
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Teclado, 0, 0, 0);
}
else if (reason == DLL_PROCESS_DETACH)
{
// Salimos del juego!
salir = true;
}

// Devolver
return 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.

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.

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.

Espero que se entienda y me ayuden.

Saludo.
#856
Depende de la empresa y época. Nuevo año, nuevos precios.

Por ebay salen más barato, o en tiendas on-line.

Saludo.
#857
Es cuestión de tiempo todo a 64 bits.

Tampoco hay que centrarse siempre en los 32 bits, entonces. ¿Cuándo pasamos a los 64 bits?

¿Dentro ed 20 años?

¿Cuándo las noticias empiecen a comentar sobre las nuevas 128 bits? A lo mejor quedan 50 años para que llegue.

Como me dijo un amigo, usa 32 bits, también haz otro preparado para las 64 bits, jejejejje. Solo que las 32 bits llegan a casi 4 GB de RAM como máximo. En 64 bits, si no recuerdo mal,usan 192 GB de RAM, esto ya no estoy seguro. Aún así, ¿para qué tanta RAM?

El juego de PC Call of Duty: Ghost, hubo una queja de que requería cuando salió el juego al principio, 6 GB de RAM mínomo, alguien lo parcheó y se puede jugar con  4 GB e includo con 3 GB medianamente bien, con buen rendimiento incluido. O juegas con 6 GB de RAM, o lo parchear el ejecutable. Al final el juego salió un parche oficial sin decir que tiene, pero resuelve el problema de que ya se puede jugar oficialmente a 4 GB.

¿Ya tienen intensiones las empresas a ampliar RAM en los juegos cuando la realidad es distinta para hacernos negocios?

Programar en 64 bits, se necesita más RAM, más claro que el agua. Total, .net será el futuro y nativo como que será eliminado con los años y años, cuando lleve las cosas en la nube, peor todavía.

Un saludo.
#858
Cita de: x64Core en 15 Marzo 2014, 18:38 PM
y recomiendo hacerlo en Win32.


Win32 ahora, y en el futo...

¿Win64 (por llamarlo de alguna manera) no es remomendable?

En la época de los 16 Bits y 32 bits pasaba algo similar.

Tarde o temprano, los 64 bits será lo que hay y muy poco de 32 bits como ahora se piensa de los 16 bits. ;)

Eso si, requiere por lo menos una década más o casi.

Eso sin contrar que todo será enla nube.

Saludo.
#859
De nada, y si, maldita sea. Menos al que se puede desbloquear.
#860
Hola:

Me imagino que será de inyección, si es por toner la marca Brother, ya que son más baratos al recargar.

HP son mejores y está demostrado, también los más careros.

Epson por el sistema continuo de cargar tintas.

Los tres fabricantes tienen el mismo problema, programados para no durar hasta que se acabe la garantía.

Como calidad prefiero HP, como mantenimiento y para desbloquearla cuando se bloquee cuando llegue un número determinado de impresiones, dirá que una de las piezas fallan y no es así.

[youtube=640,360]https://www.youtube.com/watch?v=V2yCimJu7Ec[/youtube]

Mejor Brother, no necesita software para resetear como Epson ni resetear la EEPROM de HP uniendo el pin 1 y 4 que hay que abrir la impresora.

Brother lohaces del propio menú que lo explico aquí, verlo en PDF es versión más completa.

http://electronica-pic.blogspot.com.es/2014/03/resetear-contador-impresora-brother-mfc.html

Saludo.