В этом случае вызов VirtualProtect()
ничего не делает: он просто завершается неудачей, поскольку ожидает, что 4-й параметр является действительным указателем на область памяти, которая получает предыдущие флаги защиты доступа (так что вы можете восстановить ее позже),Таким образом, ЦП отказывается выполнять эту страницу, и вы получаете GPF при самой первой инструкции.
Вам также необходимо использовать PAGE_EXECUTE_READ
для флага, в противном случае первая операция с кучей (даже доступ на чтение к любой другойпеременная в куче, которая происходит на той же странице) будет генерировать GPF.В качестве альтернативы, используйте VirtualAlloc()
вместо размещения в куче.
Обратите внимание, я не проверял остальную часть кода, поэтому могут быть некоторые другие проблемы с ним.Также обратите внимание, что это не способ написания ассемблера, если только вы не пишете эксплойт (использование VirtualProtect()
- верный признак этого).Надеюсь, что я ошибаюсь в своих предположениях об эксплойте.