
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:
| 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 |
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 RAX49 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 erroneamenteAether 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:
| 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) |
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 bitsQUERY_INFORMATION | GET_CONTEXT → QUERY_INFORMATION → QUERY_LIMITED_INFORMATION por
thread, para que cenários de acesso parcial ainda produzam classificações úteisA 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: