Question

J'ai une adresse que je souhaite modifier. Je le processus. J'ai la nouvelle valeur. Alors maintenant, quoi?

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

Comment puis-je écrire 0x63 (99) à cette adresse sur une autre mémoire du processus?

Était-ce utile?

La solution

@Harvey, de votre réponse que je déterré et trouvé beaucoup:

Ouvrir, Fermer et écriture des signatures:

[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);

Drapeaux:

[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
}

Faire ma méthode de vie plus facile:

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);
}

L'écriture dans une autre mémoire de processus:

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

    WriteMem(p, 0x00A66DB9, 99);
}

Autres conseils

Consultez WriteProcessMemory à pinvoke.net

Voici une autre similaire sur StackOverflow mais ils parlent C ++. Vous pouvez faire la même chose en utilisant PInvoke.

En dépit des fonctions natives P / Invoke tels que WriteProcessMemory fonctionne parfaitement, les bibliothèques dédiées Exister édition de la mémoire et vous permet d'accomplir cette tâche d'une manière plus facile.

Utilisation de la bibliothèque MemorySharp , cela peut se résumer comme suit:

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

Le code précédent suppose que l'adresse où la valeur est écrite est rebasées.

Vous pouvez utiliser WriteProcessMemory , mais sachez que vous devez activer les privilèges de débogage, et que cela ne fonctionnera pas avec beaucoup de processus sécurisés dans Vista et versions ultérieures.

Et que vous aurez probablement vous tirer une balle dans le pied et écrasez les choses plusieurs fois. Je vous suggère de ne pas avoir des programmes importants en cours d'exécution lorsque vous faites cela.

Bonne chance, vous en aurez besoin. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top