我一直致力于一个小项目 - 我正在尝试创建一个C#程序,该程序将从游戏" League of Legends"中读取角色的HP。
我做了一些研究,经过一段时间搞乱cheatengine,我得到了即使在重新启动电脑后也会指向惠普地址的补偿,我每次都能成功读取它。
现在我想制作一个能做同样事情的程序。我发现了一个类,我可以从内存中读取浮点数,称为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);
}
}
而不是Cheatengine中的漂亮数字,我得到了这个: 我很长一段时间一直在搞这个东西,但我还是不明白我做错了什么?
如何从基地址和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,它得到了正确的地址和价值,但我的程序得到了这些: 最终值为0,应为528。
答案 0 :(得分: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);
另外,我对Cheat Engine的用户界面并不熟悉,但看起来你正在做相反的事情,0xBC
应该是第一个值的偏移,而0x58
应该是您添加到最后一个值的金额。