Смещение указателя C#> 255 - ProcessMemoryReader
Я знаю, что есть много учебных пособий, показывающих, как использовать функции "ProcessMemoryReader". Но эта проблема кажется уникальной или еще не решена.
Долгое время я копался в чужом коде, чтобы найти способ использовать несколько смещений. И я думал, что использование нескольких смещений было проблемой для меня, но я думаю, что это проблема с тем фактом, что мое значение смещения больше, чем 255.
Игра, из которой я пытаюсь получить значения памяти, называется "Assault Cube". Поскольку я не был уверен, правильно ли я получил значения смещения, я гуглил, что другие результаты, где. Кажется, они абсолютно одинаковы: http://cheatengine.org/tables/moreinfo.php?tid=1142 (Вы можете просмотреть файл.ct с помощью блокнота, если у вас не установлен чит-движок.)
Вот мой код, используя ProcessMemoryReader.cs
,
private void timer1_Tick(object sender, EventArgs e)
{
int bytesread;
int pointerbase;
byte[] memory;
Process[] myprocess = Process.GetProcessesByName("ac_client");
if (myprocess.Length != 0)
{
preader.ReadProcess = myprocess[0];
preader.OpenProcess();
//Ammo
memory = preader.ReadProcessMemory((IntPtr)0x4DF73C, 4, out bytesread);
pointerbase = BitConverter.ToInt32(memory, 0);
pointerbase += 0x00; //0 // 14 // 378
byte[] memory1 = preader.ReadProcessMemory((IntPtr)pointerbase, 4, out bytesread);
int pointerbase1 = BitConverter.ToInt32(memory1, 0);
pointerbase1 += 0x14; //0 // 14 // 378
byte[] memory2 = preader.ReadProcessMemory((IntPtr)pointerbase1, 4, out bytesread);
int pointerbase2 = BitConverter.ToInt32(memory2, 0);
pointerbase2 += 0x378; //00 // 14 // 378
byte[] memory3 = preader.ReadProcessMemory((IntPtr)pointerbase2, 4, out bytesread);
int valueis = BitConverter.ToInt32(memory3, 0);
label1.Text = valueis.ToString();
}
Хотя с одним указателем процесс работает нормально, например:
//HP
memory = preader.ReadProcessMemory((IntPtr)0x4DF73C, 4, out bytesread);
pointerbase = BitConverter.ToInt32(memory, 0);
pointerbase += 0xf4;
byte[] memory1 = preader.ReadProcessMemory((IntPtr)pointerbase, 4, out bytesread);
int valueis = BitConverter.ToInt32(memory1, 0);
label2.Text = valueis.ToString();
Так что это работает, довольно понятно, что здесь происходит, но я не могу понять, как читать код Ammo с несколькими смещениями.
1 ответ
Я не знаком с CheatEngine и его табличным форматом, но у меня нет впечатления, что он указывает на адреса памяти, которые вы используете.
Вы прочитали 4 байта в 0x4DF73C
, который используется в качестве нового адреса памяти для следующего чтения. Это повторяется несколько раз. По сути, вы читаете информацию из указателя на указатель на указатель. Вы уверены, что это то, что предназначено?
Нет никаких причин, по которым значение смещения, превышающего 255, могло бы стать проблемой.
Используйте FindDMAAddy, чтобы пройти по цепочке указателей за вас, вот рабочий пример, убедитесь, что вы запускаете как администратор:
public static IntPtr FindDMAAddy(IntPtr hProc, IntPtr ptr, int[] offsets)
{
var buffer = new byte[IntPtr.Size];
foreach (int i in offsets)
{
ReadProcessMemory(hProc, ptr, buffer, buffer.Length, out
var read);
ptr = (IntPtr.Size == 4) ? IntPtr.Add(new IntPtr(BitConverter.ToInt32(buffer, 0)), i) : ptr = IntPtr.Add(new IntPtr(BitConverter.ToInt64(buffer, 0)), i);
}
return ptr;
}
var modBase = GetModuleBaseAddress(proc.Id, "ac_client.exe");
var ammoAddr = FindDMAAddy(hProc, (IntPtr)(modBase + 0x10f4f4), new int[] { 0x374, 0x14, 0 });
Console.WriteLine("Ammo address " + "0x" + ammoAddr.ToString("X"));
int newAmmo = 1337;
byte[] buffer = new byte[4];
ReadProcessMemory(proc.Handle, ammoAddr, buffer, 4, out _);
Console.WriteLine("Ammo value " + BitConverter.ToInt32(buffer, 0).ToString());
WriteProcessMemory(hProc, ammoAddr, newAmmo, 4, out _);