如何使用Base地址和指针读取进程内存

时间:2017-01-01 22:06:57

标签: c# memory memory-address

我一直致力于一个小项目 - 我正在尝试创建一个C#程序,该程序将从游戏" League of Legends"中读取角色的HP。

我做了一些研究,经过一段时间搞乱cheatengine,我得到了即使在重新启动电脑后也会指向惠普地址的补偿,我每次都能成功读取它。

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获取动态地址?

更新:

我现在正在使用新指针: 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。

1 个答案:

答案 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应该是您添加到最后一个值的金额。