1

C# でプロセスからメモリを読み込もうとしています。特定のアドレスから読み取る方法を見つけました:

    public static byte[] ReadMemory(Process process, int address, int numOfBytes, out int bytesRead)
    {
        IntPtr hProc = OpenProcess(ProcessAccessFlags.All, false, process.Id);
        byte[] buffer = new byte[numOfBytes];
        ReadProcessMemory(hProc, new IntPtr(address), buffer, numOfBytes, out bytesRead);
        return buffer;
    }
    private int getVal(Process proc, int address)
    {
        int bytesRead;
        byte[] value = ReadMemory(proc, address, 4, out bytesRead);
        int am = BitConverter.ToInt32(value, 0);
        return am;
    }
    public void threadFunction()
    {
        Process[] processes = Process.GetProcessesByName("gta_sa");
        foreach (Process process in processes)
        {
            int ServerPointer = getVal(process, 0xB6F5F0);//Its about this line
            MessageBox.Show(ServerPointer.ToString());
        }
    }

しかし、私がウェブを見ていると、私はこれを見つけ続けます:

しかし、0xB6F5F0 の代わりに、実際にはアドレス samp.dll+2071C0 を読み取る必要があります (このアドレスは Web で見つけました)。

誰も私がこれを行う方法を知っていますか?

前もって感謝します

4

2 に答える 2

4

DLLのベースアドレスを知る必要があります。これはProcess.Modulesからすぐに利用でき、ProcessModule.BaseAddressプロパティ値が必要です。例:

using System;
using System.Diagnostics;

class Program {
    static void Main(string[] args) {
        var prc = Process.Start("notepad.exe");
        prc.WaitForInputIdle();
        foreach (ProcessModule module in prc.Modules) {
            if (string.Compare(module.ModuleName, "user32.dll", true) == 0) {
                Console.WriteLine("User32 loaded at 0x{0:X16}", (long)module.BaseAddress);
                break;
            }
        }
        prc.Kill();
        Console.ReadLine();
    }
}

出力:

User32が0x0000000076F20000でロードされました

于 2012-05-06T16:43:13.453 に答える
0

dll からデータを読み込もうとしている場合は、なぜ...

を。dll がメモリ内にあり、既知の構造 (.NET など) である場合は、その中のデータ構造 (.NET クラスまたは C++ の静的フィールドなど、ヘッダー経由) から読み取ります。

b. そうでない場合は、バイナリ ファイルと同じように dll をロードし、ファイルから読み取ります。

于 2012-05-06T16:40:04.103 に答える