我正在尝试从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
有谁知道我该怎么做?
提前致谢
答案 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并从文件中读取。