
Инструмент для криминалистического анализа памяти 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 накладывает пять фильтров поверх сырого сигнала рабочего набора, чтобы вывод требовал нескольких совпадающих индикаторов, прежде чем будет сообщено с фильтрацией ЛП:
Другие структурные проверки:
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 RAXAether проверяет потоки с более строгой классификацией и перекрёстной корреляцией с результатами L1–L5. Для каждого созданного потока в целевом процессе Aether читает его Win32StartAddress через NtQueryInformationThread и, когда разрешает доступ, также живой Rip / Eip через GetThreadContext / Wow64GetThreadContext.
Каждый адрес затем оценивается по следующей таблице. Для получения дополнительной информации читайте блогпост:
Что делает это сильнее, чем базовая проверка "находится ли start_address в каком-либо модуле":
VirtualQueryEx — каждый адрес запрашивается на предмет Type / Protect / AllocationBase за один O(1) вызов вместо линейного сканирования списка модулейTSAV_MODIFIED_HOSTWin32StartAddress доступен для записи из процесса через NtSetInformationThread и является подделываемым полем; живой Rip приостановленного потока — это то, что загрузчик не может легко переписать. Мы сравниваем их и отмечаем любое расхождение, которое указывает на подозрительный регионWow64GetThreadContext и читает Eip для 32-битных потоков внутри 64-битного процессаРазрешение API во время выполнения — это техника, часто используемая вредоносным ПО. Механизм обнаружения Aether выявляет это поведение, сканируя кучу на наличие валидных адресов модулей и указателей, и коррелируя результаты с критериями фильтрации, описанными ниже:
Каждый фильтр убивает конкретный класс ЛП, наблюдаемый в реальной телеметрии:
Aether поддерживает обнаружение паттернов XOR на уровне заглушек (пока) и использует алгоритм энтропии Шеннона для проверки случайности байтовых значений в области памяти; он помечает всё, что выше порога. Для борьбы с большим количеством ЛП Aether использует несколько индикаторов.
GetExtendedTcpTable для целевого PIDMODIFIED_CODE_* содержит private_pages и region_pages, так что при триаже есть фактические числаAether.exe --scan --pid <PID> [ОПЦИИ]
Aether.exe --scan --lookup "ProcessName.exe"
Aether.exe --hunt <PID> SLEEP_MS PERIOD
Aether.exe --scan-all [ОПЦИИ]
git clone https://github.com/0xsp-SRD/aether
cd aether
# Отладочная сборка (проверки безопасности включены)
zig build
# Релизная сборка (меньший, более быстрый бинарник)
zig build -Doptimize=ReleaseSafe
# или
zig build -Doptimize=ReleaseFast
Скомпилированный исполняемый файл находится в zig-out/bin/Aether.exe.
Скопируйте zig-out/bin/Aether.exe и каталог rules/ на целевой компьютер с Windows, если вы хотите выполнить дополнительное сканирование сигнатур. Если целевой процесс требует прав администратора, вам нужно запускать Aether.exe с правами администратора.
Win32StartAddress на уже работающем потоке может быть обнаружена только если поток случайно находится в ожидании при зондировании (то же ограничение, что и у Moneta)Aether Community лицензирован по GNU GPL v3.0. Коммерческие лицензии доступны только от автора для проприетарного или коммерческого использования.
| Слой | Фильтр | Назначение |
|---|
| 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 реального изменения |
49 BB ?? ?? ?? ?? ?? ?? ?? ?? 41 FF E3 — стиль Detours MOV R11, imm64 ; JMP R11Cor_Private_IPCBlock_v4_<PID> и v2 Cor_Private_IPCBlock_<PID> (устаревший .NET 2/3 / mscorwks), чтобы шумные пулы приложений, работающие на старых средах выполнения, не были ошибочно классифицированы| Вердикт | Серьёзность | Условие |
|---|
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) |
QUERY_INFORMATION | GET_CONTEXTQUERY_INFORMATIONQUERY_LIMITED_INFORMATION| Фильтр | Правило | Класс ЛП, который он удаляет |
|---|
| F1 | count >= 5 | случайные данные в форме указателя, NULL, HMODULES |
| F2 | отклонять прогоны, указывающие только в хост-EXE | vtables классов приложения (C++) |
| F3 | distinct_modules >= 2 | vtables одно-DLL фреймворков (Qt, MFC, wxWidgets) |
| F4 | capability_modules >= 2 | vtables браузера / CRT, которые затрагивают одну OS DLL (например, iertutil + ucrtbase + shlwapi) |
| F5 (L10) | >= 80% проверяемых указателей попадают на экспортируемые RVA | диспетчерские таблицы Winsock LSP, массивы обратных вызовов плагинов, vtables, указывающие на внутренние (неэкспортированные) методы |
| Флаг | Описание |
|---|
--pid, -p <PID> | ID целевого процесса для сканирования |
--lookup, -l <имя> | Найти все PID, соответствующие имени процесса |
--json, -j | Вывод результатов в JSON (для интеграции с SIEM) |
--verbose, -v | Показать детали сканирования по регионам |
--scan-all, -a | Сканировать все процессы |
--hunt, -b <PID> [мс] [попадания] | Мониторинг соединений — опрос каждые мс (по умолчанию 2000), отмечать конечные точки с ≥ попаданий вхождений |
--networking | Режим мониторинга сети |
--rules, -r <кат> | Каталог правил (по умолчанию: rules/) |
--config, -c <файл> | Одиночный файл правил (устаревший формат) |
--dump, `` | Сброс указанной области памяти с произвольным размером |
--read, `` | Чтение содержимого области памяти в реальном времени на терминале |
--help, -h | Показать справку |