Кто-нибудь объяснит почему многие адреса в мемхаке делятся\умножаются на 4?
Чем отличается ReadRealMemory от ReadUnrealMemory?
Насколько я знаю они просто должны разыменовывать указатель читая значение по его адресу...
К примеру я на С++ воссоздаю функцию которая читает из памяти jass строки по стринг хендлу, но логика вроде "byteOffset = addr / 4 * 4" вводит меня в ступор

DracoL1ch:
офсет 2589 *4 , я ж только что сказал
Всё, немного поковырявшись у меня получилось, нужно было еще (id * 4) еще раз умножить на 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;
	}
`
ОЖИДАНИЕ РЕКЛАМЫ...

Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
32
Насколько помню деление и умножение на 4 это проверки корректности, так же везде где можно во второй версии перешли на целые адресса, для надежности.
15
quq_CCCP:
Насколько помню деление и умножение на 4 это проверки корректности, так же везде где можно во второй версии перешли на целые адресса, для надежности.
Когда я пытаюсь читать по этим адресам из DLL библиотеки (там же не надо делить умножать на 4, полноценный язык все таки) ругается на memory access violation. По сути я пытаюсь делать так же как и в скрипте для доступа к игровым объектам, но без деления на 4.
ReadRealMemory(addr) это же то же самое что и *addr
Мне кажется я что-то упускаю и просто убрать деление и умножение недостаточно...
32
Нужно эти адресса в Cheat Engine смотреть и проверять. Подробнее у лича, я кроме пары раз по памяти не лазил и ддлок не писал кроме подобия винхака под айкап.
16
потому что доступ по массиву игры это доступ к ячейке i*4
соответственно если ты пишешь Memory[10], то это обращение к памяти в адресе 10*4=40
А в обертках RMem/WMem идет деление, поэтому при работе с ними нужно вводить реальные адреса
32
Drulia_san, а что пишешь на с++. решил весь код карты перевести на dll? У лича вроде был готовый конвертер для этого дела.
16
в жизни подобной херни не имел, какой извращенец захочет это делать?
Показан только небольшой набор комментариев вокруг указанного. Перейти к актуальным.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.