Вопрос Как искать статический адрес

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
18 Апр 2019
Сообщения
67
Реакции
1
Я скачал себе игру для теста, нашел адрес, нашел постоянный указатель который не меняется после перезагрузки, как дальше использовать это в своем проекте c++ как правильно организовать работу в visual studio c++

Данный указатель указывает на хп и он меняется и остается прежним после перезапуска
1745337817221.png
1745337832022.png
 
брекпоинт на запись открой на адрес хп если енглиш CE до breakpoint for writes вродь так, после нанеси себе хп и у тя должна появится инструкция будет регистр (рандомный) и оффсет, что-то типо rcx+0x000EC ты крч лкм по нему и чекаешь че хранится в rcx есть шанс что там будет локальный игрок, но эт проверять нужно, после в рекласс закинь адрес из регистра и чекни че по оффсету хранится который в брекпоинт записался, допустим 0xEC если там твое хп то эт структура локального игрока, но работает не во всех играх, например в kingdom come 2 или stalker2 такие мувы не работают, но хз мб от движка зависит

Пожалуйста, зарегистрируйтесь или авторизуйтесь, чтобы увидеть содержимое.

 
Короче
Для начала находишь адрес смещения модуля, это адрес который CheatEngine подразумивает под "ZombieShooter.exe"
Дескриптор сам по себе является адресом, так что можно использовать его
std::string moduleName("ZombieShooter.exe"); HMODULE ZombieShooterAddress = GetModuleHandleA(moduleName.c_str());
Создаёшь первый указатель
void* firstLevel = reinterpret_cast<void*>((uintptr_t)ZombieShooterAddress + 0x1FBD58);
Логика в том, что твоё исходное значение ZombieShooter.exe + 0x1FBD58 - это
адрес указателя (т.е. переменная где лежит другой адрес). Превратив значение по этому адресу в указатель, ты как
ни странно получаешь сам указатель. Каст в uintptr_t т.к. смещение дано в байтах, без него твой офсет
перемножиться на 4, а мб ещё что-то похуже, т.к. по хорошему это UB
void* secondLevel = reinterpret_cast<void*>(*reinterpret_cast<void**>((uintptr_t)firstLevel) + 0x128);
Здесь ты разыменовываешь первый указатель. Получив значение которое в нём лежит (адрес *reinterpret_cast<void**>((uintptr_t)firstLevel)),
добавляешь к нему смещение (+ 0x128) - CE об этом сам пишет "[0D978708 + 128]". Это твой следующий указатель
Повторив эту операцию несколько раз, дойдёшь до своего значения,
Судя по всему это ещё один адрес. Представим что он хранится в sixthLevel
Далее в зависимости от того, что это за значение (представим что здоровье), переводишь его в нужный тип и разыменовываешь
int health = *reinterpret_cast<int*>(sixthLevel);

Если искал через pointerscan, в следующий раз попробуй понизить значения Max level, у тебя вероятно по умолчанию стояло 7, для такого оффсета вероятно хватит 2-3, сможешь найти более короткий путь
 
Последнее редактирование:
Назад
Сверху Снизу