Yukikaze
23.01.2012, 16:21
Жуковцы, кто сталкивался с многоуровневыми поинтерами?
Нашел бейс адрес и 3 оффсета, в CE работает отлично, но как перенести данные адреса в C# чето не догоняю.
•theSaboteur•
23.01.2012, 16:36
Если под многоуровневыми указателями подразумеваются многоуровневые указатели, то вероятно:
1. Читаешь по первому (статичному) адресу (очевидно базовый адрес + 1й оффсет) указатель на второй поинтер.
2. Читаешь по полученному адресу (если таковое требуется - смещаешь (оффсет) этот указатель) следующий указатель
3. Повторяешь п.2 до тех пор пока не получишь указатель на нужные данные
4. Извращаешься как душе угодно
Yukikaze
23.01.2012, 17:21
Да это я вроде бы как понимаю, но почему то результата нет...
/// <summary>
/// Читаем Int'овое значение из памяти приложения
/// с указанным оффсетом
/// </summary>
private Int32 HighLevelReadIntFromMemory(IntPtr handle, int offset)
{
int temp = 0;
temp = LowLevelReadIntFromMemory(handle, baseAddress);
temp = LowLevelReadIntFromMemory(handle, temp + 0x002302E8); //pointer
temp = LowLevelReadIntFromMemory(handle, temp + 0x698); //offset 2
temp = LowLevelReadIntFromMemory(handle, temp + 0x734); //offset 1
temp = LowLevelReadIntFromMemory(handle, temp + offset); offset 0
return temp;
}
/// <summary>
/// Читаем из памяти приложения массив байт по указанному адресу
/// и возвращаем целочисленное его представление
/// </summary>
private Int32 LowLevelReadIntFromMemory(IntPtr handle, int address)
{
var buffer = new byte[4];
IntPtr read;
ReadProcessMemory(handle, (IntPtr)address, buffer, 4, out read);
return (int)BitConverter.ToUInt32(buffer, 0);
}
Так почему то не работает
Добавлено через 52 минуты
скачал библиотеку с [Ссылки могут видеть только зарегистрированные и активированные пользователи]
public void ReadMemory()
{
Memory editor = new Memory();
editor.OpenProcess("l2.bin");
editor.GetModules();
foreach (var module in editor.GetModules())
{
listBox1.Items.Add(module.ToString());
}
int baseaddress = editor.BaseAddress("l2.bin");
int basemoduleaddress = editor.BaseAddress("Core.dll");
int moduleaddress = basemoduleaddress + 0x002302E8;
int[] _hpOffset = { 0x698, 0x734, 0x2F0 };
var HP = editor.ReadInt(moduleaddress, _hpOffset);
label1.Text = "HP: " + Convert.ToString(HP);
}
тоже не получается
Добавлено через 1 час 7 минут
Странно, ничего не менял последний вариант стал работать О_о