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. A 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 a partir dessa região de memória, o que dificulta a exploração de saturações de buffer.
A DEP impede que o código seja executado a partir de páginas de dados, como o heap padrão, pilhas e pools de memória. Se um aplicativo tentar executar 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 pretende ser uma defesa abrangente contra todas as façanhas; Destina-se 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 código de uma página protegida, o aplicativo receberá uma exceção com o código de status STATUS_ACCESS_VIOLATION. Se seu aplicativo deve executar código de uma página de memória, ele deve alocar e definir a proteção de memória virtual adequada atributos. A memória alocada deve ser marcada PAGE_EXECUTE, PAGE_EXECUTE_READ, PAGE_EXECUTE_READWRITEou PAGE_EXECUTE_WRITECOPY ao alocar memória. As alocações de heap feitas chamando o malloc e funções de HeapAlloc não são executáveis.
Os aplicativos não podem executar código a partir do heap de processo padrão ou da pilha.
A DEP é configurada 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 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. Sugere-se que um aplicativo defina, no mínimo, a opção de proteção de memória PAGE_EXECUTE. 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 máxima proteção para regiões executáveis do espaço de endereçamento do processo. Você deve tentar criar aplicativos que usem o menor espaço de endereçamento executável possível, o que minimiza a quantidade de memória exposta à exploração da memória.
Você também deve tentar controlar o layout da memória virtual do seu 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 as 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 para a área executável da memória.
Compatibilidade de aplicativos
Algumas funcionalidades da aplicação são incompatíveis com a DEP. Aplicativos que executam a geração de código dinâmico (como a 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 Ative Template Library (ATL) 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 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 referidos como thunks) nas seções de dados. No entanto, a 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 com o vinculador.