SysPlant
Sua fábrica de hooking de syscalls do Windows - com Canterlot's Gate - Tudo acessível via MCP
Documentação
..:: SysPlant ::..
Sua Fábrica de Syscalls (com a participação de Canterlot's Gate)
SysPlant é uma ferramenta de geração em Python dos métodos de hooking de syscalls atualmente conhecidos. Atualmente, ela suporta os seguintes gates (também conhecidos como: iteradores):
- Hell's Gate : Busca o syscall pelos primeiros opcodes
- Halos's Gate : Busca o syscall pelos primeiros opcodes e procura nas proximidades se a primeira instrução é um JMP
- Tartarus' Gate : Busca o syscall pelos primeiros opcodes e procura nas proximidades se a primeira ou a terceira instrução é um JMP
- FreshyCalls : Busca o syscall pelo nome (começa com Nt e não Ntdll), ordena os endereços para recuperar o número do syscall
- SysWhispers2 : Busca o syscall pelo nome (começa com Zw), ordena os endereços para recuperar o número do syscall
- SysWhispers3 : Estilo SysWhispers2, mas introduz saltos diretos/indiretos/aleatórios com deslocamento estático
- Canterlot's Gate ! :unicorn: :rainbow: (a partir de uma ideia inicial do artigo do MDSEC), mas que estava faltando um nome de pônei : Busca o syscall usando a Tabela de Exceções em Tempo de Execução (ordenada por número de syscall) e detecta o deslocamento até a instrução do syscall para saltos aleatórios.
- Custom Permite que você escolha um iterador e um método de stub de syscall (direto / indireto / aleatório / egg_hunter) que descrevem a forma como suas NtFunctions serão efetivamente chamadas.
:warning: AVISO
Use esta ferramenta apenas em sistemas aos quais você tenha permissão de acesso.
O uso é restrito apenas a Testes de Penetração ou Educação.
Todos os créditos são baseados na minha própria pesquisa; sinta-se à vontade para reivindicar qualquer método se eu cometer erros...
Introdução
Este projeto pessoal tem como objetivo ser uma ferramenta simples para melhor entender e gerar diferentes métodos de recuperação de syscalls, além de permitir brincar com stubs de syscall diretos / indiretos / egg_hunter. O primeiro objetivo era colocar as mãos no NIM e depois transbordou para C, C++ e Rust :wink: ...
O SysPlant foi desenvolvido para usuários de Linux; algumas coisas podem não funcionar no Windows ou Mac. PRs são bem-vindos se você encontrar algo que não funcione como esperado.
Linguagens Suportadas
| Linguagem | Status | Cross-compile a partir do Linux |
|---|---|---|
| NIM | :white_check_mark: Estável | nim c -d=release -d=danger -d=strip --opt=size -d=mingw --cpu=amd64 |
| C | :white_check_mark: Estável | x86_64-w64-mingw32-gcc -Wall -s -static -masm=intel |
| C++ | :white_check_mark: Estável | x86_64-w64-mingw32-g++ -Wall -s -static -masm=intel |
| Rust | :white_check_mark: Estável | cargo build --release --target x86_64-pc-windows-gnu |
Servidor MCP
O SysPlant acompanha um servidor Model Context Protocol (MCP) integrado, permitindo que assistentes de codificação com IA (Claude Code, Cursor, Windsurf, etc.) gerem código de syscall diretamente pela interface 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
Veja o guia completo: Sysplant como servidor MCP
Uso geral
$ 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
Exemplo de saída
Aqui está um exemplo de geração de syscall em C usando o 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
O que é a opção iterator ?
O Sysplant é baseado em mecanismos existentes para recuperação de números e endereços de syscalls. Não reivindico a descoberta de nenhum deles; apenas harmonizo todos esses métodos em uma única ferramenta para poder gerá-los facilmente usando templates. Esses mecanismos são chamados de iterator; se você olhar o código, provavelmente entenderá o porquê :wink:
Se você quiser se aprofundar nas explicações de o que é um syscall ?, confira o post do blog da @Alice Climent sobre técnicas de syscalls
O que é a opção method ?
Depois que seu iterator for escolhido, você pode especificar uma opção de method com base nas formas existentes de chamar syscalls. Todos os iteradores são suportados, o que permite selecionar o que você quiser como stub final de syscall.
- Direto: o syscall é feito diretamente na chamada ASM do Sysplant. Você só precisa do número do syscall, mas AV/EDR podem te ver...
- Indireto: a chamada ASM do Sysplant salta para o início do stub do Ntdll. Você só precisa do endereço do syscall e não chama mais syscall no seu código, mas AV/EDR podem fazer hook nessas funções
- Aleatório: a chamada ASM do Sysplant salta para uma instrução de syscall aleatória dos stubs do Ntdll. Você precisa do número do syscall e de 1 endereço de instrução de syscall. Assim, você não chama mais syscall no seu código e pode evitar funções com hook.
- Egg Hunter: a instrução
syscallinline é substituída por um marcador aleatório de 8 bytes (o egg). Em tempo de execução, chameSPT_SanitizeSyscalls()antes de qualquer função Nt* para escanear a seção.texte corrigir cada egg de volta parasyscall; ret. Isso evita assinaturas estáticas no opcode0F 05enquanto mantém o desempenho de chamada direta.
Documentação
Tentei manter uma documentação atualizada, então por favor LEIA A DOC. Você encontrará muitas informações sobre os usos da ferramenta e uma descrição completa das classes e métodos.
Alguns usos específicos são descritos:
Créditos
Um enorme agradecimento a estes projetos úteis que me ajudaram durante esta jornada, ou a indivíduos por suas revisões
- @alice post sobre técnicas de syscalls
- @redops post sobre syscalls diretos vs indiretos
- @Jackson_T & @modexpblog pelo Syswhispers2
- @klezvirus pelo syswhispers3
:construction: TODO
Este projeto está em estado de WIP...
Algumas PRs e revisões são mais do que bem-vindas :tada: !
- Adicionar randomização de nomes internos
- Configurar documentação
- Configurar testes
- Adicionar suporte a x86
- Adicionar suporte a WoW64
- Configurar templates NIM
- Configurar templates C
- Configurar templates Rust
- Configurar templates C++
- Configurar templates Go / C# / Outros
Licença
Este projeto é licenciado sob a Licença GPLv3, apenas para indivíduos. Se você quiser integrar este trabalho em seu projeto comercial, entre em contato comigo através de 0x42en[at]gmail.com
