2017-01-01 117 views
1

我一直在研究一個小型項目 - 我試圖創建一個C#程序,它將從遊戲「英雄聯盟」中讀取人物的HP。如何使用Base地址和指針讀取進程內存

我做了一些研究,經過一段時間搞亂了cheatengine後,即使重新啓動電腦後,我也得到了指向HP地址的偏移量,並且每次都可以成功讀取它。

CE

現在我想做一個程序,將做同樣的事情。我發現了一個類,我可以從內存中讀取浮點數,稱爲VAMemory。我將Cheatengine的靜態地址複製到我的程序中,並獲得了HP值,就像我想要的那樣。

VAMemory vam = new VAMemory("League Of Legends"); 
vam.ReadFloat((IntPtr)adress); 

但是,重新啓動遊戲後,這不起作用,所以我必須再次從Cheatengine獲取地址。

我發現了一個類似的question和回答說:

對於你要讀取內存,看看什麼是存儲在地址每個級別。您找到的值將是您的下一個地址,您將應用下一個偏移量,等等。

在這個問題中,提問者有2個偏移量,但是我有5個偏移量?

用它來獲得基地址:

Process GameProcess = Process.GetProcessesByName("League Of Legends").FirstOrDefault(); 
IntPtr BaseAddress = GameProcess.MainModule.BaseAddress; 

於是我創造了這個怪物:

try 
     { 


      Process GameProcess = Process.GetProcessesByName("League Of Legends").FirstOrDefault(); 
      VAMemory vam = new VAMemory("League Of Legends"); 

      IntPtr BaseAddress = GameProcess.MainModule.BaseAddress; 
      float Basevalue = vam.ReadFloat((IntPtr)BaseAddress); 
      abase.Text = BaseAddress.ToString(); 
      vbase.Text = Basevalue.ToString(); 

      IntPtr Basefirst = IntPtr.Add(BaseAddress, 0x658); 
      float Basefirstvalue = vam.ReadFloat((IntPtr)Basefirst); 
      a1.Text = Basefirst.ToString(); 
      v1.Text = Basefirstvalue.ToString(); 

      IntPtr Basesecond = IntPtr.Add(IntPtrFromFloat(Basefirstvalue), 0x150); 
      float Basesecondvalue = vam.ReadFloat((IntPtr)Basefirstvalue); 
      a2.Text = Basesecond.ToString(); 
      v2.Text = Basesecondvalue.ToString(); 

      IntPtr Basethird = IntPtr.Add(IntPtrFromFloat(Basesecondvalue), 0x0); 
      float Basethirdvalue = vam.ReadFloat((IntPtr)Basethird); 
      a3.Text = Basethird.ToString(); 
      v3.Text = Basethirdvalue.ToString(); 

      IntPtr Basefourth = IntPtr.Add(IntPtrFromFloat(Basethirdvalue), 0x44); 
      float Basefourthvalue = vam.ReadFloat((IntPtr)Basefourth); 
      a4.Text = Basefourth.ToString(); 
      v4.Text = Basefourthvalue.ToString(); 

      IntPtr Basefifth = IntPtr.Add(IntPtrFromFloat(Basefourthvalue), 0x36c); 
      float Basefifthvalue = vam.ReadFloat((IntPtr)Basefirst); 
      a5.Text = Basefifth.ToString(); 
      v5.Text = Basefifthvalue.ToString(); 


     } 
     catch (Exception ex) 
     { MessageBox.Show(ex.ToString()); } 
    } 
    static IntPtr IntPtrFromFloat(float f) 
    { 
     unsafe 
     { 
      return (*(IntPtr*)&f); 
     } 
    } 
  • 它採用基址,增加了第一偏移,[讀取值,接着添加] x5,然後讀取最後的地址,但不幸的是其值爲0.

而不是在Cheatengine美麗的數字我得到這個:numbers 我一直在搞這個東西很長一段時間,但我仍然不明白我在做什麼錯了?

如何從基地址和Pointers獲得動態地址?

UPDATE:

我現在用新指針: new pointers

我根據註釋改變了代碼, 它使用Readint32()而不是readfloat()和看起來清爽多了:

Process GameProcess = Process.GetProcessesByName("League Of Legends").FirstOrDefault(); 
      VAMemory vam = new VAMemory("League Of Legends"); 

      IntPtr BaseAddress = GameProcess.MainModule.BaseAddress; 

      IntPtr Base1 = IntPtr.Add((IntPtr)vam.ReadInt32(BaseAddress), 0x58); 

      IntPtr Base2 = IntPtr.Add((IntPtr)vam.ReadInt32(Base1), 0xC0); 

      IntPtr Base3 = IntPtr.Add((IntPtr)vam.ReadInt32(Base2), 0x118); 

      IntPtr Base4 = IntPtr.Add((IntPtr)vam.ReadInt32(Base3), 0x39C); 

      IntPtr Base5 = IntPtr.Add((IntPtr)vam.ReadInt32(Base4), 0xBC); 

      float value = vam.ReadFloat(Base4); 

      Lvalue.Text = value.ToString(); 

但是,它仍然不起作用。我同時跑Cheatengine,它得到了正確的地址和價值,但我的程序得到了這些: debug 和最終值爲0,它應該是528。

+0

不要把代碼作爲鏈接到Pastebin,把它放在問題本身。人們不需要點擊外部鏈接即可完全理解您的問題。 –

+0

這就是說,你的問題是你調用'vam.ReadFloat',在每個級別上,你應該只在最後調用ReadFloat,中間級別需要使用'vam.ReadInt32('獲得下一層(IntPtr)vam.ReadInt32(Basefirst),0x150);' –

+0

'IntPtr Basethird = IntPtr.Add((IntPtr)vam.ReadInt32(Basesecond),0x0); (IntPtr)vam.ReadInt32(Basethird),0x44);','IntPtr Basefourth = IntPtr.Add((IntPtr)vam.ReadInt32(Basefourth),0x36c);','float Basefifthvalue = vam.ReadFloat(Basefifth);' –

回答

1

我作爲一個答案原單評論:

您的問題是你打電話vam.ReadFloat,在各個層面上,你應該只一次在最後調用ReadFloat,需要水平之間的中要使用vam.ReadInt32(獲取下一個層下來。

Process GameProcess = Process.GetProcessesByName("League Of Legends").FirstOrDefault(); 

VAMemory vam = new VAMemory("League Of Legends"); 

IntPtr Base = GameProcess.MainModule.BaseAddress; 
IntPtr BaseFirst = IntPtr.Add((IntPtr)vam.ReadInt32(Base), 0x658); 
IntPtr Basesecond = IntPtr.Add((IntPtr)vam.ReadInt32(Basefirst), 0x150); 
IntPtr Basethird = IntPtr.Add((IntPtr)vam.ReadInt32(Basesecond), 0x0); 
IntPtr Basefourth = IntPtr.Add((IntPtr)vam.ReadInt32(Basethird), 0x44); 
IntPtr Basefifth = IntPtr.Add((IntPtr)vam.ReadInt32(Basefourth), 0x36c); 
float Basefifthvalue = vam.ReadFloat(Basefifth); 

Lvalue.Text = Basefifthvalue.ToString(); 

的問題,並提供更新的答案是你有一個錯字。

float value = vam.ReadFloat(Base4); 

應該

float value = vam.ReadFloat(Base5); 

另外,我不熟悉作弊引擎的用戶界面,但它似乎你正在做的事情在倒車時,0xBC應該是第一個值的偏移和0x58應您添加到最後一個值的金額。