PDA

Просмотр полной версии : [Помогите!] Multi level pointer


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 минут
Странно, ничего не менял последний вариант стал работать О_о