Prevenção de Execução de Dados
A DEP (Prevenção de Execução de Dados) é um recurso de proteção de memória no nível do sistema integrado ao sistema operacional a partir do Windows XP e do Windows Server 2003. O DEP permite que o sistema marque uma ou mais páginas de memória como não executáveis. Marcar regiões de memória como não executáveis significa que o código não pode ser executado nessa região de memória, o que dificulta a exploração de estouros de buffer.
O DEP impede que o código seja executado de páginas de dados, como heap, pilhas e pools de memória padrão. Se um aplicativo tentar executar o código de uma página de dados protegida, ocorrerá uma exceção de violação de acesso à memória e, se a exceção não for tratada, o processo de chamada será encerrado.
O DEP não se destina a ser uma defesa abrangente contra todas as explorações; ele se destina a ser outra ferramenta que você pode usar para proteger seu aplicativo.
Como funciona a prevenção de execução de dados
Se um aplicativo tentar executar o código de uma página protegida, o aplicativo receberá uma exceção com o código status STATUS_ACCESS_VIOLATION. Se o aplicativo precisar executar o código de uma página de memória, ele deverá alocar e definir os atributos de proteção de memória virtual adequados. A memória alocada deve ser marcada como PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITE ou PAGE_EXECUTE_WRITECOPY ao alocar memória. As alocações de heap feitas chamando as funções malloc e HeapAlloc não são executáveis.
Os aplicativos não podem executar o código do heap de processo padrão ou da pilha.
O DEP é configurado na inicialização do sistema de acordo com a configuração de política de proteção de página sem execução nos dados de configuração de inicialização. Um aplicativo pode obter a configuração de política atual chamando a função GetSystemDEPPolicy . Dependendo da configuração de política, um aplicativo pode alterar a configuração de DEP para o processo atual chamando a função SetProcessDEPPolicy .
Considerações sobre programação
Um aplicativo pode usar a função VirtualAlloc para alocar memória executável com as opções de proteção de memória apropriadas. É recomendável que um aplicativo defina, no mínimo, a opção PAGE_EXECUTE proteção de memória. Depois que o código executável é gerado, é recomendável que o aplicativo defina proteções de memória para não permitir o acesso de gravação à memória alocada. Os aplicativos podem não permitir o acesso de gravação à memória alocada usando a função VirtualProtect . Não permitir o acesso de gravação garante a proteção máxima para regiões executáveis do espaço de endereço do processo. Você deve tentar criar aplicativos que usam o menor espaço de endereço executável possível, o que minimiza a quantidade de memória exposta à exploração de memória.
Você também deve tentar controlar o layout da memória virtual do aplicativo e criar regiões executáveis. Essas regiões executáveis devem estar localizadas em um espaço de memória menor do que regiões não executáveis. Ao localizar regiões executáveis abaixo de regiões não executáveis, você pode ajudar a evitar que um estouro de buffer transborde na área executável da memória.
Compatibilidade de aplicativos
Algumas funcionalidades do aplicativo são incompatíveis com o DEP. Aplicativos que executam a geração dinâmica de código (como geração de código Just-In-Time) e não marcam explicitamente o código gerado com permissão de execução podem ter problemas de compatibilidade em computadores que estão usando DEP. Os aplicativos gravados na ATL (Biblioteca de Modelos Ativos) versão 7.1 e anteriores podem tentar executar código em páginas marcadas como não executáveis, o que dispara uma falha NX e encerra o aplicativo; para obter mais informações, consulte SetProcessDEPPolicy. A maioria dos aplicativos que executam ações incompatíveis com o DEP deve ser atualizada para funcionar corretamente.
Um pequeno número de arquivos executáveis e bibliotecas pode conter código executável na seção de dados de um arquivo de imagem. Em alguns casos, os aplicativos podem colocar pequenos segmentos de código (comumente chamados de thunks) nas seções de dados. No entanto, o DEP marca seções do arquivo de imagem que é carregado na memória como não executável, a menos que a seção tenha o atributo executável aplicado.
Portanto, o código executável nas seções de dados deve ser migrado para uma seção de código ou a seção de dados que contém o código executável deve ser explicitamente marcada como executável. O atributo executável, IMAGE_SCN_MEM_EXECUTE, deve ser adicionado ao campo Características do cabeçalho da seção correspondente para seções que contêm código executável. Para obter mais informações sobre como adicionar atributos a uma seção, consulte a documentação incluída no vinculador.