从C#中的dll进程读取内存

时间:2012-05-06 16:30:34

标签: c# memory

我正在尝试从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

有谁知道我该怎么做?

提前致谢

2 个答案:

答案 0 :(得分:3)

您需要知道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

答案 1 :(得分:0)

如果您尝试从dll读取数据,为什么不...

一个。如果dll在内存中并且具有已知结构(例如.NET),则从其中的数据结构中读取(例如.NET类的静态字段或通过标头的C ++)。

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