SysPlant
Tu fábrica de enganche de llamadas al sistema de Windows - con la puerta de Canterlot - Todo accesible a través de MCP
Documentación
..:: SysPlant ::..
Tu Fábrica de Syscalls (con Canterlot's Gate)
SysPlant es una herramienta de generación en Python de los métodos de hooking de syscalls actualmente conocidos. Actualmente soporta los siguientes gates (también conocidos como: iteradores):
- Hell's Gate : Busca el syscall por los primeros opcodes
- Halos's Gate : Busca el syscall por los primeros opcodes y busca cerca si la primera instrucción es un JMP
- Tartarus' Gate : Busca el syscall por los primeros opcodes y busca cerca si la primera o tercera instrucción es un JMP
- FreshyCalls : Busca el syscall por nombre (empieza con Nt y no Ntdll), ordena direcciones para recuperar el número de syscall
- SysWhispers2 : Busca el syscall por nombre (empieza con Zw), ordena direcciones para recuperar el número de syscall
- SysWhispers3 : Estilo SysWhispers2 pero introduce salto directo/indirecto/aleatorio con offset estático
- Canterlot's Gate ! :unicorn: :rainbow: (de una idea inicial del artículo de MDSEC) pero que carecía de un nombre de pony : Busca el syscall usando la Tabla de Excepciones en Tiempo de Ejecución (ordenada por número de syscall) y detecta el offset a la instrucción de syscall para saltos aleatorios.
- Custom Te permite elegir un iterador y un método de stub de syscall (directo / indirecto / aleatorio / egg_hunter) que describen la forma en que tus NtFunctions serán llamadas efectivamente.
:warning: DESCARGO DE RESPONSABILIDAD
Por favor, usa esta herramienta únicamente en sistemas a los que tengas permiso de acceso.
El uso está restringido solo a Pentesting o Educación.
Todos los créditos se basan en mi propia investigación, por favor siéntete libre de reclamar cualquier método si cometí errores...
Introducción
Este proyecto personal tiene como objetivo ser una herramienta simple para comprender y generar mejor diferentes métodos de recuperación de syscalls, y poder jugar con stubs de syscall directos / indirectos / egg_hunter. El primer objetivo fue poner mis manos en NIM y luego se desbordó a C, C++ y Rust :wink: ...
SysPlant ha sido desarrollado para usuarios de Linux, algunas cosas podrían no funcionar en Windows o Mac. Los PR son bienvenidos si encuentras algo que no funciona como se espera.
Lenguajes Soportados
| Lenguaje | Estado | Compilación cruzada desde Linux |
|---|---|---|
| NIM | :white_check_mark: Estable | nim c -d=release -d=danger -d=strip --opt=size -d=mingw --cpu=amd64 |
| C | :white_check_mark: Estable | x86_64-w64-mingw32-gcc -Wall -s -static -masm=intel |
| C++ | :white_check_mark: Estable | x86_64-w64-mingw32-g++ -Wall -s -static -masm=intel |
| Rust | :white_check_mark: Estable | cargo build --release --target x86_64-pc-windows-gnu |
Servidor MCP
SysPlant incluye un servidor Model Context Protocol (MCP) integrado, que permite a los asistentes de codificación con IA (Claude Code, Cursor, Windsurf, etc.) generar código de syscalls directamente desde su interfaz de chat.
# stdio (default — plug into your AI client)
python bridge_mcp_sysplant.py
# SSE or Streamable HTTP for web-based clients
python bridge_mcp_sysplant.py --transport sse --port 9090
Consulta la guía completa: Sysplant como servidor MCP
Uso general
$ sysplant -h
usage: main.py [-h] [--debug | --verbose | --quiet] {list,generate} ...
..:: SysPlant - Your Syscall Factory ::..
positional arguments:
{list,generate}
options:
-h, --help show this help message and exit
Output options:
--debug Display all DEBUG messages upon execution
--verbose Display all INFO messages upon execution
--quiet Remove all messages upon execution
$ sysplant generate -h
usage: main.py generate [-h] [-x86 | -wow | -x64] [-nim | -c | -cpp | -rust]
[-p {all,donut,common} | -f FUNCTIONS] [-x] -o OUTPUT
{hell,halo,tartarus,freshy,syswhispers,syswhispers3,canterlot,custom}
...
options:
-h, --help show this help message and exit
-x, --scramble Randomize internal function names to evade static analysis
-o OUTPUT, --output OUTPUT
Output path for generated file
Architecture options:
-x86 Set mode to 32bits
-wow Set mode to WoW64 (execution of 32bits on 64bits)
-x64 Set mode to 64bits (Default True)
Language options:
-nim Generate NIM code (Default: true)
-c Generate C code
-cpp Generate C++ code
-rust Generate Rust code
Syscall options:
-p {all,donut,common}, --preset {all,donut,common}
Preset functions to generate (Default: common)
-f FUNCTIONS, --functions FUNCTIONS
Comma-separated functions
Ejemplo de salida
Aquí hay un ejemplo de generación de syscalls en C usando el iterador Canterlot's Gate:
$ sysplant generate -c -o syscalls.c canterlot
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠶⢤⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⢀⣀⡀⠀⢀⣠⣤⣴⣶⣶⡦⠤⢤⣤⣀⣀⣼⠀⠀⡽⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠈⠫⣯⠙⡟⢿⣿⣿⡿⠁⠀⢠⣾⣿⣿⣿⡿⠀⠀⢹⠘⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⣼⣿⣷⣧⡀⢱⠈⠀⠀⠀⣿⣿⣿⣿⣿⡀⠀⠀⢸⠀⢳⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀..:: SysPlant - Your Syscall Factory ::..
⠀⣼⣿⣿⣿⣿⣿⣿⡄⢀⣀⣠⣿⣿⣿⠿⢿⣷⣤⡀⠈⠀⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢠⣿⣿⣿⣿⣿⣿⠿⠛⠉⠉⠀⡇⣾⣿⣦⣀⣿⡄⠀⠀⢰⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀ Sysplant (2023) - 0x42en
⢸⣿⣿⣿⠿⢯⣷⢄⠀⠀⠀⠀⡄⢻⣿⣯⣻⣿⡧⠄⠀⢸⠀
⠘⣿⠟⠁⠀⠚⢻⣦⣱⣄⠀⠀⢣⠈⠛⣽⣿⠿⠭⠀⣠⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡤⠶⠶⠶⠶⢤⣄⡀⠀⠀⠀⠀⠀ Canterlot's Gate (2022) - @MDSecLabs
⠀⠁⠀⠀⠀⠀⠀⠻⣿⣿⠀⠀⠈⠂⠀⠀⢀⣄⣠⣴⣿⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠶⠋⠁⠀⠀⠀⠀⠀⠀⠀⠉⠳⢦⡀⠀ @0x42en
⠀⠀⠀⠀⠀⠀⠀⠀⣸⠋⠄⢠⠀⠀⠀⠀⣾⣿⣿⣿⣿⣿⡀⠀⠀⠀⠀⠀⠀⠀⡴⠃⠀⣠⣤⣶⣶⣾⣶⣶⣦⣄⠀⠀⠀⠹⣆⠀⠀⠀⠀ Syswhispers3 (2022) - @klezVirus
⠀⠀⠀⠀⠀⠀⠀⠀⠈⠲⠴⠯⠤⠤⢶⢾⣿⣿⣿⣿⣿⠏⠷⣄⢀⣀⣀⣀⡀⣼⣠⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠸⣧⠀⠀ Syswhispers2 (2021) - @Jackson_T
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠏⠈⠉⣡⣾⣿⠏⠀⢰⣿⠉⣩⠀⠉⢙⣿⡿⠛⠉⠉⠙⠛⢿⣿⣿⣿⣿⣿⣿⣷⠀⠀⠀⢻⣇⠀ @modexpblog
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠀⠀⣿⣿⡿⠋⠀⢀⣾⡿⠀⣉⣀⣇⠘⠋⣿⠀⠀⠀⠀⠀⠀⠙⣿⣿⣿⣿⣿⣿⡆⠀⠀⢸⣿⡆ Tartarus' Gate (2021) - @trickster0
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⠃⠀⠀⠘⢯⡀⠀⢀⣾⣿⠇⣴⠨⣿⣿⡯⠀⢸⠀⠀⠀⠀⠀⠀⠀⠘⣿⣿⣿⣿⣿⡇⠀⠀⢸⣿⣷ Halo's Gate (2021) - @Sektor7net
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡆⠀⠀⠀⠈⠻⢦⣾⣿⠏⠀⠈⢈⣝⡟⠁⣶⣾⠀⠀⠀⠀⠀⠀⠀⠀⢹⣿⣿⣿⣿⡇⠀⠀⢸⣿⣿⡀ FreshyCalls (2020) - @crummie5
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡀⢄⣀⡀⠀⠀⠉⠁⠀⠰⣄⠀⠁⠀⠀⢀⡏⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⣿⣿⣿⠃⠀⠀⣸⣿⣿⡇ Hell's Gate (2020) - @RtlMateusz
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⢷⡀⢹⠁⠀⢠⠶⠤⠤⢴⡾⢦⡀⠀⠀⣼⠦⡄⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⠀⠀⠀⣿⣿⣿⠇ @am0nsec
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣷⠇⠀⠀⢸⡄⠀⠀⠀⠙⢆⠙⢦⡀⠀⠀⠙⣦⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⡇⠀⠀⢰⣿⡿⠋⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡟⠀⠀⠀⡟⢻⡀⠀⠀⠀⠈⢳⡀⢳⡀⠀⠀⠈⢧⡀⠀⠀⠀⠀⠀⣿⣿⣿⠁⠀⢀⣼⠟⠁⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⠀⠀⠀⠀⡇⠀⢧⠀⠀⠀⠀⠀⢷⠀⢳⠀⠀⠀⠈⢧⠀⠀⠀⠀⢀⣿⣿⡏⢀⣴⠟⠁⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⠀⠀⠀⠀⢸⠇⠀⠸⡆⠀⠀⠀⠀⢸⠀⢸⡇⠀⠀⠀⠘⣧⠀⠀⠀⢸⣿⣿⡷⠛⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡞⠀⠀⠀⠀⠀⣾⠀⠀⠀⣧⠀⠀⠀⠀⢸⠀⠀⡇⠀⠀⠀⠀⢸⡆⠀⠀⣿⠿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠎⠀⠀⠀⠀⠀⣰⠇⠀⠀⠀⣿⠀⠀⠀⠀⣏⣀⣸⠇⠀⠀⠀⠀⠀⣷⠀⠈⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⠤⣤⣤⣤⡤⠴⠛⠛⠛⠛⠉⠁⠀⠀⠀⠀⠈⠉⢿⣄⣀⣠⣤⡤⠶⠋⠀⠀⠀⠀⠀⠀⠀⠀
[+] Summary of params used
. Language: C
. Architecture: x64
. Selected syscall iterator: canterlot
. Selected syscall caller stub: random
. Common supported functions selected
. Randomize internal function: False
[+] Syscall file written to syscalls.c.h
¿Qué es la opción iterator ?
Sysplant se basa en mecanismos existentes para la recuperación de números de syscall y direcciones. No reclamo ninguno de sus descubrimientos, solo armonizo todos estos métodos en una sola herramienta para poder generarlos fácilmente usando plantillas. Estos mecanismos se llaman iterator, si miras el código probablemente entenderás por qué :wink:
Si quieres profundizar en las explicaciones de ¿qué es un syscall? deberías revisar la publicación del blog de @Alice Climent sobre técnicas de syscalls
¿Qué es la opción method ?
Una vez que tu iterator ha sido elegido, puedes especificar una opción method basada en las formas existentes de llamar a syscalls. Todos los iteradores son compatibles, lo que te permite seleccionar lo que quieras como stub final de syscall.
- Directo: el syscall se realiza directamente en la llamada ASM de Sysplant. Solo necesitas el número de syscall, pero AV/EDR podrían verte...
- Indirecto: la llamada ASM de Sysplant salta al inicio del stub de Ntdll. Solo necesitas la dirección del syscall y ya no llamas a syscall en tu código, pero AV/EDR podrían enganchar estas funciones
- Aleatorio: la llamada ASM de Sysplant salta a una instrucción de syscall aleatoria de los stubs de Ntdll. Necesitas el número de syscall y 1 dirección de instrucción de syscall. Entonces ya no llamas a syscall en tu código y puedes evitar funciones enganchadas.
- Egg Hunter: la instrucción
syscallen línea se reemplaza por un marcador aleatorio de 8 bytes (el egg). En tiempo de ejecución, llama aSPT_SanitizeSyscalls()antes de cualquier función Nt* para escanear la sección.texty parchear cada egg de vuelta asyscall; ret. Esto evita firmas estáticas en el opcode0F 05mientras mantiene el rendimiento de llamada directa.
Documentación
He intentado mantener una documentación actualizada, así que por favor LEE LA DOC. Encontrarás allí mucha información sobre los usos de la herramienta y una descripción completa de las clases y métodos.
Se describen algunos usos específicos:
Créditos
Un gran agradecimiento a estos proyectos útiles que me ayudaron durante este viaje, o a individuos por sus revisiones
- @alice publicación sobre técnicas de syscalls
- @redops publicación sobre syscalls directos vs indirectos
- @Jackson_T & @modexpblog por Syswhispers2
- @klezvirus por syswhispers3
:construction: TODO
Este proyecto está en estado WIP...
Algunos PR y revisiones son más que bienvenidos :tada: !
- Añadir aleatorización de nombres internos
- Configurar documentación
- Configurar pruebas
- Añadir soporte x86
- Añadir soporte WoW64
- Configurar plantillas NIM
- Configurar plantillas C
- Configurar plantillas Rust
- Configurar plantillas C++
- Configurar plantillas Go / C# / Lo que sea
Licencia
Este proyecto está licenciado bajo la Licencia GPLv3, solo para individuos. Si quieres integrar este trabajo en tu proyecto comercial, por favor contáctame a través de 0x42en[at]gmail.com
