
Implant e C2 multiplataforma com suporte a syscalls — syscalls diretas (Win), syscalls brutas (Linux), canais HTTPS/DNS/ICMP. Sem camada winapi.
English | 简体中文 | 조선어 | Русский
Zero WinAPI. Cada primitiva NT é resolvida em tempo de execução a partir da ntdll em memória —
instruções SYSCALL emitidas diretamente via stubs de assembly Plan9, sem tabela de importação,
sem tocar nos hooks de usermode da ntdll. C2 sobre HTTPS / DNS / ICMP, AES-256-GCM por
mensagem. Nativo para Windows. Builds para Linux. Builds para macOS.
Esta não é uma biblioteca wrapper de syscalls. É um framework de implantação completo onde
cada operação — desde injetar código até ler arquivos até persistir no
registro — passa por syscalls Nt* brutas resolvidas no boot a partir da tabela de exportação
da ntdll atual. Não existem chamadas WinAPI no binário. Nada para um EDR
hookar em usermode.
B8 xx xx 00 00 0F 05 (direto) ou
4C 8B D1 B8 xx xx 00 00 0F 05 (Hells Gate). Cada nome de função é
hasheado em tempo de compilação — sem strings em texto claro no binário.asm_amd64.s) carrega o SSN em EAX,
define 7 argumentos manualmente, executa SYSCALL. Retorno via RAX/RDX.0F 05 C3 (syscall;ret) dentro
da ntdll, chama através dele. A armadilha da CPU cai dentro da ntdll — a pilha de chamadas
mostra frames da ntdll, não frames do implante. Nenhum hook de usermode sobrevive..text como RWX, copia os bytes originais da ntdll mapeada
do disco, restaura a proteção, descarrega o icache, aniquila o cache de SSN.
Todo hook de usermode colocado por qualquer EDR desaparece.O agente alterna entre técnicas de injeção automaticamente. Cada chamada usa um método diferente — duas injeções nunca parecem iguais na perícia forense.
| Método | Como funciona | Por que é furtivo |
|---|---|---|
| Mapeamento de seção | NtCreateSection → NtMapViewOfSection (remoto) → NtCreateThreadEx | Sem alocação RWX no VAD. A seção é respaldada por arquivo. Scanners de memória veem PAGE_EXECUTE_READ, não PAGE_EXECUTE_READWRITE. |
| Process hollow | NtCreateUserProcess (suspenso) → NtSuspendProcess → zera a base da imagem → aloca + escreve shellcode → NtSetContextThread (RIP = shellcode) → NtResumeProcess | O processo aparece como um svchost.exe legítimo no taskmgr. Apenas o conteúdo da memória difere. |
| Enfileiramento de APC | Enumera threads via NtQuerySystemInformation → NtOpenThread → NtQueueApcThread | Nenhuma thread nova criada. Nenhum TEB novo. Nenhuma alocação de pilha nova. Dispara quando a thread entra em espera alertável. |
| Module stomping | Aloca no alvo → escreve cabeçalho PE mínimo + shellcode → NtCreateThreadEx no ponto de entrada | A lista de módulos mostra um nome de DLL plausível. O cabeçalho PE é válido o suficiente para enganar a enumeração de módulos. |
Executa todas as verificações, retorna um relatório de ameaça pontuado. Auto-destruição em Crítico.
| Verificação | Método |
|---|---|
| Detecção de VM | Varredura de assinatura de hipervisor na folha CPUID 0x40000000 (VMware, VirtualBox, Hyper-V, KVM, Xen, QEMU, Parallels) + fallback na folha 0x40000001 |
| Detecção de sandbox | Contagem de CPUs, artefatos de registro (VMware Tools, VBox Guest Additions, serviços VMware/VBox), varredura de processos de sandbox (mais de 30 nomes conhecidos: wireshark, procmon, x64dbg, ida, etc.) |
| Detecção de depurador | PEB.BeingDebugged, PEB.NtGlobalFlag, flags de depuração do heap, ProcessDebugPort, ProcessDebugObjectHandle, ProcessDebugFlags, breakpoint de hardware DR0-7, verificação de single-step por temporização |
| Anomalia de temporização | Baseada em RDTSC: 50 amostras de latência de NtQuerySystemInformation, média/desvio padrão, sinaliza se mais de 10% das amostras excederem variância de 3σ. Detecta sobrecarga de instrumentação. |
| Evasão de PEB | Corrige BeingDebugged, NtGlobalFlag, flags de ProcessHeap, DebugPort, ThreadHideFromDebugger — tudo via leituras do segmento GS + NtWriteVirtualMemory. Sem chamadas de API. |
Tudo via syscalls Nt*, sem WinAPI.
EnablePrivilege(index) — define qualquer privilégio por LUIDEnableAllTokenPrivileges() — 20 privilégios de uma vez (Debug, Impersonate, TCB, Backup, Restore, etc.)GetProcessTokenIntegrityLevel() — consulta integridade obrigatóriaStealProcessToken(pid) — abre + duplica o token de outro processoImpersonateThread() / RevertToSelf()EnumVirtualMemory() — percorre todas as regiões virtuais via NtQueryVirtualMemoryFindWritableExecRegions() — encontra regiões comprometidas PAGE_EXECUTE_READWRITEHideRegion() — define PAGE_NOACCESS para ocultar memória de scannersUnhideRegion() — restaura a proteção originalNtCreateFile → NtReadFile / NtWriteFile → NtClose. Zero chamadas a CreateFileA,
ReadFile, WriteFile ou DeleteFileW. ReadFileContents(),
WriteFileContents(), DeleteFileNt(), FileExists().
NtCreateKey → NtSetValueKey. AddRunKeyPersistence(), RemoveRunKeyPersistence().
Sem RegCreateKeyEx, RegSetValueEx ou quaisquer chamadas Advapi32.
EnumerateSystemHandles() — todos os handles abertos no sistema via
NtQuerySystemInformation(SystemHandleInformation)FindEDRHandles() — compara PIDs proprietários com mais de 30 nomes
conhecidos de processos EDR (MsSense, CrowdStrike, Sentinel, Cylance, Carbon Black, etc.)CloseEDRHandles() — fecha handles de monitoramento que o EDR colocou no seu
processoIsProcessMonitored() — verificação booleana: estamos sendo observados?NtFreeVirtualMemory.PatchAMSI() — AmsiScanBuffer → MOV EAX, 0; RETPatchETW() — EtwEventWrite → RETPatchNtTraceEvent() — NtTraceEvent → RETPatchDbgUiRemoteBreakin() — breakin de thread → RETPatchInstrumentationCallbacks() — ThreadHideFromDebugger