
Ferramenta de memória forense e caça a ameaças para Windows que examina a memória de processos ativos em busca de padrões maliciosos, técnicas de injeção e assemblies .NET carregados reflexivamente, usando um modelo de confiança em várias camadas para reduzir falsos positivos.

versão : 0.9 (lançamento estável)
Aether é uma ferramenta Windows de forense de memória e caça a ameaças que analisa a memória de processos ativos em busca de padrões maliciosos, detecta técnicas de injeção, assinaturas de implantes, assemblies .NET carregados reflexivamente. Funciona com um modelo de confiança em múltiplas camadas que reduz drasticamente a taxa de falsos positivos e caça comportamentos maliciosos. Aether tem boa capacidade de detectar técnicas como Hollowing, APC, e sequestro de threads. Analistas de segurança podem usá-la para analisar, caçar e capturar regiões suspeitas para análise offline.
Documentos: https://0xsp.com/docs/aether-getting-started/
Artigos de pesquisa:
Breves explicações sobre as principais funcionalidades do Aether. Você pode ler o artigo técnico completo para obter mais informações:
"msxsl:script" se torna 6D 00 73 00 78 00 ...)rules/
sem recompilaçãoMEM_PRIVATE — sinaliza assemblies .NET
carregados reflexivamente (metadados MZ + PE + BSJB)Aether aplica cinco filtros sobre o sinal bruto do working-set, de modo que uma descoberta requer vários indicadores concordantes antes de ser reportada com filtragem de FP:
Outras verificações estruturais:
MEM_IMAGE que não estão
na lista de módulos da PEB (hollowing de DLL / stomping de módulo)K32QueryWorkingSetEx, em lote com uma chamada de sistema por região em vez
de uma por página de 4 KB (≈ 50-100× mais rápido que o loop ingênuo)MEM_PRIVATE + PAGE_EXECUTE_* (produz resultados FP)
(shellcode, JIT spray, alocações de stubs de código dinâmico)E9 ?? ?? ?? ?? — JMP rel32FF 25 ?? ?? ?? ?? — JMP [rip+disp32]68 ?? ?? ?? ?? C3 — PUSH imm32 ; RET48 B8 ?? ?? ?? ?? ?? ?? ?? ?? FF E0 — MOV RAX, imm64 ; JMP RAXAether verifica threads com classificação mais rigorosa e
correlação cruzada com as descobertas L1–L5. Para cada thread criada no
processo alvo, Aether lê seu Win32StartAddress via NtQueryInformationThread
e, quando o acesso permite, também o Rip / Eip ativo via
GetThreadContext / Wow64GetThreadContext.
Cada endereço é então classificado conforme a tabela a seguir. Para mais detalhes, leia o artigo:
O que torna isso mais forte do que a verificação básica "o start_address está em algum módulo":
VirtualQueryEx — cada endereço é consultado por Type /
Protect / AllocationBase em uma única chamada O(1) em vez de uma varredura
linear na lista de módulosTSAV_MODIFIED_HOSTWin32StartAddress é gravável no processo via
NtSetInformationThread e é o campo falsificável; o Rip ativo de uma
thread suspensa é aquele que um carregador não pode reescrever facilmente. Comparamos
os dois e sinalizamos qualquer discordância que resolva para uma região suspeitaWow64GetThreadContext e
lê Eip para threads de 32 bits dentro de um processo de 64 bitsA resolução de API em tempo de execução é uma técnica frequentemente usada por malware. O mecanismo de detecção do Aether identifica esse comportamento analisando o heap em busca de endereços e ponteiros de módulo válidos, e correlacionando os resultados com os critérios de filtragem descritos abaixo:
Cada filtro elimina uma classe específica de FP observada em telemetria real:
Aether suporta detecção de padrão XOR no nível do stub por enquanto e adota o algoritmo de entropia de Shannon para verificar a aleatoriedade dos valores de bytes em uma região de memória, sinalizando tudo acima de um limiar. Para lidar com a alta quantidade de FP, o Aether usa múltiplos indicadores.
GetExtendedTcpTable para um PID alvoMODIFIED_CODE_* carrega
private_pages e region_pages para que a triagem tenha os números reaisAether.exe --scan --pid <PID> [OPÇÕES]
Aether.exe --scan --lookup "NomeDoProcesso.exe"
Aether.exe --hunt <PID> SLEEP_MS PERIOD
Aether.exe --scan-all [OPÇÕES]
git clone https://github.com/0xsp-SRD/aether
cd aether
# Compilação de depuração (verificações de segurança ativadas)
zig build
# Compilação de lançamento (binário menor e mais rápido)
zig build -Doptimize=ReleaseSafe
# ou
zig build -Doptimize=ReleaseFast
O executável compilado fica em zig-out/bin/Aether.exe.
Copie zig-out/bin/Aether.exe e o diretório rules/ para a máquina
Windows alvo se você quiser realizar varreduras de assinatura adicionais. Se o processo alvo exigir privilégios de Administrador, você precisa executar o Aether.exe com privilégios de Administrador.
Win32StartAddress
em uma thread já em execução só pode ser detectada se a thread estiver
parada em uma espera quando sondada (mesma restrição do Moneta)Aether Community é licenciado sob a GNU GPL v3.0. Licenças comerciais estão disponíveis apenas junto ao autor para uso proprietário ou comercial.
| Camada | Filtro | Propósito |
|---|
| L1 | Estrutural | Apenas sub-regiões executáveis de IMAGE são consideradas (elimina ruído COW de .data / .rdata) |
| L2 | Quantitativo | Classificar por contagem de private_pages e private_ratio (baixo / médio / alto) |
| L3 | Corroboração | Promover apenas se um sinal independente concordar na mesma base de alocação — acerto de assinatura, missing_peb_entry, private_rwx, prólogo de hook, ou diff em disco |
| L4 | Consciente de CLR | Supressão por módulo para alvos ngen / R2R / tiered-JIT (*.ni.dll, mscor*, clr*, coreclr, system.private.corelib*) em vez de pular completamente quando o CLR está carregado |
| L5 | Diff em disco | Mapear o arquivo do módulo com CreateFileMappingW(SEC_IMAGE_NO_EXECUTE); comparar os primeiros 16 bytes de cada página executável privada com o mesmo RVA no disco. Qualquer divergência é um IOC de modificação real |
49 BB ?? ?? ?? ?? ?? ?? ?? ?? 41 FF E3 — Estilo Detours
MOV R11, imm64 ; JMP R11Cor_Private_IPCBlock_v4_<PID>
e o v2 Cor_Private_IPCBlock_<PID> (legado .NET 2/3 / mscorwks),
para que pools de aplicativos barulhentos executando runtimes antigos não sejam classificados erroneamente| Veredito | Gravidade | Condição |
|---|
TSAV_SHELLCODE_PRIVATE | CRÍTICO | O endereço está em uma região MEM_PRIVATE + PAGE_EXECUTE_* — shellcode clássico de CreateRemoteThread |
TSAV_SUSPENDED_RIP | CRÍTICO | O Rip de uma thread suspensa discorda de Win32StartAddress e resolve para uma região suspeita — captura falsificação de Win32StartAddress (truques EarlyBird / APC) e sequestros de SetThreadContext |
TSAV_HOLLOWED_HOST | ALTA | Endereço dentro de uma alocação MEM_IMAGE que não está na lista de módulos da PEB (hollowing de DLL / stomping de módulo) |
TSAV_MODIFIED_HOST | ALTA | Endereço dentro de uma alocação MEM_IMAGE que o pipeline L1–L5 já sinalizou como MODIFIED_CODE_*, MISSING_PEB, PRIVATE_RWX, DISK_MEM_DIFF, ou HOOK_PROLOGUE |
TSAV_STAGED_PRIVATE_RW | ALTA | MEM_PRIVATE + PAGE_READWRITE — preparação de shellcode antes de VirtualProtect |
TSAV_MAPPED_NONPE | MÉDIA | MEM_MAPPED (seção com suporte de arquivo de paginação) sem cabeçalho PE — sRDI / carregador reflexivo de arquivo de paginação |
TSAV_SPOOF_TRAMPOLINE | MÉDIA | Endereço corresponde a um trampolim na lista de bloqueio (LoadLibraryA/W/ExA/W, WinExec, CreateProcessA/W, VirtualAlloc[Ex], RtlExitUserThread, RtlExitUserProcess, NtTerminateProcess, ShellExecuteA/W) |
QUERY_INFORMATION | GET_CONTEXTQUERY_INFORMATIONQUERY_LIMITED_INFORMATION| Filtro | Regra | Classe de FP que remove |
|---|
| F1 | count >= 5 | dados aleatórios em forma de ponteiro, NULL, HMODULES |
| F2 | rejeitar execuções que apontam apenas para o EXE hospedeiro | vtables de classe C++ do aplicativo |
| F3 | distinct_modules >= 2 | vtables de framework de DLL única (Qt, MFC, wxWidgets) |
| F4 | capability_modules >= 2 | vtables de navegador / CRT que tocam uma única DLL do SO (ex. iertutil + ucrtbase + shlwapi) |
| F5 (L10) | >= 80% dos ponteiros verificáveis caem em RVAs exportados | Tabelas de dispatch Winsock LSP, arrays de callbacks de plugin, vtables apontando para métodos internos (não exportados) |
| Bandeira | Descrição |
|---|
--pid, -p <PID> | ID do processo alvo para escanear |
--lookup, -l <nome> | Encontrar todos os PIDs que correspondem a um nome de processo |
--json, -j | Saída dos resultados como JSON (para integração com SIEM) |
--verbose, -v | Mostrar detalhes da varredura por região |
--scan-all, -a | Escanear todos os processos |
--hunt, -b <PID> [ms] [acessos] | Monitorar conexões — consultar a cada ms (padrão 2000), sinalizar endpoints com ≥ acessos ocorrências |
--networking | Modo de monitoramento de rede |
--rules, -r <dir> | Diretório de regras (padrão: rules/) |
--config, -c <arquivo> | Arquivo de regra único (formato legado) |
--dump, `` | Despejar região de memória específica com tamanho personalizado |
--read, `` | Ler conteúdo da região de memória ao vivo no terminal |
--help, -h | Mostrar ajuda |