C# - 读写进程内存、指针和偏移量游戏服务器管理工具

本文关键字:偏移量 游戏 服务器 管理工具 指针 读写 进程 内存 | 更新日期: 2023-09-27 18:31:37

我正在为游戏编写服务器管理器,却卡在 C# 中的指针和偏移量中。旧的服务器管理器是用 vb6 编写的,由于某种原因在我的 Windows 上不起作用,所以我决定用 C# 编写它的一些基本功能。

有现在所有必要的指针和偏移值,我写这篇文章只是为了获取所有玩家的名字。

玩家指针 = 96C290 玩家名称偏移量 = +20

偏移量 +668 给我下一个玩家指针,将 +20 添加到下一个玩家应该给我下一个玩家名字,依此类推。

读取第一个玩家姓名

  public static IntPtr BASE_ADDR = new IntPtr(0x96C290);
  public static IntPtr OFFSET_NAME = new IntPtr(0x20);
  const int PROCESS_WM_READ = 0x0010;
  public static void Read()
  {
        Process process = Process.GetProcessesByName("gameprocessname")[0];
        IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);   
        //defining data structures
        int bytesRead = 0;
        byte[] buffer = new byte[4];
        //Reading Base Address pointer value
        ReadProcessMemory((int)processHandle,(int)BASE_ADDR, buffer, 4, ref bytesRead);
        IntPtr myBaseAddress = new IntPtr(BitConverter.ToInt32(buffer, 0));
        //Adding offset of 20 to original base pointer address
        IntPtr namePointer = BASE_ADDR;
        namePointer = IntPtr.Add(namePointer,(int)OFFSET_NAME);

        //Getting memory address of name pointer
        ReadProcessMemory((int)processHandle, (int)namePointer,buffer, 4, ref bytesRead);
        IntPtr playerNameAddress = new IntPtr(BitConverter.ToInt32(buffer, 0));

        //reading name from name address . ASCII and Unicode
        byte[] playerNameBuffer = new byte[256];
         ReadProcessMemory((int)processHandle, (int)playerNameAddress, buffer, 256, ref bytesRead);
        string name = Encoding.Default.GetString(playerNameBuffer);
        MessageBox.Show(name);

        }

我没有获得玩家姓名。用 VB6 编写的脚本是可操作的。我使用的是Win8.1 64位,游戏是非常旧的32位应用程序。

可能有什么问题? 我使用作弊引擎手动查看值,但它也没有显示任何内容。指针和偏移值正确。

我使用了不同的偏移值,但没有一个返回正确的值。

问题是**如果我在编码端做错了什么?或者它是OS 64位问题。

C# - 读写进程内存、指针和偏移量游戏服务器管理工具

我没有

测试该程序(因为我没有/不知道游戏),但我看到您阅读了myBaseAddress然后您不使用它,可能是问题出在以下几行中

IntPtr namePointer = BASE_ADDR;
namePointer = IntPtr.Add(namePointer,(int)OFFSET_NAME);

那应该是

IntPtr namePointer = myBaseAddress ;
namePointer = IntPtr.Add(namePointer,(int)OFFSET_NAME);