
RefleXXion é um utilitário projetado para auxiliar na evasão de hooks em modo de usuário utilizados por AV/EPP/EDR etc. Para contornar os hooks em modo de usuário, ele primeiro coleta os números de syscall de NtOpenFile, NtCreateSection, NtOpenSection e NtMapViewOfSection encontrados no array LdrpThunkSignature.

RefleXXion é uma utilidade projetada para auxiliar na superação de hooks em modo de usuário utilizados por AV/EPP/EDR etc. Para contornar os hooks em modo de usuário, ele primeiro coleta os números de syscall das funções NtOpenFile, NtCreateSection, NtOpenSection e NtMapViewOfSection encontradas no array LdrpThunkSignature. Depois disso, existem duas técnicas que o usuário pode escolher para contornar os hooks em modo de usuário.
Técnica-1, lê a NTDLL como um arquivo de C:\Windows\System32\ntdll.dll. Após a análise, a seção .TEXT da NTDLL já carregada (onde os hooks são realizados) na memória é substituída pela seção .TEXT da NTDLL limpa.
Na Técnica-2, a NTDLL é lida como Seção dos KnownDlls, \KnownDlls\ntdll.dll. (pois os arquivos DLL são armazenados em cache nos KnownDlls como Seção.) Após a análise, a seção .TEXT da NTDLL já carregada (onde os hooks são realizados) na memória é substituída pela seção .TEXT da NTDLL limpa.
O fluxo detalhado da metodologia e de todas as técnicas é fornecido abaixo.

Você pode abrir e compilar o projeto com o Visual Studio. Todo o projeto suporta arquitetura x64 para os modos Debug e Release.
A solução RefleXXion-EXE gera o EXE para fins de PoC. Se você quiser entender como o projeto funciona passo a passo, isso facilitará seu trabalho. A função principal contém as definições das funções Technique1 e Technique2. Comente uma delas e compile. Não use ambas as funções ao mesmo tempo.
A solução RefleXXion-DLL gera a DLL que você injeta no processo no qual deseja contornar os hooks em modo de usuário para NTDLL. No início do arquivo main.cpp, há definições de qual técnica usar. Você pode escolher uma delas e compilar. Não defina todos os valores ao mesmo tempo, defina apenas a técnica desejada. Um exemplo de configuração é fornecido abaixo.
// Techniques configuration section
#define FROM_DISK 1 // If you set it to 1, the Technique-1 will be used. For more information; https://github.com/hlldz/RefleXXion
#define FROM_KNOWNDLLS 0 // If you set it to 1, the Technique-2 will be used. For more information; https://github.com/hlldz/RefleXXion
Atualmente, o RefleXXion suporta apenas arquitetura x64.
O RefleXXion apenas remove os hooks das funções da NTDLL; você pode precisar também remover hooks de outras DLLs (kernel32.dll, advapi32.dll etc.). Para isso, você pode editar facilmente os locais necessários no projeto.
O RefleXXion usa apenas a região de memória RWX quando o processo de sobrescrita da seção .TEXT começa. Para este processo, uma nova região de memória não é criada; a região de memória existente (a seção .TEXT da NTDLL já carregada) é tornada RWX e depois convertida para RX.
ULONG oldProtection;
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, PAGE_EXECUTE_READWRITE, &oldProtection);
memcpy()...
ntStatus = NtProtectVirtualMemory(NtCurrentProcess(), &lpBaseAddress, &uSize, oldProtection, &oldProtection);
P.S. O RefleXXion invoca a API NtProtectVirtualMemory sobre a NTDLL instalada limpa. Ele usa a função CustomGetProcAddress para isso porque a NTDLL limpa não está na InLoadOrderModuleList, embora esteja carregada na memória. Portanto, uma solução como a aqui (https://stackoverflow.com/questions/6734095/how-to-get-module-handle-from-func-ptr-in-win32) não funcionará. É por isso que a função customizada GetProcAddress existe e é usada.
Você pode carregar a DLL do RefleXXion do disco para o processo alvo. Você pode não preferir essa abordagem para trabalhos sensíveis, como uma operação de Red Team. Portanto, você pode converter a DLL do RefleXXion em shellcode usando o projeto sRDI ou integrar o código do RefleXXion ao seu próprio loader ou projeto.
Mesmo que a NTDLL (como arquivo ou como seção) seja recarregada no processo injetado, ela não permanece carregada. O RefleXXion fecha todos os handles abertos (handles de arquivo & seção) para seus próprios processos.