¿Cómo puedo escribir en otra memoria de proceso?
-
30-09-2019 - |
Pregunta
I tiene una dirección que me gustaría modificar. Tengo el proceso. Tengo el nuevo valor. ¿Y ahora qué?
// My Process
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
// Address
var addr = 0x00A66E11;
// Value
var val = 0x63;
¿Cómo puedo escribir 0x63
(99) a esta dirección de memoria en otro proceso?
Solución
@Harvey, de su respuesta que desenterrado y se encontró una gran cantidad:
abrir, cerrar y escritura firmas:
[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);
Banderas:
[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
}
hacer mi vida más fácil método:
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);
}
Escribir en otra memoria de proceso:
static void Main(string[] args)
{
var p = Process.GetProcessesByName("ePSXe").FirstOrDefault();
WriteMem(p, 0x00A66DB9, 99);
}
Otros consejos
WriteProcessMemory en pinvoke.net
Aquí es otro en StackOverflow, sino que están hablando de C ++. Puede hacer lo mismo usando PInvoke.
A pesar de las funciones nativas P / Invoke como WriteProcessMemory
funciona perfectamente, bibliotecas dedicadas a existir la edición de la memoria y le permite realizar esta tarea de una manera más fácil.
El uso de la biblioteca MemorySharp , esto se puede resumir como:
using(var sharp = new MemorySharp(Process.GetProcessesByName("ePSXe").FirstOrDefault()))
{
sharp[0x00A66E11, false].Write(0x63);
}
El código anterior asume la dirección donde se escribe el valor no está rebasada.
Puede utilizar WriteProcessMemory , pero tenga en cuenta que se necesita para encender privilegios de depuración, y que no va a funcionar con una gran cantidad de procesos garantizados en Vista y posteriores.
Y eso es probable que disparar en el pie y Crash cosas un par de veces. Yo sugeriría que no tiene ningún importantes programas en ejecución cuando usted hace esto.
Buena suerte, lo necesitará. :)