
Ocultar artefatos de memória usando ROP e breakpoints de hardware.
Este é um PoC simples de como ocultar artefatos de memória usando uma cadeia ROP em combinação com breakpoints de hardware. A cadeia ROP alterará as proteções da página de memória do módulo principal para N/A enquanto estiver em suspensão (isto é, quando a função Sleep é chamada). Para informações mais detalhadas sobre esta técnica de evasão de varredura de memória, veja o projeto original Gargoyle. Apenas x64.
A ideia é configurar um breakpoint de hardware em kernel32!Sleep e um novo filtro de nível superior para tratar a exceção. Quando Sleep é chamada, a função de filtro de exceção definida anteriormente é acionada, permitindo-nos chamar a cadeia ROP sem a necessidade de usar hooks de função clássicos. Desta forma, evitamos deixar regiões de memória privadas estranhas e incomuns no processo relacionadas a DLLs conhecidas.
A cadeia ROP simplesmente chama VirtualProtect() para definir a página de memória atual como N/A, depois chama SleepEx e, finalmente, restaura a proteção de memória RX.
A visão geral do processo é a seguinte:
Este processo se repete indefinidamente.
Como pode ser visto na imagem, a proteção de memória do módulo principal é alterada para N/A durante a suspensão, o que evita varreduras de memória que procuram páginas com permissão de execução.

Como estamos usando o plugin LITCRYPT para ofuscar literais de string, é necessário configurar a variável de ambiente LITCRYPT_ENCRYPT_KEY antes de compilar o código:
C:\Users\User\Desktop\RustChain> set LITCRYPT_ENCRYPT_KEY="yoursupersecretkey"
Depois disso, basta compilar o código e executar a ferramenta:
C:\Users\User\Desktop\RustChain> cargo build
C:\Users\User\Desktop\RustChain\target\debug> rustchain.exe
Esta ferramenta é apenas um PoC e alguns recursos extras devem ser implementados para ser totalmente funcional. O objetivo principal do projeto era aprender como implementar uma cadeia ROP e integrá-la dentro do Rust. Por causa disso, esta ferramenta só funcionará se você a usar como está, e falhas são esperadas se você tentar usá-la de outras maneiras (por exemplo, compilando-a como uma DLL e tentando carregá-la reflexivamente e executá-la).