Avanguard: The Win32 Anti-Intrusion Library

Тема в разделе "WASM.PROJECTS", создана пользователем HoShiMin, 17 мар 2019.

Метки:
  1. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Пишу библиотеку для антиинжектов.
    Полтора года назад уже писал такую, с тем же функционалом, пока она не разрослась до неимоверных масштабов, когда стало очень сложно её поддерживать. Решил переписать с нуля - и вот - потихоньку переписываю функционал старой версии.

    https://github.com/HoShiMin/Avanguard

    Открытый вопрос - как отличать валидные инжекты (от драйверов, аверов, стримилок) от всех остальных. Если у кого-то есть идеи - буду рад услышать.
     
    Последнее редактирование: 17 мар 2019
    hiddy нравится это.
  2. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    467
    Очевидно, что общего решения нету. Единственный вариант - это белые списки и общие правила, что отсечь уж совсем неадекватов.
     
  3. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Блэклисты\вайтлисты - самое очевидное, но очень неудобное решение.
    Пока думаю над какой-нибудь не очень сложной нейронкой, на вход которой подавать признаки дллки (метод инжекта, импорты\экспорты, инфу об издателе, подпись, возможно даже список перехватов, которые ведут в эту дллку), на выходе - результат. И обучить её на заведомо валидных инжектах от стримилок и драйверов. Может, что-то и получится...
     
  4. superakira

    superakira Active Member

    Публикаций:
    0
    Регистрация:
    2 июн 2008
    Сообщения:
    467
    Такая шняга есть прям сейчас у Malwarebytes. Выдает детекты machinelearning/anomalous.<some_id>

    Ты обучшь, может как-то оно и будет работать.. но одно дело на 10 длл а другое на данных от ав контор, те тут нужно бигдата, а не пачка длл с 1 машины. Просто у тебя будет магия и ты не будешь знать почему она у тебя происходит =) Но ты попробуй конечно.

    И да.. это все равно все обходится.
     
    UbIvItS нравится это.
  5. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    Посмотрел я вашу поделку, погань полная. Текст для компилера не имеющий смысла. Тоесть огромной толщины ничего.

    Инжект - ну и как ты словишь смену контекста ?

    Что бы такое провернуть вся память должна быть не исполняемой. А это в свою очередь требует динамической трансляции/эмуляции и соответствующий мод.

    Есть два типа инжектов - системный и обратный(OP). В первом случае это обычная передача управления, во втором случае это нарушение логики работы процесса.

    Данная задача штатным путём не решается, это уже обсуждали.

    Вариант защиты один - все потоки должны транслироваться на уровне инструкций. Если транслятору/эмулятору нужен вызов нэйтив, то он это должен сделать рекурсивно через трансляцию. В таком случае всё адресное пространство N/X(при этом R|W) и произвольная передача управления невозможна. Но это посадит профайл и не защитит от OP-инжекта. Этот вариант проработан.

    Во втором варианте(теория) нужно как то скрыть все EP. Это весьма сложная задача, даже не ясно возможно ли её решение в принципе.
     
  6. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Indy_, не учитываешь, что требуется не абсолютная защита, а достаточная. Обойти всегда обойдут, но если прикроем хотя бы основные паблик-инжекты - это уже здорово.
    Как задетектить смену контекста? Никак. Но поток же должен как-то вернуться обратно? Что в большинстве случаев будут делать? Дёргать NtContinue. Здесь мы и задетектим.
    Разумеется, это не спасёт, если тот же NtContinue заменят на самописную реализацию или вернут контекст обратно из другого процесса, но какую-то часть инжектов (я бы даже сказал, бОльшую) это отсечёт. А большего нам и не нужно, потому что, как ты и говоришь, придётся транслировать потоки, а это существенное падение производительности и, в общем-то, не нужно. И не оправдывает трудозатраты.
     
  7. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    А как ты узнаешь что какая то часть кода выполнилась вне контекста ?

    Один и тот же поток будет вызывать один и тот же код, как ты узнаешь разницу ?

    Блокировать такое можно только используя эмуляцию. Либо как то скрыть адреса(API EP).
     
  8. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Перехватываем NtContinue, смотрим трейс, и, если мы не выделяли память, из которой он вызван, или эта память не в известном нам модуле -> сторонний инжект
     
  9. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.353
    а что, если твои хуки сняли 7
     
  10. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    > если мы не выделяли память

    А каким образом вы узнали что выделение памяти - доверенное событие, а не в контексте инжектора ?
     
    UbIvItS нравится это.
  11. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    А я буду время от времени сверять исполняемые секции. А если совсем заморочиться, можно даже подсчитывать количество записей в страницу на тот случай, если хук быстро снимут, выполнят шелл и вернут обратно, чтобы я ничего не заметил.
    --- Сообщение объединено, 18 мар 2019 ---
    По тем же признакам: вызывают из неизвестной памяти. Ведь изначально шелл должен где-то располагаться. Выделяют память со стороны, меняют контекст на эту память, а дальше фильтры на NtAlloc/Protect/Continue/SetContextThread/etc ловят вызовы из этой памяти. Всё, что выделено не процессом (т.е., всё, что не прошло через фильтры) - автоматически подозрительное. Даже если процесс выделит память сам в себе из драйвера (DeviceIoControl -> драйвер вызывает ZwAlloc) - это уже будет недоверенная память, и процесс должен озаботиться, чтобы пометить этот регион как валидный (чуть попозже сделаю соответствующий API)
     
  12. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.353
    HoShiMin, проблема-то в том и заключается, чтоб НАДЁЖНО выставить хуки. а так либо ситуация скатывается в борьбу параллельных потоков и сопутствующий краш, либо ужо пропишут прицельное снятие всех твоих хуков.
     
  13. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Пока думаю, что у меня это получилось: в прошлой версии была проблема с фильтром памяти, время от времени наталкивался на дедлоки. Сейчас без проблем, подцепил к джаве, запускаю игру, падения FPS нет (а память там перевыделяется очень часто), ложных срабатываний на JIT нет, потоков много, все работают с памятью
    Всегда найдётся способ, но от паблик-инжектов будем закрыты
     
  14. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    Вот тебе видео пример записал, что бы ты понял принцип https://yadi.sk/i/Iybbjj1Bjyw3-Q

    Что я там делаю. DEP включен, я ставлю атрибут NX на несколько базовых модулей. Ничего не происходит - там нет исполнения. Апп работает под транслятором(визор), он выбирает(R) поток инструкций. Исполнение таким образом заблокировано, но апп продолжает работать. Далее я беру произвольную апи, которая вызывается гуем(в NX области) и ставлю туда останов - происходит останов в буфере транслятора при исполнении int3 после её чтения.
     
  15. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Indy_, хорошо, допустим. Но! В данном случае, это простое окошко - лабораторные условия. Но как ведёт себя визор в более сложных приложениях? Например, с JIT'ом (джава, шарп), с приложениями, которые сами ставят перехваты. С графическими приложениями (например, игры). Более того, на видео WinXP. Но позвольте, мы ведь пишем не концепт, а в продакшн, где сплошной x64. И должно работать у всех, на любом приложении, в любых условиях, в окружении антивирусов и библиотек от драйверов. Насколько применимы визоры в таких условиях?
     
  16. UbIvItS

    UbIvItS Well-Known Member

    Публикаций:
    0
    Регистрация:
    5 янв 2007
    Сообщения:
    4.353
    а опиши как ты тестировал.
     
  17. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    Транслятор лишь раскодирует поток инструкций, он ничего не вызывает вне себя. Я давно в процессе отладки использовал фотошоп как тяжёлое апп. Но это предназначено не для высокого профайла, а для разбора протекторов, аверов, короче это инструмент для немного иных задач, но принципы это не меняет. А есчо это всё можно оптимизировать хорошо на алгоритмическом уровне.
     
  18. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Собрал дллку, CFF Explorer'ом подцепил к java.exe в импорты, запустил игру.
    Дллка грузится раньше всех зависимостей, ставит перехваты, и больше от нас ничего не требуется.
    Ну, в таком случае, имеет место быть - высокий профайл нужен только в играх, для остальных приложений подойдёт. Но всё равно не уверен, что такие техники не вызовут сайд-эффектов в широком продакшне, когда у пользователя может стоять по 5 конфликтующих антивирусов со своими перехватами. Так что... Пока рассматриваю визоры как интересный концепт, но чтобы реализовать его на хорошем уровне, потребуется очень много усилий не одного человека.
     
  19. Indy_

    Indy_ Well-Known Member

    Публикаций:
    4
    Регистрация:
    29 апр 2011
    Сообщения:
    2.354
    HoShiMin,

    Ну иначе защиту никак не построить вашего типа, разве что права доступа ограничить. В любом ином случае это не защита.
    --- Сообщение объединено, 18 мар 2019 ---
    HoShiMin,

    > конфликтующих антивирусов со своими перехватами.

    Та же техника, но в виде реализации С-анклава. Это как дополнение темы.

    Есть некоторая область памяти, содержимое её значения не имеет. Так же её может не быть вовсе(N/A). При выборке из данной области данные выбираются из другой области(они могут раскодироваться порциями в буфера и тп). Это так же реализуется на уровне транслятора. В данном примере вызывается дебаг принт апи со строкой на нулевой буфер, а выводит ваш ник для примера - данных не существует в статике. Поэтому можно блокировать в целом не только исполнение, но и содержимое памяти убрать вовсе, сделав память N/A.

    Кстате техника очень приятная аверам, мало того что она делает невозможным скан памяти, эмуляция, так есчо и сигнатуры убирает, деля код на инструкции, которые никак между собой не связаны :sarcastic:
     

    Вложения:

    • Sencl.7z
      Размер файла:
      8,8 КБ
      Просмотров:
      24
  20. HoShiMin

    HoShiMin Active Member

    Публикаций:
    0
    Регистрация:
    17 дек 2016
    Сообщения:
    244
    Адрес:
    Россия, Нижний Новгород
    Indy_, впервые вижу эксешник с ОДНИМ импортом, и ида ругается на половину функций. Прикольно, тоже так хочу)