Добавлен Drulia_san
Кто-нибудь объяснит почему многие адреса в мемхаке делятся\умножаются на 4?
Чем отличается ReadRealMemory от ReadUnrealMemory?
Насколько я знаю они просто должны разыменовывать указатель читая значение по его адресу...
К примеру я на С++ воссоздаю функцию которая читает из памяти jass строки по стринг хендлу, но логика вроде "byteOffset = addr / 4 * 4" вводит меня в ступор
Чем отличается ReadRealMemory от ReadUnrealMemory?
Насколько я знаю они просто должны разыменовывать указатель читая значение по его адресу...
К примеру я на С++ воссоздаю функцию которая читает из памяти jass строки по стринг хендлу, но логика вроде "byteOffset = addr / 4 * 4" вводит меня в ступор
Принятый ответ
DracoL1ch:
Всё, немного поковырявшись у меня получилось, нужно было еще (id * 4) еще раз умножить на 4. Теперь строки извлекает идеально.офсет 2589 *4 , я ж только что сказал
Если кому-то интересно, выглядит это вот так:
DWORD ReadPointer(DWORD addr)
{
return *(DWORD*)(addr);
}
DWORD GetJassContext(int id)
{
DWORD pJassEnvAddress = DWORD(GetModuleHandle(TEXT("Game.dll"))) + 0xADA848;
return ReadPointer(ReadPointer(ReadPointer(ReadPointer(pJassEnvAddress) + 0x14) + 0x90) + id * 4);
}
DWORD GetStringTable()
{
DWORD pJassContext = GetJassContext(1);
return ReadPointer(ReadPointer(pJassContext + 0x2874) + 0x8);
}
std::string from_jString(jString jstrHandle)
{
DWORD pStringTable = GetStringTable();
const char* sptr = (const char*)ReadPointer(ReadPointer(pStringTable + ((jstrHandle * 4)*4) + 0x8) + 0x1C);
return sptr;
}
`
ОЖИДАНИЕ РЕКЛАМЫ...
Чтобы оставить комментарий, пожалуйста, войдите на сайт.
Ред. Drulia_san
ReadRealMemory(addr) это же то же самое что и *addr
Мне кажется я что-то упускаю и просто убрать деление и умножение недостаточно...
соответственно если ты пишешь Memory[10], то это обращение к памяти в адресе 10*4=40
А в обертках RMem/WMem идет деление, поэтому при работе с ними нужно вводить реальные адреса
DracoL1ch, защита карты от желающих стащить твои уникальные спеллы, которые ты сам стащил с хайворкшопа, не повришь тема очень актуальная, до сих пор народ интересуется, а как вот так сделать?
Ред. Drulia_san
Я решил пока так: Передаю в либу результат выражения ReadUnrealMemory( ReadUnrealMemory( GetJassContext( 1 ) / 4 + 2589 ) / 4 + 2 )
Назовём его условно ptr.
Потом читаю ptr = *(ptr + stringHandle * 4 + 2), потом читаю ptr = *(ptr + 7)
И на моменте чтения адреса где прибавляется 7 уже Access violation.
По идее деление делает адрес "нереальным", а умножение реальным, раз string handle умножается в функции мемхака GetStringAddress на 4, то его и в С++ надо умножить на 4
Но почему-то на чтении ptr + 7 ошибка..
Ред. Drulia_san
К примеру вывожу вариком значение GetJassContext(1) и значение памяти по адресуGetJassContext(1)/4 + 2589 , перепечатываю адрес, перевожу в hex, смотрю значение в cheat engine с соответствующим оффсетом (2589 оно же 0xA1D) и читаю.
То что читает варик и то что читает другой софт по тем же адресам вообще отличается радикально.