2016-01-23 31 views
-1

我編寫了一個服務器管理器的遊戲,並在C#中卡住了指針和偏移量。舊的服務器管理器是用vb6編寫的,由於某些原因,我的窗戶無法工作,所以我決定在C#中編寫它的一些基本功能。C# - 讀寫進程內存,指針和偏移Gamer服務器管理工​​具

我有指針和偏移值的一切是必要的現在我只寫爲獲取所有玩家的名字。

球員指針= 96C290球員名稱偏移量= +20

偏移的給我未來的球員指針,並添加+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 64bit和遊戲是很老的32位應用程序。

可能是什麼問題?我使用作弊引擎手動查看值,但它也沒有顯示任何內容。指針和偏移值是正確的。

我已經使用不同的偏移值,但沒有得到任何返回正確的值。

問題是**如果我在編碼結束時做錯了什麼?或者它是OS 64位的問題。 **

回答

0

我沒有測試程序(因爲我沒有/知道遊戲)但是我看到你讀了myBaseAddress那麼你就不用它了,可能問題是在下面的行

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

,應該是

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