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

Способы обхода эмуляции

Chococream

Старожил форума
Легенда
Регистрация
31.10.2009
Сообщения
347
Реакции
42
Всем прив.
Что-то на ДЛ совсем топов мало(.

Реальных способов антиэмуляции предостаточно, а именно:
1)Редкие команды(не известные эмулятору).
2)Привязка к системе, иначе использование возвращаемых значений из api.
3)Операции с сегментами.
4)Временная задержка(практически у всех ав эмуляторов стоит лимит в 40-60 секунд).
Ваши идеи ?
+
Подскажите на какие нюансы прежде всего стоит обращать внимание при написании эмуля(решил создать универсальный unpack`r).
+
Предлогаю в топе отписывать о проблемах(детект, эмуляция и т.п) с некоторыми ав(возможно общими силами нам удастся понять причины).
 
У них обработчики повешены для апи. А что там внутри не известно. Тоесть вм не знает что апи формирует стековые фреймы, используют локальные переменные и пр. После возврата из апи в стеке останется много инфы. Можно её поюзать.
 
После возврата из апи в стеке останется много инфы. Можно её поюзать
не всегда на самом деле. В некоторых апи эмулируются ECX, EDX и т.д. после вызова! Стек ниже (ниже по адресам) есп тоже. Не знаю правда, универсальная это эмуляция или ав затачивали ее под кокнретный криптор.
Кроме того, одни и те же апишки в разных виндах могут по-разному менять стек. А некоторые ав могут палить обращение в [esp-xxx]. Т.е. тут тоже много подводных камней.
 
У них обработчики повешены для апи. А что там внутри не известно. Тоесть вм не знает что апи формирует стековые фреймы, используют локальные переменные и пр. После возврата из апи в стеке останется много инфы. Можно её поюзать.
И единицы это дело эмулируют :)

не всегда на самом деле. В некоторых апи эмулируются ECX, EDX и т.д. после вызова! Стек ниже (ниже по адресам) есп тоже. Не знаю правда, универсальная это эмуляция или ав затачивали ее под кокнретный криптор.
Кроме того, одни и те же апишки в разных виндах могут по-разному менять стек. А некоторые ав могут палить обращение в [esp-xxx]. Т.е. тут тоже много подводных камней.

Вот к примеру:
Код:
    mov eax,dword ptr FS:[030h]    ; teb->peb
    mov eax,dword ptr [eax+0Ch]    ; peb->ldr
    mov eax,dword ptr [eax+0Ch]    ; ldr->InLoadOrderModuleList
    mov eax,dword ptr [eax+018h]  ; InLoadOrderModuleList->DllBase
    cmp eax,imagebase
    jnz detected

Можно ещё в апи писать - тоже не все ав проходят через этот трюк, способов на самом деле много :)
 
Кстати, кто-нибудь касперского реверсил ?

Я тут тесты провёл с временной задержкой:
Код:
Непакованный:
 MicroSoft Security Essentials(эмулятор)
 Kaspersky Antivirus 2011(эмулятор - HEUR:*.Generic)
 Dr.Web(по сигнатуре - обращение к fs)

Пакованный:
 MicroSoft Security Essentials(эмулятор)
 Kaspersky Antivirus 2011(эмулятор - HEUR:*.Generic)
 ESET NOD32(эмулятор - NewHeur_***)
 Dr.Web отвалился :)

Т.о по эффективности эмуляторов получается такой порядок антивирусов:
1)MicroSoft Security Essentials.
2)Kaspersky Antivirus 2011.
3)Dr.Web.
4)ESET NOD32.
 
Для получения базы kernel32 юзаю чтение peb, потом как полагается нахожу нужные апи, затем в цикле их вызываю => временная задержка.

На чистом асме в r3 не напишешь эффективный цикл, чтобы не грузил цп, поэтому совмещаю с api.
 
апи - зло
если посмотреть лог эмуляции кода
Код:
@@:
  call api_1
  call api_2
  call api_3
loop @B
то увидим такое:
Код:
  call api_1
  call api_2
  call api_3
  call api_1
  call api_2
  call api_3
  call api_1
  call api_2
  call api_3
  call api_1
  call api_2
  call api_3
  ...
это гарантированый детект. Такое можно применять только, когда параноики уже остановлены. Т.е. до такого цикла не должны дойти нод, касперский, вба32, иначе такой порядок апи автоматом даст детект.

Добавлено в [time]1314792783[/time]
Кстати, кто-нибудь касперского реверсил ?
Дык вроде как сорцы есть. Зачем реверсить?
 
это гарантированый детект. Такое можно применять только, когда параноики уже остановлены. Т.е. до такого цикла не должны дойти нод, касперский, вба32, иначе такой порядок апи автоматом даст детект.
У меня апи вызываются не тупо подряд, а в перемешку с асм-командами, также между ними происходят паузы.
При этом имеется шаблон с отпарсенными безопасными api(я логировал работу разных программ).

Дык вроде как сорцы есть. Зачем реверсить?
Сорцы - старьё, сам смотрел-то ?)

Т.е. до такого цикла не должны дойти нод, касперский, вба32
Какой ещё vba ?))
Там эмулятор слабенький, в основном юзается сигнатурный детект.
Я лично не реверсил, но на vt тещу сэмплы частенько.
 
У меня апи вызываются не тупо подряд, а в перемешку с асм-командами, также между ними происходят паузы.
При этом имеется шаблон с отпарсенными безопасными api(я логировал работу разных программ).
да пофиг, как они там у тебя вызываются :) Ты хоть ни одной апи не вызывай, хоть стандартный пролог - это детект. Этот набор и последовательность апи будут характерны только для тебя и ни для кого иначе. Учитывается так же количество, порядок и сами апи. Ну и + параметры ре: размеры и рва секций, значения таблицы директорий и т.д. Ты что, с нодом никогда не сталкивался? Чем меньше апи, тем лучше. Все апи, которые есть, должны быть мусорными и легко меняться каждый раз. Если они у тебя генерируются в случайном порядке, то ты только себе геморой создаешь - детектить от этого хуже не станут, а вот чистить заморешься.
Сорцы - старьё, сам смотрел-то ?)
если честно, не смотрел. В конфе кто-то сказал, что полноценные, хоть и старые. Я и поверил. Не думаю, что там движок в корне переписали за три года.
Какой ещё vba ?))
Там эмулятор слабенький, в основном юзается сигнатурный детект.
vba32 - неплохой эмулятор. Даст фору любому симантеку и маккофе вместе взятым. Среди прочего умеет детектировать тупо по порядку апи.
Всёже можно привести скрин среды эмулятора, или вы тока чисто гипотетически в данной теме разбираетесь ?
ув. бро инде, в теме я как раз разбираюсь именно практически, а не теоретически. Скажите, бро инде, сколько лет вы уже чистите софт от ав? А угадать место детекта по одному только названию можете? Не рассказывайте мне, по чем палят ав, а я не буду рассказывать, как правильно писать зиродеи.
Безусловно у меня нет скринов среды эмулятора. Как и личных фотографий разрабочиков - это лишняя ненужная информация. Могу скинуть расшифрованные базы нода, если это так интересно. Я просто знаю, что нод палит только по апи и структуре файла. Достаточно убрать/добавить 1 длл в импорт или добавить/убрать 1 апи из кода (или просто поменять 2 апи местами) - и нод замолкает. Реверсить для этого весь ав не обязательно.

Поэтому смело заявляю - апи зло. Вставлять апи нужно исключительно мусорные и бесполезные, чтобы легко и безболезненно можно было их заменить или переставить местами. А добавление любой, абсолютно любой группы апи в цикл - этот код просто кричит, чтобы его спалил нод или каспер тупо по порядку апи. Увы и ах, но это так.
 
трюк c gs работает только под x86, кажется...(

Я тут тесты провёл:
Код:
С антиэмулятором:
Dr.Web(палит по сигнатуре - обращение к fs)

Без антиэмулятора:
ESET NOD32(эмулятор - NewHeur_***)
MicroSoft Security Essentials(эмулятор)
Dr.Web(палит по сигнатуре - обращение к fs)
 
Обнуление Gs имеет место только в старших версиях системы(7). В младших версиях этот регистр планировщик не затрагивает, он корректируется только при трап-процессинге(функции конвертации T-фрейма в контекст или обратно). Посему решение не универсально и не юзабельно. Это годно только для детекта трейса.

Аналогично есть флаг в PDBR и сброс RPL при нулевом селекторе. Инде это юзал для измерения квантов в юзермоде.
 
©Indy, wasm.ru
Особенность следующая. Загрузка селектора индексирующего нулевой дескриптор не вызывает исключение. При не валидном селекторе планировщик при переключении процессора на новый поток сбрасывает регистр Gs. Поток будет крутиться в цикле без изменения Gs пока не кончится отведённый ему квант времени(на это может уйти несколько сотен тысяч итераций, что не более миллисекунды). Затем на следующем кванте Gs оказывается сброшен. При трассировке Gs всегда сбрасывается, поэтому при эмуляции или трассировке получит управление detect_.
Код:
    mov eax,11b  ;RPL_MASK
    xor edx,edx
    mov gs,ax
@@:
    mov dx,gs
    shr edx,1
    jc @b
    
    mov gs,ax
    mov ax,gs
    
    lea eax,[eax + edx + (offset DecryptEntry - 11b)]
    jmp eax
;    [...]

    jmp short detect_
    nop
DecryptEntry:
;    [...]

; Небольшая модификация.
mov ax,11b ;RPL_MASK
mov gs,ax
@@:
mov dx,gs
shr dx,1
jc @b
mov ax,gs ;gs=NULL
or ax,ax
jnz detect

Я тут тесты провёл:
Код:
С антиэмулятором:
-

Без антиэмулятора:
ESET NOD32(эмулятор - NewHeur_***)
MicroSoft Security Essentials(эмулятор)
Dr.Web(эмулятор)
 


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