Хуки: зачем нам снова нужно VirtualProtect () для восстановления разрешений?

Вот некоторый стандартный фрагмент кода, где мы устанавливаем хук, переписывающий несколько байтов в начале интересующей нас функции. У меня вопрос: зачем нам восстанавливать кусок переписанной памяти? Разве мы не можем просто оставить это с PAGE_EXECUTE_READWRITE разрешения? Здесь мы предполагаем, что нам нужно постоянно восстанавливать исходные байты и снова подключаться.

if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable
{
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data
DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5);  //((to)-(from)-5)
memcpy(&jmp[1], &offset, 4); // write address into jmp
memcpy(Hook::hookData, jmp, 6); // save hook data
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp
VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect
}

8

Решение

Как только дверь открыта, любой может пройти. Если вы удалили защиту от записи из диапазона памяти, любой код может обновить эту память, а не только ваш код. Память не может знать, что ваш (законный) код обновляет его по сравнению с некоторыми возможными вредоносными программами или даже просто с ошибкой DLL, которая также загружается в пространство процесса. Воспроизведение его помогает предотвратить обновление не-вашего кода областей памяти, которые вы хотите изменить.

8

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector