Короче
Для начала находишь адрес смещения модуля, это адрес который 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, сможешь найти более короткий путь