You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#添加偏移量计算地址与Cheat Engine结果不一致求助

解决C#计算游戏内存地址与Cheat Engine不符的问题
  • 核心问题:忽略了多级指针的解引用
    Cheat Engine中显示的最终内存地址,大多是通过多级指针链计算得到的,不是基地址直接加单级偏移就能得到。你当前的代码只做了基地址+一级偏移,没有处理后续的指针解引用步骤,所以地址对不上。

  • 确认Cheat Engine的指针结构
    打开Cheat Engine查看目标数值的地址,格式通常是类似:

    ac-client.exe + 0x17E0A8 -> 0x00856000 + 0xD70
    其中->表示对前一个地址进行解引用(读取该地址存储的内存值),后面跟着下一级偏移。你看到的0x00856D70是经过至少一次解引用后的最终地址。

  • 正确的地址计算步骤(以二级指针为例)
    假设Cheat Engine的指针链是基地址 + 0x17E0A8 -> 指针值 + 0xD70,正确计算流程:

    1. 计算一级指针地址:0x00400000 + 0x17E0A8 = 0x0057E0A8(这就是你代码里得到的地址,是指针的存储地址,不是最终数值的地址)
    2. 从0x0057E0A8这个地址读取内存中的值(比如得到0x00856000)
    3. 用读取到的值加上二级偏移: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转换指针值。
    • 如果指针链有更多层级,重复“读取指针值+加偏移”的步骤即可。
    • 确保程序以管理员权限运行,否则可能无法读取游戏进程内存。

内容的提问来源于stack exchange,提问作者nico-src

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 07:54:52