2011-01-07 19 views
5

私は修正したいアドレスを持っています。私はそのプロセスを持っています。私は新しい価値を持っています。んで、どうする?別のプロセスメモリに書き込む方法はありますか?

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

// Address 
var addr = 0x00A66E11; 

// Value 
var val = 0x63; 

私は書くことができますどのように他のプロセスメモリ上のこのアドレスへ0x63(99)?

+0

Do not user 'var addr' ...デフォルトでは' int'です。代わりに 'IntPtr'を使用してください。 – Mehrdad

答えて

10

@Harveyは、あなたの答えから私が掘っやロットが見つかりました:

開き、閉じると書くの署名:

[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); 
} 
+5

ええと...私は決して、あなたは決して**メモリアドレスを表すために 'int'をもう一度使うことをお勧めしますか?ありがとうございました。 :) – Mehrdad

+0

私は 'IntPtr'を入力するのが面倒ですが、私はそれを念頭に置いておきます:P – BrunoLM

+1

WriteMem()でCloseHandle()を忘れた –

4

pinvoke.netここ

WriteProcessMemoryをチェックアウトはStackOverflowの上の別の類似postであるが、彼らはC++について話しています。あなたはpinvokeを使って同じことをすることができます。

+0

それとあなたが必要とする高額権利に関する実際の文書はありません。管理者アカウントでさえ十分ではありません。 http://msdn.microsoft.com/en-us/library/ms681674(v=vs.85).aspxは出発点です。 – TomTom

+0

ありがとう、この参照から私はたくさん見つけた:) – BrunoLM

0

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

あなたはたぶん足で自分を撃ち、何回か物事をクラッシュさせるでしょう。私はあなたがこれを行うときに実行している重要なプログラムを持っていないことをお勧めします。

幸いです、あなたはそれが必要です。 :)

2

などWriteProcessMemory作品完璧P /呼び出しネイティブ関数にもかかわらず、メモリ編集に特化したライブラリが存在し、あなたが簡単な方法でこのタスクを実行することができます:別のプロセスのメモリへの書き込み。ライブラリMemorySharpを使用

ように、これは要約することができる。前のコード値が書き込まれているアドレスが再配置されていない前提

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

関連する問題