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)

Canterlot's Gate

PyPI version Supported Python versions Build Status Project Licence PyPI downloads Code Quality MCP Server Code style: Black Documentation Status

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

LinguagemStatusCross-compile a partir do Linux
NIM:white_check_mark: Estávelnim c -d=release -d=danger -d=strip --opt=size -d=mingw --cpu=amd64
C:white_check_mark: Estávelx86_64-w64-mingw32-gcc -Wall -s -static -masm=intel
C++:white_check_mark: Estávelx86_64-w64-mingw32-g++ -Wall -s -static -masm=intel
Rust:white_check_mark: Estávelcargo 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.

  1. Direto: o syscall é feito diretamente na chamada ASM do Sysplant. Você só precisa do número do syscall, mas AV/EDR podem te ver...
  2. 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
  3. 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.
  4. Egg Hunter: a instrução syscall inline é substituída por um marcador aleatório de 8 bytes (o egg). Em tempo de execução, chame SPT_SanitizeSyscalls() antes de qualquer função Nt* para escanear a seção .text e corrigir cada egg de volta para syscall; ret. Isso evita assinaturas estáticas no opcode 0F 05 enquanto mantém o desempenho de chamada direta.

Sysplant Stubs

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

: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