Я пытаюсь отредактировать какое-то значение в памяти, но оно мгновенно возвращается обратно из-за какой-то инструкции, например player::update или player::reset.
В CE я могу присоединить к нему отладчик и проверить, что в него пишется, и заменить на NOP, но как мне получить статический адрес этой инструкции? К вашему сведению, у меня есть статический адрес моего значения (сканирование подписи playerBase + известное смещение), но нет адреса инструкции.





Вам следует отсканировать подпись и НЕ использовать WriteProcessMemory(), это отстой, просто используйте это:
*(byte*)((DWORD)addressOfAssemblyInstruction) = 0x90;
изменение первого байта инструкции с помощью NOP
например, если вы хотите изменить полную инструкцию, например mov byte ptr [ebx+0000087B],01
посмотри на его байты
{ 0xC6, 0x83, 0x7B, 0x08, 0x00, 0x00, 0x00 };
тогда делай
void change_address_with_NOP()
{
for (int i = 0; i < 7; i++) {
*(byte*)((DWORD)address + i) = 0x90;
}
}
Ниже приведены шаги по поиску «статического адреса инструкции»:
Шаг 1. Подключите отладчик к процессу
Шаг 2. Найдите то, что пишет по адресу
Перейдите по адресу значения, которое вы хотите отредактировать в Cheat Engine.
Нажимаем правой кнопкой мыши на адрес и выбираем «Узнать, что здесь пишет
адрес...".
Откроется новое окно, в котором отладчик перечислит все инструкции, которые изменяют это значение.
Шаг 3: Определите инструкцию
Шаг 4. Найдите статический адрес инструкции
Шаг 5. Вычислите статический адрес
Шаг 6. Замените инструкцию на NOP (необязательно)
Позвольте мне показать вам пример для лучшего понимания:
Только что проверил, у меня есть адрес этой инструкции в CE. После перезапуска игры этот адрес не изменился. Мне пришлось перезапустить его снова, и это изменилось, лол. Однако я решил использовать WriteProcessMemory() с массивом NOPs, и это не сработало. Кто-нибудь знает, использует ли Cheat Engine VirtualProtect() или что-то в этом роде? Потому что моя программа буквально не может его переписать...