• XSS.stack #1 – первый литературный журнал от юзеров форума

Эмулятор АВ

arsarsov

(L2) cache
Пользователь
Регистрация
07.08.2022
Сообщения
460
Реакции
272
Сейчас эмуляторы АВ корректно эмулируют большинство вызовов АПИ и антиэмуляция на основе возвращаемых значений и кодов ошибок уже не работает в большинстве случаев, разве что с какими-то экзотическими функциями, но что если
У вас должно быть более 500 сообщений для просмотра скрытого контента.
установить перехватчик и специально вернуть нестандартное значение, например функция CreateFile, эмулировать ее полностью АВ не будет, так как там много кода и она в итоге через syscall\sysenter уходит в ядро, поэтому АВ в таком случае анализирует параметры и пытается предсказать какое значение вернет функция, это будет либо INVALID_HANDLE_VALUE либо корректный хендл, (так же еще вспомним антиэмули на вызове GetLastError), так вот если перехватить либо CreateFile и вернуть вместо нормального хендла какой-то хеш посчитанный в динамике от больших данных, либо сделать то же самое в функции GetLastError (а тут возможно и не сработает, она скорее всего сама хукается на стороне АВ, но если хук стоит в ядре то для нас даже лучше, так как ядро отдаст один результат, а в юзермоде мы получим наш хеш), то возможно мы объебем эмулятор таким образом, кто что думает ?
 
Хайд поставил на тот случай, если это случайным образом окажется рабочим методом(пока не было времени проверить), что бы не копипастили новореги, а те у кого сообщений хватает пусть пользуются
Идейка пришедшая спонтанно
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
кто что думает ?
Если аверы "умеют эмулировать большинство апи", то почему ты думаешь, что они не сумеют сэмулировать твой перехват? Память куда проще эмулировать, чем все возможные апи. По сабжу: в системе есть 100500 COM-объектов, что-то мне подсказывает, что никто не будет эмулировать все из них. Условно, добавь какой-то variant в Scripting.Dictionary и попробуй оттуда достать в эмуляторе, вернется он оттуда таким, каким ты его положил или нет.

Да и вообще, я не был бы так уверен, что большинство апи эмулируются, а вот в том, что авер при эмуляции может проходить все возможные ветвления (включая те, что в эмуляторе выдают falsy значения предиката) - это уже давно известно. Для обхода эмулятора ветвления недостаточно, можно значения полученные заведомо вне эмулятора использовать в качестве ключей шифрования для расшифровки вредоносного кода: в эмуляторе просто вредоносный код не расшифруется и эмулятор не сможет ничего с этим поделать.
 
Для обхода эмулятора ветвления недостаточно
ну так это и предполагалось, использовать данные полученные антиэмулем, в частности хеш который я описал, для расшифровки каких-либо важных данных без которых продолжение работы невозможно
 
Если аверы "умеют эмулировать большинство апи", то почему ты думаешь, что они не сумеют сэмулировать твой перехват?
потому что они именно эмулируют, а не трассируют всю апишку,
У вас должно быть более 500 сообщений для просмотра скрытого контента.
если перехват поставить перед ret, а не в начале, то это сведет к минимуму обнаружение перехвата и заставит сделать эмуляцию штатно, ты подумай насколько долго было бы эмулировать(читай трассировать\симулировать) все заходы внутрь системных библиотек, эмуляторы пробегаются только по юзерскому коду, эмуляция в ав подразумевает именно "симуляцию" процесса, все полностью виртуально, что бы не навредить системе, а это занимает достаточно большое количество ресурсов, именно поэтому эмуляция ограничена как по времени так и ресурсам, самые банальные тайминг атаки и выделения кусков по 500000000 байт работают до сих пор, именно поэтому мне в голову стукнула такая идея, но это надо проверить. Если весь код именно трассируется, тогда конечно отработает перехват и что под эмулем, что без него результат будет один и тот же, вот только если бы эмуляция работала как реальный процессор сейчас бы не было антиэмулей, я все же полагаю что трассировки там никакой нет, максимум перехваты стоят классические в прологе функции, которые логгируют параметры и далее в ход идет "симуляция" с этими параметрами
 
Пожалуйста, обратите внимание, что пользователь заблокирован
потому что они именно эмулируют, а не трассируют всю апишку
Так а что помешает им именно трассировать апишку, зная, что эта самая одна конкретная апишка была пропатчена при эмуляции твоего кода?

ты подумай насколько долго было бы эмулировать(читай трассировать\симулировать) все заходы внутрь системных библиотек
Ты подумай, насколько долго было бы делать хендлеры внутри эмулятора для каждой апишки каждой системной библиотеки.

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

