10

変更したい住所があります。私はプロセスを持っています。私は新しい価値を持っています。んで、どうする?

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

// Address
var addr = 0x00A66E11;

// Value
var val = 0x63;

0x63別のプロセスメモリのこのアドレスに (99)を書き込むにはどうすればよいですか?

4

4 に答える 4

13

@ハーベイ、あなたの答えから私は掘り下げてたくさん見つけました:

署名を開く、閉じる、書き込む:

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

フラグ:

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

私の人生をより簡単にする方法:

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

別のプロセスメモリへの書き込み:

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

    WriteMem(p, 0x00A66DB9, 99);
}
于 2011-01-07T06:56:42.173 に答える
4

pinvoke.netで WriteProcessMemory を確認してください。

これは StackOverflow に関する別の同様の投稿ですが、C++ について話しているものです。pinvoke を使用して同じことができます。

于 2011-01-07T06:31:29.413 に答える
0

WriteProcessMemoryを使用できますが、デバッグ権限をオンにする必要があり、Vista以降の多くのセキュリティで保護されたプロセスでは機能しないことに注意してください。

そして、あなたはおそらく自分の足を撃ち、物事を数回クラッシュさせるでしょう。これを行うときは、重要なプログラムを実行していないことをお勧めします。

頑張ってください、あなたはそれを必要とするでしょう。:)

于 2011-01-07T06:50:59.163 に答える