- Баллы
- 173
Avanguard
The Win32 Anti-Intrusion Library
The Win32 Anti-Intrusion Library
Из-за отсутствия времени на коммерческую поддержку и доработки, выкладываю проект в открытый доступ. Продолжение проект получит в виде переписанного с нуля (и, скорей всего, приватного) Avanguard 2.0 с учётом всех недостатков существующей архитектуры.
Итак, Avanguard - защита от всех видов нативных инжектов для Windows с биндингами для всех популярных языков: C++, Java, C# и Delphi. Поддерживает любые программы (не обязательно Minecraft). Есть возможность подключить защиту без модификации исходного кода программ.
Возможности:
1. Статический криптор кода
2. Множество антиотладочных трюков (WinAPI, NativeAPI, трюки с SEH и ассемблером)
3. Библиотека для анализа PE-файлов
4. Анализатор памяти и поиск чужой памяти в нашем адресном пространстве
5. Анализатор стека вызовов и поиск посторонних фреймов в стеке
6. Защита от инжектов через CreateRemoteThread, AppInit_DLLs, оконные хуки, от ручного маппинга памяти, угона контекстов через NtSetContextThread/NtContinue, от инжекта через доставку APC
7. Защита памяти (ремаппинг исполняемой памяти с ReadOnly-правами, поддержка ядерных каллбэков)
8. Защита от сплайсинга и патча IAT (проверка исполняемых секций и таблицы импорта)
9. Анти-макросы (фильтр виртуального ввода, могут потребоваться права администратора)
10. Функционал для поиска лишних загруженных драйверов (не включен по-умолчанию)
11. Каллбэки на создание новых потоков и загрузку новых библиотек
12. Закрытие хэндлов нашего процесса в чужих процессах (экспериментальный функционал, unstable) - поможет от редакторов памяти при наличии прав администратора
13. Поддержка самомодифицирующегося кода: приложение может ставить свой перехват, защита не станет считать это угрозой
14. Поддержка исполнения из TLS-каллбэков
15. Ограничение прав доступа к процессу через DACL'ы
16. API для получения HWID'ов: CPUID, Physical HDD Serial, парсинг SMBIOS (SystemInfo, BIOS Info, BaseboardInfo)
17. Поддержка проверок сертификатов и цифровых подписей загруженных библиотек
18. API для вызова функций защиты извне
19. Каллбэки на найденную угрозу с возможностью выбора, что делать дальше
Сборка:
Visual Studio Community 2017 (или Insider Preview)
Открыть Avanguard.sln -> Выбрать параметры сборки (Win32/x64 и Debug/Release) -> Ctrl+Shift+B
Готовые бинарники будут в соответствующих папках Debug/Release или x64/Debug и x64/Release.
Настроить функционал защиты, проверяемые библиотеки и поведение можно в файле "Avanguard/AvanguardDefence/AvnDefinitions.h"
Запуск:
Запустить защиту можно двумя разными способами: статическим и динамическим.
Статическая загрузка:
Библиотека загружается раньше всех через пропатченную таблицу импорта, автоматически запускается защита. Не требует изменения исходного кода. Рекомендуемый способ.
1. Скачать CFF Explorer
2. ПКМ по целевой программе (например, java.exe или javaw.exe), в которую хотим загрузить защиту
3. Open with CFF Explorer
4. Переходим в боковую вкладку Import Adder
5. Add -> Выбираем Avanguard.dll
6. В списке Exported functions выбираем Stub -> Import by name
7. Rebuild Import Table
8. Переходим в боковую вкладку Import Directory -> ПКМ по Avanguard.dll -> Move Up
9. Поднимаем его на самый верх, чтобы был первым в списке
10. Save (большая кнопка с дискетой наверху)
11. Закрываем CFF Explorer, кладём Avanguard.dll в папку с программой, готово
Динамическая загрузка:
Загрузка и запуск динамически в коде программы. В этом случае библиотека будет подгружена вашим кодом. Требует запуска через AvnApi.
Для C++, Java, C# и Delphi есть биндинги, позволяющие загружать библиотеку и запускать через AvnApi.
Биндинги расположены в папке "# Bindings", биндинг для C++ в заголовочнике "Avanguard/AvanguardDefence/AvnApi.h".
Пример для запуска из Java:
Java:
public static void main(String[] args) {
// Ставим уведомлялку о срабатываниях защиты:
AvnBind.avnRegisterThreatNotifier((int threatType) -> {
System.out.println("Threat " + AvnBind.ThreatType.getThreat(threatType).name());
return true;
});
// Запускаем защиту:
AvnBind.avnStartDefence();
// Эмулируем срабатывание (в каллбэк придёт уведомление):
AvnBind.avnEliminateThreat(AvnBind.ThreatType.UNKNOWN_APC_DESTINATION.getValue());
// Отключаем каллбэк и снова эмулируем срабатывание:
AvnBind.avnRegisterThreatNotifier(null);
AvnBind.avnEliminateThreat(AvnBind.ThreatType.UNKNOWN_APC_DESTINATION.getValue());
}
Пример для запуска из C++:
Код:
#include "AvnApi.h"
// Подгружаем dll в процесс и импортируем API:
HMODULE hAvn = GetModuleHandle(L"Avanguard.dll");
PAVN_API AvnApi = *(PAVN_API*)GetProcAddress(hAvn, "Stub");
// Запускаем защиту:
AvnApi->AvnStart();
// Используем AvnApi:
AvnApi->Lock();
BOOL IsModuleValid = AvnApi->AvnIsModuleValid(hAvn);
// ... Other AvnApi calls ...
AvnApi->Unlock();
Использование каллбэков:
Если установлен каллбэк на любом языке, то при каждом срабатывании защиты управление будет передаваться в каллбэк, и по результату, возвращённому из каллбэка, будет приниматься решение, убивать ли процесс. Каллбэк возвращает true/false.
true - продолжить исполнение, проигнорировав срабатывание
false - убить процесс
Если каллбэк не установлен, действие по-умолчанию - убить процесс при первом срабатывании защиты.
В некоторых случаях, когда возможно, защита не убивает процесс при сработке, а предотвращает угрозу (например, отменяет доставку APC или создание новых потоков).
Защита создаёт лог в рабочей папке программы в файле AvnLog.log.
Скачать: https://gitlab.com/HoShiMin/Avanguard
Последнее редактирование: