VirtualProtect работает некорректно
Я изучаю обраатную инженерию и столкнулся с небольшой проблемой, дело в том, что в некоторых случаях VirtualProtect работает не так как мне надо, к примеру:
DWORD temp;
MEMORY_BASIC_INFORMATION t1;
VirtualQuery(targetAddress, &t1, size);
std::cout << std::hex << t1.Protect << std::endl; // Вывод - 20 (в этой части всё правильно, оригинальная защита этого региона памяти действительно 20)
VirtualProtect(targetAddress, size, PAGE_EXECUTE_READWRITE, &temp);
MEMORY_BASIC_INFORMATION t2;
VirtualQuery(targetAddress, &t2, size);
std::cout << std::hex << t2.Protect << std::endl; // Вывод - 40 (Этот вывод тоже правильный, я сменил защиту на PAGE_EXECUTE_READWRITE == 0x40)
VirtualProtect(targetAddress, size, PAGE_EXECUTE_WRITECOPY, &temp);
MEMORY_BASIC_INFORMATION t3;
VirtualQuery(targetAddress, &t3, size);
std::cout << std::hex << t3.Protect << std::endl; // Вывод - 40 (Этот вывод НЕПРАВИЛЬНЫЙ, я сменил защиту на PAGE_EXECUTE_WRITECOPY, вывод должен быть 80, но он остался 40)
Как вы можете заметить, создаётся ощущение, что VirtualProtect может сработать только один раз (что не верно), однако рассмотрим другой случай:
DWORD temp;
MEMORY_BASIC_INFORMATION t1;
VirtualQuery(targetAddress, &t1, size);
std::cout << std::hex << t1.Protect << std::endl; // Вывод - 20 (в этой части всё правильно, оригинальная защита этого региона памяти действительно 20)
VirtualProtect(targetAddress, size, PAGE_EXECUTE_READWRITE, &temp);
MEMORY_BASIC_INFORMATION t2;
VirtualQuery(targetAddress, &t2, size);
std::cout << std::hex << t2.Protect << std::endl; // Вывод - 40 (Этот вывод тоже правильный, я сменил защиту на PAGE_EXECUTE_READWRITE == 0x40)
VirtualProtect(targetAddress, size, PAGE_EXECUTE_READ, &temp);
MEMORY_BASIC_INFORMATION t3;
VirtualQuery(targetAddress, &t3, size);
std::cout << std::hex << t3.Protect << std::endl; // Вывод - 20 (Этот вывод правильный, я сменил защиту на PAGE_EXECUTE_READ == 0x20)
В этом случае VirtualProtect сработал корректно, мне нужно чтобы он работал также и в первом случае.