Domanda

Ho un indirizzo che vorrei modificare. Ho il processo. Ho il nuovo valore. Così ora che cosa?

// My Process
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

Come faccio a scrivere 0x63 (99) a questo indirizzo su un altro memoria di processo?

È stato utile?

Soluzione

@Harvey, dalla tua risposta che ho scavato e trovato un sacco:

aprire, chiudere e scriviamo le firme:

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

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out int lpNumberOfBytesWritten);

[DllImport("kernel32.dll")]
public static extern Int32 CloseHandle(IntPtr hProcess);

Bandiere:

[Flags]
public enum ProcessAccessFlags : uint
{
    All = 0x001F0FFF,
    Terminate = 0x00000001,
    CreateThread = 0x00000002,
    VMOperation = 0x00000008,
    VMRead = 0x00000010,
    VMWrite = 0x00000020,
    DupHandle = 0x00000040,
    SetInformation = 0x00000200,
    QueryInformation = 0x00000400,
    Synchronize = 0x00100000
}

Crea il mio metodo più semplice la vita:

public static void WriteMem(Process p, int address, long v)
{
    var hProc = OpenProcess(ProcessAccessFlags.All, false, (int)p.Id);
    var val = new byte[] { (byte)v };

    int wtf = 0;
    WriteProcessMemory(hProc, new IntPtr(address), val, (UInt32)val.LongLength, out wtf);

    CloseHandle(hProc);
}

Scrittura in un'altra memoria del processo:

static void Main(string[] args)
{
    var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();

    WriteMem(p, 0x00A66DB9, 99);
}

Altri suggerimenti

WriteProcessMemory a pinvoke.net

Ecco un altro su StackOverflow, ma stanno parlando C ++. Si può fare lo stesso utilizzando PInvoke.

Nonostante P / Invoke funzioni native come WriteProcessMemory funziona perfettamente, le librerie dedicate alla modifica esistere la memoria e vi permette di eseguire questa operazione in un modo più semplice.

Utilizzando la libreria MemorySharp , questo può essere riassunto come:

using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault()))
{
   sharp[0x00A66E11, false].Write(0x63);
}

Il codice precedente assume che l'indirizzo in cui il valore viene scritto non è ricalcolato.

È possibile utilizzare WriteProcessMemory , ma essere consapevoli che è necessario attivare i privilegi di debug, e che non funzionerà con un sacco di processi garantiti in Vista e versioni successive.

E che probabilmente spara in un piede e crash le cose un paio di volte. Vi suggerisco non si dispone di tutti i programmi importanti in esecuzione quando si esegue questa operazione.

Buona fortuna, ne avrai bisogno. :)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top