Come posso scrivere su un altro memoria del processo?
-
30-09-2019 - |
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?
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. :)