C#添加偏移量计算地址与Cheat Engine结果不一致求助
解决C#计算游戏内存地址与Cheat Engine不符的问题
核心问题:忽略了多级指针的解引用
Cheat Engine中显示的最终内存地址,大多是通过多级指针链计算得到的,不是基地址直接加单级偏移就能得到。你当前的代码只做了基地址+一级偏移,没有处理后续的指针解引用步骤,所以地址对不上。确认Cheat Engine的指针结构
打开Cheat Engine查看目标数值的地址,格式通常是类似:ac-client.exe + 0x17E0A8 -> 0x00856000 + 0xD70
其中->表示对前一个地址进行解引用(读取该地址存储的内存值),后面跟着下一级偏移。你看到的0x00856D70是经过至少一次解引用后的最终地址。正确的地址计算步骤(以二级指针为例)
假设Cheat Engine的指针链是基地址 + 0x17E0A8 -> 指针值 + 0xD70,正确计算流程:- 计算一级指针地址:
0x00400000 + 0x17E0A8 = 0x0057E0A8(这就是你代码里得到的地址,是指针的存储地址,不是最终数值的地址) - 从0x0057E0A8这个地址读取内存中的值(比如得到0x00856000)
- 用读取到的值加上二级偏移:
0x00856000 + 0xD70 = 0x00856D70,这才是Cheat Engine显示的最终地址
- 计算一级指针地址:
C#实现代码示例
你需要调用Windows API的ReadProcessMemory来读取指针值,示例代码如下:using System; using System.Diagnostics; using System.Runtime.InteropServices; class MemoryReader { [DllImport("kernel32.dll")] public static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int dwSize, out int lpNumberOfBytesRead); static void Main(string[] args) { string processName = "ac-client.exe"; Process gameProcess = Process.GetProcessesByName(processName).FirstOrDefault(); if (gameProcess == null) return; // 一级偏移(替换为你在Cheat Engine中获取的实际一级偏移) int offset1 = 0x17E0A8; // 二级偏移(替换为你在Cheat Engine中看到的实际二级偏移) int offset2 = 0xD70; // 计算一级指针地址 IntPtr ptrAddress = IntPtr.Add(gameProcess.MainModule.BaseAddress, offset1); // 读取一级指针的值(32位游戏读4字节,64位读8字节,这里以32位为例) byte[] buffer = new byte[4]; ReadProcessMemory(gameProcess.Handle, ptrAddress, buffer, buffer.Length, out _); IntPtr ptrValue = (IntPtr)BitConverter.ToInt32(buffer, 0); // 计算最终地址 IntPtr finalAddress = IntPtr.Add(ptrValue, offset2); Console.WriteLine("基地址: " + gameProcess.MainModule.BaseAddress.ToString("X")); Console.WriteLine("一级指针地址: " + ptrAddress.ToString("X")); Console.WriteLine("读取到的指针值: " + ptrValue.ToString("X")); Console.WriteLine("最终地址: " + finalAddress.ToString("X")); } }注意事项
- 确认游戏是32位还是64位:如果是64位游戏,需要把读取的字节数改成8,用
BitConverter.ToInt64转换指针值。 - 如果指针链有更多层级,重复“读取指针值+加偏移”的步骤即可。
- 确保程序以管理员权限运行,否则可能无法读取游戏进程内存。
- 确认游戏是32位还是64位:如果是64位游戏,需要把读取的字节数改成8,用
内容的提问来源于stack exchange,提问作者nico-src
相关产品推荐
相关产品推荐