Вообще, на эту тему можно теоретизировать до бесконечности, для какого-то авера твоя идея будет эффективна, для какого-то нет. Мое мнение, что универсальным этот обход эмулятора не будет, если ты об этом спрашивал. Подергать какие-то COM-объекты видится более универсальным решением, так как их полно, и эмулировать все из них не представляется возможным (хотя эмуляция всех возможных апишек даже из десятка типичных длл мне тоже не представляется возможным).

По сабжу: еще был проект AVLeak, в котором за счет срабатываний авера доставались константные значения изнутри эмулятора, например, имя пользователя или имя компьютера. Эти значения можно получить и добавить в черный список в своем уютненьком софте. Но это частные решения, а не универсальные.
 
Последнее редактирование:
Ты подумай, насколько долго было бы делать хендлеры внутри эмулятора для каждой апишки каждой системной библиотеки.
ну так поэтому именно они и не заходят внутрь, а просто ставят перехват, на входе анализируют входные значения, потом если все ок - вызывают нормальную апиху и снова смотрят что она уже вернула, после этого отдают управление снова в юзеркод, ну точнее продолжают его эмулировать
Ты же знаешь наверное как эмулятор работает, реализации разные везде, но плюс минус технологии похожи, грубо - запускается процесс, останавливается на точке входа, контекст процесса записывается, так же как и вся его память, и далее контекст процесса передается в виртуальный процессор, который его трассирует, но трассировка идет не реального кода, а виртуально спроецированного, грубо говоря по одной инструкцией с ретрансляцией адресов, в вызовы системных библиотек он не заходит, а делает реальные вызовы, перед каждым вызовом контекст до которого дошел эмулятор переносится в реальный процесс, так же переносятся все изменения в памяти которые успели произойти до этого момента, делается вызов апишки, после нее снова делается снимок контекста и памяти процесса и передается в эмуляцию
Именно поэтому тайминг атаки и атаки на ресурсы эмулятора работают до сих пор, потому что это все затратно по времени\памяти и эмуляция не может идти вечно, там трассируется несколько сотен тысяч инструкций и если все нормально, то код начинает выполняться самостоятельно без эмуляции
Это одна из реализаций, не помню точно, но вроде у НОДа
 
Последнее редактирование:
так вот Касперский не палил сам факт инжекта, но килял тестовый файл после факта непотребства, при этом убивая поток в легитимном процессе и откатывая изменения в реестре или на файловой системе
а я тебе скажу как это работало, драйвер каспера следит за всеми создаваемыми потоками, не важно вообще в каком они процессе, после создания потока, особенно если это был какой-то заезженный способ инжекта, он потрассировал\проэмулировал твой шелл который ты заинжектил и спалил что поток творит что-то неладное, возможно он не сразу понял, что поток делает что-то злонамеренное, но уже после его отработки у него осталась цепочка - инжект-> что-то там в шелле -> изменения в реестре и на диске из данного потока, изменения ему показались нехорошими вот он и откатил их
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Была такая идея, перехват функций через VEH , т.е. допустим внутри какого-нибудь ExitProcess мы меняем атрибуты памяти, чтобы вызвало эксепшн, и далее передается нашему обработчику (а Авер думает типа, раз exitprocess, то все). Какие-то эмуляторы вроде сбивало, тестил такое году так в 19-20, хз уже не помню.
 
Была такая идея, перехват функций через VEH , т.е. допустим внутри какого-нибудь ExitProcess мы меняем атрибуты памяти, чтобы вызвало эксепшн, и далее передается нашему обработчику (а Авер думает типа, раз exitprocess, то все). Какие-то эмуляторы вроде сбивало, тестил такое году так в 19-20, хз уже не помню.
Косяк в том, что можно поменять аттрибуты только сразу на всей странице, а это 4096 байт, таким образом ты будешь "перехватывать" как нужную функцию, так и все которые под ней расположены в пределах 4096 байт
Лучше тогда уже хардварные бряки ставить точечно
 
Avast (и не только), например ставит заглушку на OutputDebugString, которую можно поймать так:
C:
PTEB pTEB = NtCurrentTeb();
pTEB->LastErrorValue = dwRandomCode;
// Здесь может быть и другая функция, при нормальном выполнении которой ошибка будет сброшена
//Кроме того можно вызвать какую либо функцию с неявно неправильными параметрами и с заранее известной ошибкой на выходе
OutputDebugString(_TEXT("BlaBla"));
if(pTEB->LastErrorValue == dwRandomCode) {
printf("Found AVEmulation or Debuger!");
return;
}
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх