В настоящее время я пытаюсь реализовать чтение памяти на С# по базовым указателям, найденным с помощью Cheat Engine. Я на 100% уверен, что нашел правильные указатели и смещения, так как они прекрасно работают в Cheat-Engine даже между перезагрузками.
Сейчас я реализую его на С#, у меня не было проблем с одноуровневыми точками, но по какой-то причине я не могу заставить работать свой последний многоуровневый указатель.
Все идет хорошо, пока не будет добавлено последнее значение, а затем оно вернет мне что-то «случайное», это указатели, которые я нашел, и я вижу, что это работает в Cheat Engine.
Это моя реализация на С#:
public static int ReadFromPointer(int address, int[] offsets)
{
Console.WriteLine("----------");
Console.WriteLine("Address: " + address);
int ptr = ReadPointer(address);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
foreach (var offset in offsets)
{
Console.WriteLine($"Adding offset: {offset:X} to Pointer: {ptr:X}");
ptr = ReadPointer(ptr + offset);
Console.WriteLine($"Pointer returned as int: {ptr}, hex: {ptr:X}");
}
Console.WriteLine("----------");
return ptr;
}
private static int ReadPointer(int adress)
{
int ptrNext;
int bytesRead = 0;
byte[] _Value = new byte[4];
ReadProcessMemory((IntPtr)ProcessHandle, (IntPtr)adress, _Value, IntPtr.Size, ref bytesRead);
ptrNext = BitConverter.ToInt32(_Value, 0);
return ptrNext;
}
и я называю это, используя следующее:
var valueToFind = ProcessHelper.ReadFromPointer((int)baseAddress + 0x00C45A5C, new []{ 0xEC, 0x1C, 0x178, 0x74, 0x458 });
Теперь идет «случайная» часть, все указатели добавляются правильно, кроме последнего, когда необходимо добавить 0x458 к указателю 1E138F80, это должно вернуть 1E1393D8, но в итоге возвращает «41C00000»
Я не уверен, связано ли это с тем, что мой последний указатель больше не составляет 4 байта, или происходит какое-то преобразование, которое смешивает его. Любая помощь здесь будет принята с благодарностью!
0x1E138F80 + 0x480
- person   schedule 03.12.20180x1E138F80 + 0x480
используется символ=
(т. е. показывает результирующий адрес указателя), тогда как для любых других указателей + смещения используется символ->
, включая квадратные скобки[
]
вокруг адреса указателя (разыменование указателя, отображение данных памяти по результирующему адресу указателя). - person   schedule 03.12.2018GetLastError
. Но вероятно 0x41C0000 это значение на 0x1E138F80 + 0x458 - person Kevin Kouketsu   schedule 03.12.2018