-1

ゲームのサーバー マネージャーをコーディングしていて、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ビットの問題です。**

4

1 に答える 1

0

プログラムをテストしませんでした(ゲームを持っていない/知らないため)が、 myBaseAddress を読んでから使用しないことがわかりました。問題は次の行にある可能性があります

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

それはあるべきです

IntPtr namePointer = myBaseAddress ;
namePointer = IntPtr.Add(namePointer,(int)OFFSET_NAME);
于 2016-01-23T15:34:41.380 に答える