Skip to content
KitploitKITPLOIT
HerramientasExploitsBlog
Enviar
HerramientasExploitsBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

··Feeds·Contacto·Privacidad·© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
stealth_call — Header-only Windows x64 indirect syscall library. Zero CRT, zero IAT, VEH anti-BP, AMSI/ETW bypass, W^X memory, per-call dynamic stubs. | Kitploit
Herramientas/GitHubGitHub/kitsune-de/stealth_call
Herramientas DefensivasExplotaciónAnálisis de MalwareRed TeamingDesarrollo de PayloadsAnti-Bot
GitHubkitsune-de/stealth_call

stealth_call

Header-only Windows x64 indirect syscall library. Zero CRT, zero IAT, VEH anti-BP, AMSI/ETW bypass, W^X memory, per-call dynamic stubs.

Ver Repositorio
647hace 5 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

stealth_call


¿Qué es esto?

Librería de solo cabecera para Windows x64 que te permite invocar cualquier syscall de NT sin tocar los imports de ntdll, sin dejar cadenas en tu binario y sin las banderas rojas habituales que hacen que los EDR pierdan la cabeza.

Sin CRT. Sin STL. Sin IAT. Todo se compila hasta ~19KB con literalmente cero dependencias de DLL.

Diseñada para evitar los errores comunes de las librerías de syscall existentes: cadenas en texto plano, constantes hash conocidas, syscall directo desde memoria que no es de ntdll, imports IAT que gritan "estoy haciendo algo raro", IOC SEC_NO_CHANGE, inflado de CRT. Nada de eso aquí.


Características

Motor de Syscalls
  • Syscalls indirectos: los stubs saltan al gadget syscall; ret propio de ntdll, por lo que RIP siempre está dentro de ntdll cuando se ejecuta la instrucción syscall
  • Generación de stubs por llamada: cada invocación individual construye un stub nuevo con basura aleatoria, diseño aleatorio y número de syscall con XOR. Nada se reutiliza
  • Cumplimiento W^X: las páginas de scratch pasan de RW → RX → RW. RWX nunca se asigna, punto
  • Los stubs se borran inmediatamente después de cada llamada
  • Syscalls extraídas del mapeo de sección \KnownDlls\ntdll.dll (sin acceso al sistema de archivos, invisible para ProcMon)
  • 977 syscalls resueltas en un sistema Win11 típico

Anti-Breakpoint

  • Enfoque basado en VEH: si un depurador coloca un 0xCC en tu función objetivo, el manejador de excepciones restaura silenciosamente el byte original, ejecuta la instrucción bajo single-step y luego vuelve a poner el breakpoint. El depurador nunca se entera de que fue evadido. Cero ventana de tiempo
  • Funciona en cualquier función de cualquier DLL, no solo en ntdll

Evasión

  • Bypass de AMSI: parchea AmsiScanBuffer para que devuelva S_OK
  • Bypass de ETW: parchea EtwEventWrite para que devuelva SUCCESS
  • Todo el parcheo se hace mediante syscalls directos, no con VirtualProtect
  • Cadenas cifradas con XOR en todas partes: nombres de DLL, rutas, todo. Se descifran en la pila y se borran después de su uso
  • Algoritmo hash personalizado (ni FNV-1a, ni CRC32: sin firmas YARA conocidas)
  • Recorrido de PEB para toda resolución de módulos/funciones: sin GetModuleHandle, sin GetProcAddress

Calidad del Código

  • Solo cabecera: coloca la carpeta stealth/ en tu proyecto y listo
  • Seguro para hilos mediante páginas de scratch por hilo + spinlocks
  • Limpieza completa al apagar: las páginas de scratch se liberan, los mapas se ponen a cero, el VEH se elimina
  • Detección de hooks para trampolines comunes de EDR (jmp rel32, jmp [rip], mov rax + jmp rax)

Cómo Funciona

flow

Ruta de Syscall

  1. initialize() abre ntdll a través de la sección \KnownDlls, analiza los exports del PE y captura cada número de syscall
  2. Escanea el .text de ntdll en busca de un gadget syscall; ret: desde aquí se ejecutará la instrucción syscall real
  3. Cuando llamas a sc::invoke():
    • Busca la entrada de syscall por hash
    • Toma la página de scratch del hilo que llama (o asigna una, solo RW)
    • emit_stub() construye un stub polimórfico único: instrucciones basura aleatorias antes/después, número de syscall ofuscado con XOR y clave por llamada, jmp indirecto al gadget de ntdll
    • Cambia la página de RW → RX
    • Llama a través del stub
    • Cambia de vuelta de RX → RW
    • Pone a cero los bytes del stub

En ningún momento existe memoria RWX. En ningún momento se ejecuta una instrucción syscall fuera de ntdll. En ningún momento los números de syscall se almacenan en texto plano.

Trampolín VEH

Llamas a tramp::invoke() con la función objetivo. Si no hay breakpoint, la función simplemente se ejecuta normalmente con cero sobrecarga. Si un depurador colocó 0xCC:

  1. Se dispara la excepción INT3
  2. Nuestro manejador VEH comprueba si la dirección está en nuestra tabla (búsqueda por hash, no escaneo lineal)
  3. Restaura el byte original desde una copia limpia leída del disco
  4. Establece el Trap Flag
  5. Continúa la ejecución: la instrucción real se ejecuta
  6. Se dispara la excepción de single-step
  7. El manejador vuelve a colocar el 0xCC

La lista de breakpoints del depurador sigue mostrándolo como activo. El breakpoint simplemente nunca se dispara en nuestras llamadas.


Compilación

root@kitploit:~
cmake -B build -A x64
cmake --build build --config Release

Requiere MSVC (VS 2019+) y CMake 3.15+. La salida es de ~19KB con cero imports.


Uso

Syscalls

root@kitploit:~
#include "stealth/syscall.hpp"

stealth::sc::initialize();

PVOID base = nullptr;
SIZE_T size = 0x1000;
NTSTATUS status = stealth::sc::invoke<NTSTATUS>(
    HASH("NtAllocateVirtualMemory"),
    NtCurrentProcess(), &base, (ULONG_PTR)0, &size,
    (ULONG)(MEM_COMMIT | MEM_RESERVE), (ULONG)PAGE_READWRITE
);

Anti-Breakpoint

root@kitploit:~
#include "stealth/trampoline.hpp"

// funciona incluso si x64dbg tiene un BP en MessageBoxA
int ret = stealth::tramp::invoke<int>(
    HASH_CI("user32.dll"), HASH("MessageBoxA"),
    (HWND)nullptr, (LPCSTR)"hello", (LPCSTR)"title", (UINT)MB_OK
);

AMSI / ETW

root@kitploit:~
#include "stealth/bypass.hpp"

stealth::bypass::patch_etw();
stealth::bypass::patch_amsi();

Limpieza

root@kitploit:~
stealth::tramp::shutdown();
stealth::sc::shutdown();

Estructura del Proyecto

root@kitploit:~
stealth/
  common.hpp      — operaciones de memoria, spinlock, static_map, PRNG, salida de depuración
  hash.hpp        — hash personalizado en tiempo de compilación
  xorstr.hpp      — cifrado de cadenas XOR en tiempo de compilación
  peb.hpp         — recorrido de PEB, analizador de exports PE, detección de hooks
  syscall.hpp     — motor de syscalls indirectos, generador de stubs, W^X, anti-dump
  trampoline.hpp  — anti-breakpoint basado en VEH
  bypass.hpp      — parcheo de AMSI + ETW

Licencia

MIT: haz lo que quieras con ello.

Descargar herramienta