使用带偏移的基本指针读取进程内存

我已经在网上搜索了几个小时,并且不能为我的生活理解为什么下面的代码不起作用。

为该过程提取的基地址似乎是错误的 。 如果我将结束地址直接硬编码到ReadMemory ,我会得到所需的值(所以我知道我有正确的过程和所有)。

我还没有发布MemoryHandler类,因为它正常工作

这可能与我在64位窗口上的事实有关吗? 游戏是32位(安装在“Program Files(x86)”文件夹中)。

 public partial class MainForm : Form { Process myProcess = Process.GetProcessesByName("ffxiv").FirstOrDefault(); public MainForm() { InitializeComponent(); } private void startButton_Click(object sender, EventArgs e) { IntPtr baseAddress = myProcess.MainModule.BaseAddress; Console.WriteLine("Base Address: " + baseAddress.ToString("X")); IntPtr newAddr = IntPtr.Add(baseAddress, 0xF8BEFC); IntPtr finalAddr = IntPtr.Add(newAddr, 0x1690); int bytesRead; byte[] memoryOutput = MemoryHandler.ReadMemory(myProcess, finalAddr, 4, out bytesRead); int value = BitConverter.ToInt32(memoryOutput, 0); Console.WriteLine("Read Value: " + value); } } 

编辑:基地址是对的,我的代码逻辑指针错误,请参阅下面的完整答案。

所以,大卫的评论说基地址不能是奇数,让我觉得也许我从Cheat Engine得到的数字实际上不是基地址。 结果certificate是正确的。 我的代码实际上是在拉正确的基地址。 我之前发布的数字(9460301)实际上是存储在内存中的基地址位置(而不是地址本身)。

无论如何,上面的代码获取基地址并添加第一个偏移量,然后添加下一个偏移量,然后读取该地址上的内存。 这是错误的,这不是多级指针的工作方式。 对于每个级别,您必须读取内存并查看存储在该地址的内容。 您找到的值将是您的下一个地址,您将应用下一个偏移量,等等。

正确的代码是:

 public partial class MainForm : Form { Process myProcess = Process.GetProcessesByName("ffxiv").FirstOrDefault(); public MainForm() { InitializeComponent(); } private void startButton_Click(object sender, EventArgs e) { int bytesRead; IntPtr baseAddress = myProcess.MainModule.BaseAddress; Console.WriteLine("Base Address: " + baseAddress); IntPtr firstAddress = IntPtr.Add(baseAddress, 0xF8BEFC); IntPtr firstAddressValue = (IntPtr)BitConverter.ToInt32(MemoryHandler.ReadMemory(myProcess, firstAddress, 4, out bytesRead), 0); IntPtr finalAddr = IntPtr.Add(firstAddressValue, 0x1690); Console.WriteLine("Final Address: " + finalAddr.ToString("X")); byte[] memoryOutput = MemoryHandler.ReadMemory(myProcess, finalAddr, 4, out bytesRead); int value = BitConverter.ToInt32(memoryOutput, 0); Console.WriteLine("Read Value: " + value); } } 

我想知道,如何使这个非特定的32位窗口? 我真的不喜欢Int32()函数和后续的IntPtr转换,所以想知道是否有任何方法可以直接从byte []转到IntPtr。 我尝试了元帅副本等,但无法让它发挥作用。

再次感谢!