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

但是当我在网上寻找时,我不断发现:

但是我实际上需要读取地址 samp.dll+2071C0 而不是 0xB6F5F0 (我在网上找到的这个地址)

有谁知道我该怎么做?

提前致谢

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++)。

湾。如果没有,请像加载二进制文件一样加载 dll 并从文件中读取。

于 2012-05-06T16:40:04.103 回答