我一直在研究一個小型項目 - 我試圖創建一個C#程序,它將從遊戲「英雄聯盟」中讀取人物的HP。如何使用Base地址和指針讀取進程內存
我做了一些研究,經過一段時間搞亂了cheatengine後,即使重新啓動電腦後,我也得到了指向HP地址的偏移量,並且每次都可以成功讀取它。
現在我想做一個程序,將做同樣的事情。我發現了一個類,我可以從內存中讀取浮點數,稱爲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美麗的數字我得到這個: 我一直在搞這個東西很長一段時間,但我仍然不明白我在做什麼錯了?
如何從基地址和Pointers獲得動態地址?
UPDATE:
我根據註釋改變了代碼, 它使用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,它得到了正確的地址和價值,但我的程序得到了這些: 和最終值爲0,它應該是528。
不要把代碼作爲鏈接到Pastebin,把它放在問題本身。人們不需要點擊外部鏈接即可完全理解您的問題。 –
這就是說,你的問題是你調用'vam.ReadFloat',在每個級別上,你應該只在最後調用ReadFloat,中間級別需要使用'vam.ReadInt32('獲得下一層(IntPtr)vam.ReadInt32(Basefirst),0x150);' –
'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);' –