私はプロセスを作成し、彼のメモリのいくつかのビットを読み取るプログラムを書いています。アドレスを取得するために、私はデバッガOllyDbgを使用しました。ReadProcessMemory with C#
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace winapi
{
class Program
{
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool ReadProcessMemory(
IntPtr hProcess,
IntPtr lpBaseAddress,
[Out] byte[] lpBuffer,
int dwSize,
out UInt32 lpNumberOfBytesRead
);
static void Main()
{
Console.WriteLine("WinAPI test");
Console.WriteLine("---");
Console.WriteLine();
var startInfo = new ProcessStartInfo { FileName = "Program.exe" };
Process p = Process.Start(startInfo);
var bytes = new byte[4];
uint read = 0;
p.WaitForInputIdle();
//
while (read == 0)
{
ReadProcessMemory(p.MainWindowHandle, (IntPtr)0x052f820, bytes, bytes.Length, out read);
System.Threading.Thread.Sleep(10);
}
Console.WriteLine(read.ToString());
Console.ReadLine();
}
}
}
プロセスの開始後、ループは終了しません。デバッガからの データ:
0052F820 | 75 2F 3F 72 61 67 65 5F 69 64 3D 31 33
私のミスですか?
ドキュメントによると、関数が失敗した場合は0を返します。戻り値をチェックしていない場合は、それは成功していますか?そうでなければ、あなたが間違っていることを教えてくれるはずです。 –
また、メモリアドレスは毎回完全に異なる場合があります。 – Deanna