Инструмент для криминалистического анализа памяти Windows и поиска угроз, который сканирует память активных процессов на предмет вредоносных шаблонов, техник внедрения и рефлективно загруженных сборок .NET, используя многоуровневую модель доверия для снижения ложных срабатываний.

версия : 0.9 (стабильный релиз)
Aether — это инструмент для криминалистики памяти Windows и поиска угроз, который сканирует живую память процессов на наличие вредоносных паттернов, обнаруживает техники инъекций, сигнатуры имплантов, рефлективно загруженные сборки .NET. Он работает с многоуровневой моделью доверия, которая значительно снижает уровень ложных срабатываний и охотится за вредоносным поведением. Aether обладает хорошими возможностями для обнаружения техник Hollowing, APC, перехвата потоков. Аналитики безопасности могут использовать его для сканирования, поиска и создания снимков подозрительных областей для офлайн-анализа.
Документация: https://0xsp.com/docs/aether-getting-started/
Научные статьи:
Краткие пояснения к основным возможностям Aether, вы можете прочитать полный технический блогпост для получения более глубокой информации:
"msxsl:script" превращается в 6D 00 73 00 78 00 ...)rules/ без перекомпиляцииMEM_PRIVATE — отмечает рефлективно загруженные сборки .NET (метаданные MZ + PE + BSJB)Aether накладывает пять фильтров поверх сырого сигнала рабочего набора, чтобы вывод требовал нескольких совпадающих индикаторов, прежде чем будет сообщено с фильтрацией ЛП:
| Слой | Фильтр | Назначение |
|---|---|---|
| L1 | Структурный | Рассматриваются только исполняемые подобласти IMAGE (исключает шум .data / .rdata из-за COW) |
| L2 | Количественный | Оценка по количеству private_pages и коэффициенту private_ratio (низкий / средний / высокий) |
| L3 | Подтверждение | Повышение уровня только если независимый сигнал согласуется с тем же базовым адресом выделения — попадание сигнатуры, missing_peb_entry, private_rwx, пролог перехвата, или различие с диском |
| L4 | CLR-осведомлённый | Подавление по модулям для ngen / R2R / tiered-JIT целей (*.ni.dll, mscor*, clr*, coreclr, system.private.corelib*) вместо полного пропуска при загрузке CLR |
| L5 | Различие с диском | Отображение файла модуля с помощью CreateFileMappingW(SEC_IMAGE_NO_EXECUTE); сравнение первых 16 байт каждой приватной исполняемой страницы с тем же RVA на диске. Любое расхождение является IOC реального изменения |
Другие структурные проверки:
MEM_IMAGE, отсутствующие в списке модулей PEB (заполнение DLL / замещение модуля)K32QueryWorkingSetEx, пакетированное с одним системным вызовом на регион вместо одного на каждые 4 КБ страницу (≈ в 50-100 раз быстрее наивного цикла)MEM_PRIVATE + PAGE_EXECUTE_* (даёт ЛП) (шелл-код, JIT-спрей, выделения динамических заглушек кода)E9 ?? ?? ?? ?? — JMP rel32FF 25 ?? ?? ?? ?? — JMP [rip+disp32]68 ?? ?? ?? ?? C3 — PUSH imm32 ; RET48 B8 ?? ?? ?? ?? ?? ?? ?? ?? FF E0 — MOV RAX, imm64 ; JMP RAX49 BB ?? ?? ?? ?? ?? ?? ?? ?? 41 FF E3 — стиль Detours MOV R11, imm64 ; JMP R11Cor_Private_IPCBlock_v4_<PID> и v2 Cor_Private_IPCBlock_<PID> (устаревший .NET 2/3 / mscorwks), чтобы шумные пулы приложений, работающие на старых средах выполнения, не были ошибочно классифицированыAether проверяет потоки с более строгой классификацией и перекрёстной корреляцией с результатами L1–L5. Для каждого созданного потока в целевом процессе Aether читает его Win32StartAddress через NtQueryInformationThread и, когда разрешает доступ, также живой Rip / Eip через GetThreadContext / Wow64GetThreadContext.
Каждый адрес затем оценивается по следующей таблице. Для получения дополнительной информации читайте блогпост:
| Вердикт | Серьёзность | Условие |
|---|---|---|
TSAV_SHELLCODE_PRIVATE | КРИТИЧЕСКИЙ | Адрес находится в регионе MEM_PRIVATE + PAGE_EXECUTE_* — классический шелл-код CreateRemoteThread |
TSAV_SUSPENDED_RIP | КРИТИЧЕСКИЙ | Rip приостановленного потока не совпадает с Win32StartAddress и указывает на подозрительный регион — обнаруживает подделку Win32StartAddress (EarlyBird / трюки APC) и перехват SetThreadContext |
TSAV_HOLLOWED_HOST | ВЫСОКИЙ | Адрес внутри выделения MEM_IMAGE, отсутствующего в списке модулей PEB (заполнение DLL / замещение модуля) |
TSAV_MODIFIED_HOST | ВЫСОКИЙ | Адрес внутри выделения MEM_IMAGE, которое конвейер L1–L5 уже отметил как MODIFIED_CODE_*, MISSING_PEB, PRIVATE_RWX, DISK_MEM_DIFF, или HOOK_PROLOGUE |
TSAV_STAGED_PRIVATE_RW | ВЫСОКИЙ | MEM_PRIVATE + PAGE_READWRITE — подготовка шелл-кода до VirtualProtect |
TSAV_MAPPED_NONPE | СРЕДНИЙ | MEM_MAPPED (секция, подкреплённая файлом подкачки) без PE-заголовка — sRDI / рефлективный загрузчик страничного файла |
TSAV_SPOOF_TRAMPOLINE | СРЕДНИЙ | Адрес совпадает с трамплином из чёрного списка (LoadLibraryA/W/ExA/W, WinExec, CreateProcessA/W, VirtualAlloc[Ex], RtlExitUserThread, RtlExitUserProcess, NtTerminateProcess, ShellExecuteA/W) |
Что делает это сильнее, чем базовая проверка "находится ли start_address в каком-либо модуле":
VirtualQueryEx — каждый адрес запрашивается на предмет Type / Protect / AllocationBase за один O(1) вызов вместо линейного сканирования списка модулейTSAV_MODIFIED_HOSTWin32StartAddress доступен для записи из процесса через NtSetInformationThread и является подделываемым полем; живой Rip приостановленного потока — это то, что загрузчик не может легко переписать. Мы сравниваем их и отмечаем любое расхождение, которое указывает на подозрительный регионWow64GetThreadContext и читает Eip для 32-битных потоков внутри 64-битного процессаQUERY_INFORMATION | GET_CONTEXT → QUERY_INFORMATION → QUERY_LIMITED_INFORMATION для каждого потока, так что сценарии с частичным доступом всё ещё дают полезные классификацииРазрешение API во время выполнения — это техника, часто используемая вредоносным ПО. Механизм обнаружения Aether выявляет это поведение, сканируя кучу на наличие валидных адресов модулей и указателей, и коррелируя результаты с критериями фильтрации, описанными ниже:
Каждый фильтр убивает конкретный класс ЛП, наблюдаемый в реальной телеметрии: