【发布时间】:2016-02-17 20:08:29
【问题描述】:
如何读取带有模块基地址的内存? 例如如何读取这个内存:“winCap64.dll”+0x123456 + offsets。
我添加了一个示例代码,说明经过一些研究后我可以生成什么,但我仍然无法阅读 C# 中的任何内容。但是地址绝对没问题,因为当我将它们添加到 Cheat Engine 时,它们会返回正确的值。
编辑:添加示例代码
[DllImport("kernel32.dll")]
static extern IntPtr OpenProcess(UInt32 dwDesiredAccess, Boolean bInheritHandle, UInt32 dwProcessId);
[DllImport("kernel32.dll")]
static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress,
byte[] lpBuffer, UIntPtr nSize, uint lpNumberOfBytesWritten);
static IntPtr Handle;
static void Main(string[] args)
{
Process[] Processes = Process.GetProcessesByName("process");
Process nProcess = Processes[0];
Handle = OpenProcess(0x10, false, (uint)nProcess.Id);
IntPtr pointer = IntPtr.Add(nProcess.Modules[125].BaseAddress, 0x020C5150);
int curhp = ReadOffset(pointer, 0x4D8);
int curhp2 = ReadOffset((IntPtr)curhp, 0x0);
int curhp3 = ReadOffset((IntPtr)curhp2, 0x1c0);
Console.WriteLine(curhp3.ToString());
Console.ReadKey();
}
public static int ReadOffset(IntPtr pointer, uint offset)
{
byte[] bytes = new byte[24];
uint adress = (uint)ReadPointer(pointer) + offset;
ReadProcessMemory(Handle, (IntPtr)adress, bytes, (UIntPtr)sizeof(int), 0);
return BitConverter.ToInt32(bytes, 0);
}
public static int ReadPointer(IntPtr pointer)
{
byte[] bytes = new byte[24];
ReadProcessMemory(Handle, pointer, bytes, (UIntPtr)sizeof(int), 0);
return BitConverter.ToInt32(bytes, 0);
}
【问题讨论】:
-
听起来你在 64 位世界中需要
nProcess.Modules[125].BaseAddress.ToInt64() + 0x02093458? -
@Ctx 也可以使用
long而不是int。 -
这确实可以解决算术异常,但为什么我仍然无法读取内存?
-
IIRC 目标架构设置为
Any CPU的程序将无法读取专门在x86或x86_64架构上运行的程序的内存,例如 C/C++ 程序和某些.NET 程序。尝试在Properties > Build中将项目的“平台目标”设置为x64 -
在上面的示例中,我相信它只是缺少编码。如果编码正确,它应该可以工作。
标签: c# memory module memory-address