Avanguard: The Win32 Anti-Intrusion Library

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

Метки:
  1. HoShiMin

    HoShiMin Well-Known Member

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

    https://github.com/HoShiMin/Avanguard

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

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

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

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

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

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

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

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

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

    HoShiMin Well-Known Member

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

    UbIvItS Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

    HoShiMin Well-Known Member

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

    UbIvItS Well-Known Member

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

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

    HoShiMin Well-Known Member

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

    UbIvItS Well-Known Member

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

    Indy_ Well-Known Member

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

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

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

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

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

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

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

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

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

    UPD: 01.06.2019
    Sencl.7z
    Размер файла:8,8 КБ
    Удалил по письму гугла. Считают его вредоносным. Если что перезалейте под паролем в rar.
     
    Последнее редактирование модератором: 1 июн 2019
  18. HoShiMin

    HoShiMin Well-Known Member

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

    Indy_ Well-Known Member

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

    А зачем импорт нужен. Это хороший пример, ничего лишнего.
     
  20. Fail

    Fail Active Member

    Публикаций:
    0
    Регистрация:
    14 мар 2012
    Сообщения:
    503
    Ваше кунг-фу у меня не работает xD

    Mitigation Lockdown
    Timestamp 2019-03-18T20:38:05

    Platform 10.0.17763/x64 v775 06_8e
    PID 6384
    Feature 00170E30008001A6
    Application C:\Windows\explorer.exe
    Created 2019-03-13T16:45:44
    Modified 2019-03-13T16:45:44
    Description Проводник 10

    Filename C:\Users\Fail\Desktop\Sencl.exe
    Created By C:\Program Files\7-Zip\7zFM.exe

    Command line:
    "C:\Users\Fail\Desktop\Sencl.exe"


    Это нормально, часто пишу двигатели так.