
Implant y C2 multiplataforma impulsados por syscalls — syscalls directas (Win), syscalls en crudo (Linux), canales HTTPS/DNS/ICMP. Sin capa winapi.
English | 简体中文 | 조선어 | Русский
Cero WinAPI. Cada primitiva NT se resuelve en tiempo de ejecución desde ntdll en memoria —
las instrucciones SYSCALL se emiten directamente mediante stubs de ensamblador Plan9, sin tabla de importaciones,
sin tocar los hooks de usermode de ntdll. C2 sobre HTTPS / DNS / ICMP, AES-256-GCM por
mensaje. Windows nativo. Compilaciones para Linux. Compilaciones para macOS.
Esto no es una librería wrapper de syscalls. Es un framework de implant completo donde
cada operación — desde inyectar código hasta leer archivos o persistir en el
registro — pasa por syscalls Nt* en crudo resueltas al arrancar desde la tabla de exportaciones
de ntdll actual. No existen llamadas WinAPI en el binario. Nada que un EDR
pueda hookear en usermode.
B8 xx xx 00 00 0F 05 (directo) o
4C 8B D1 B8 xx xx 00 00 0F 05 (Hells Gate). Cada nombre de función se
hashea en tiempo de compilación — sin cadenas en texto plano en el binario.asm_amd64.s) carga el SSN en EAX,
establece 7 argumentos a mano, ejecuta SYSCALL. Retorno vía RAX/RDX.0F 05 C3 (syscall;ret) dentro de
ntdll y llama a través de él. La trampa de CPU aterriza dentro de ntdll — la pila de llamadas
muestra frames de ntdll, no frames del implant. Ningún hook de usermode sobrevive..text como RWX, copia los bytes originales del ntdll mapeado
desde disco, restaura la protección, vacía la icache, aniquila la caché de SSN.
Todo hook de usermode colocado por cualquier EDR desaparece.El agente rota automáticamente entre técnicas de inyección. Cada llamada usa un método distinto — no hay dos inyecciones que se vean iguales en el análisis forense.
| Método | Cómo funciona | Por qué es sigiloso |
|---|---|---|
| Mapeo de sección | NtCreateSection → NtMapViewOfSection (remoto) → NtCreateThreadEx | Sin asignación RWX en el VAD. La sección está respaldada por archivo. Los escáneres de memoria ven PAGE_EXECUTE_READ, no PAGE_EXECUTE_READWRITE. |
| Process hollow | NtCreateUserProcess (suspendido) → NtSuspendProcess → poner a cero la base de la imagen → asignar + escribir shellcode → NtSetContextThread (RIP = shellcode) → NtResumeProcess | El proceso aparece como un svchost.exe legítimo en el administrador de tareas. Solo difiere el contenido de la memoria. |
| Encolado de APC | Enumerar hilos vía NtQuerySystemInformation → NtOpenThread → NtQueueApcThread | No se crea un hilo nuevo. Sin TEB nuevo. Sin asignación de pila nueva. Se dispara cuando el hilo entra en espera alertable. |
| Module stomping | Asignar en el objetivo → escribir cabecera PE mínima + shellcode → NtCreateThreadEx en el punto de entrada | La lista de módulos muestra un nombre de DLL plausible. La cabecera PE es lo bastante válida para engañar a la enumeración de módulos. |
Ejecuta todas las comprobaciones, devuelve un informe de amenaza puntuado. Autodestrucción en Critical.
| Comprobación | Método |
|---|---|
| Detección de VM | Escaneo de firma de hipervisor en la hoja CPUID 0x40000000 (VMware, VirtualBox, Hyper-V, KVM, Xen, QEMU, Parallels) + fallback en la hoja 0x40000001 |
| Detección de sandbox | Recuento de CPU, artefactos de registro (VMware Tools, VBox Guest Additions, servicios de VMware/VBox), escaneo de procesos de sandbox (más de 30 nombres conocidos: wireshark, procmon, x64dbg, ida, etc.) |
| Detección de depurador | PEB.BeingDebugged, PEB.NtGlobalFlag, flags de depuración del heap, ProcessDebugPort, ProcessDebugObjectHandle, ProcessDebugFlags, breakpoints de hardware DR0-7, comprobación de single-step por temporización |
| Anomalía de temporización | Basada en RDTSC: 50 muestras de latencia de NtQuerySystemInformation, media/desviación estándar, marca si más del 10% de las muestras superan 3σ de varianza. Detecta la sobrecarga de instrumentación. |
| Evasión de PEB | Parchea BeingDebugged, NtGlobalFlag, flags de ProcessHeap, DebugPort, ThreadHideFromDebugger — todo mediante lecturas del segmento GS + NtWriteVirtualMemory. Sin llamadas a API. |
Todas mediante syscalls Nt*, sin WinAPI.
EnablePrivilege(index) — establece cualquier privilegio por LUIDEnableAllTokenPrivileges() — 20 privilegios a la vez (Debug, Impersonate, TCB, Backup, Restore, etc.)GetProcessTokenIntegrityLevel() — consulta la integridad obligatoriaStealProcessToken(pid) — abre + duplica el token de otro procesoImpersonateThread() / RevertToSelf()EnumVirtualMemory() — recorre todas las regiones virtuales mediante NtQueryVirtualMemoryFindWritableExecRegions() — encuentra regiones comprometidas PAGE_EXECUTE_READWRITEHideRegion() — establece PAGE_NOACCESS para ocultar memoria de los escáneresUnhideRegion() — restaura la protección originalNtCreateFile → NtReadFile / NtWriteFile → NtClose. Cero llamadas a CreateFileA,
ReadFile, WriteFile o DeleteFileW. ReadFileContents(),
WriteFileContents(), DeleteFileNt(), FileExists().
NtCreateKey → NtSetValueKey. AddRunKeyPersistence(), RemoveRunKeyPersistence().
Sin RegCreateKeyEx, RegSetValueEx ni ninguna llamada a Advapi32.
EnumerateSystemHandles() — todos los handles abiertos en el sistema mediante
NtQuerySystemInformation(SystemHandleInformation)FindEDRHandles() — compara los PID propietarios con más de 30 nombres de procesos EDR
conocidos (MsSense, CrowdStrike, Sentinel, Cylance, Carbon Black, etc.)CloseEDRHandles() — cierra los handles de monitorización que el EDR colocó en tu
procesoIsProcessMonitored() — comprobación booleana: ¿estamos siendo vigilados?NtFreeVirtualMemory.