Что такое хуки вирус

Обновлено: 22.04.2024

Подцепил с флэшки какой-то вирус, называется hook.Так он тварь залез в камп и цепляется на все флэшки. Не хочет удаляться и главное антивирусы его не видят, даже nod!Чё делать?

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

ВЫБИРАЙ на свой ВКУС :)

not-a-virus:Monitor.Win32.KeyPressHooker
Динамическая библиотека, перехватывающая системные функции. Написана на Microsoft Visual C++, ничем не упакована. Размер файла — 28160 байт. Программа не содержит в себе принципиально вредных функций, но может быть использована в злонамеренных целях. Функционал библиотеки представляет собой.

Trojan-Downloader.Win32.ConHook.b
Программа загружает из сети Internet и устанавливает на компьютер пользователя другие троянские программы. Ее программный файл — req.dll, имеет размер 17408 байт, ничем не упакован, все строки в нем зашифрованы. Регистрирует себя как BHO объект.

Trojan-PSW.Win32.Hooker
Эта программа относится к семейству "троянских коней", ворующих системные пароли. При запуске троянец инсталлирует себя в систему: копирует в главный каталог Windows или в системный каталог Windows и регистрирует в системном реестре в секции авто-запуска. Например: Имя файла-троянца.

Virus.DOS.NoHook.48
Очень опасные резидентные вирусы. Копируют себя в таблицу векторов прерываний, перехватывают INT 85h и записывают в ядро DOS команду вызова INT 85h. Затем записываются поверх запускаемых файлов. Некторые версии вируса содержат строку: it's not necessary 2 hook int 21h!
Ставь каспера 7.0


Реальная задача

Совсем чуть-чуть теории


Суть хукинга — заставить программу поверить, что нужная ей функция находится в другом месте.


Пару слов о Microsoft Detours

Закрыта
Стоит приличных денег для коммерческого использования или х64-архитектуры

В целом, я бы посоветовал начинать изучение хуков именно с Detours — если это будет всего лишь вашим разовым развлечением, то этого вполне хватит, у вас быстро всё получится и вам понравится. Если же хуки понадобятся в серьёзном проекте — вы легко переключитесь на бесплатные и открытые (но чуть более сложные) библиотеки типа mhook, купите Detours или напишете свой велосипед (для последних двух решений нужны весьма веские причины).
О том где взять и как собрать Detours я писал вот тут.

Хитрый план

  1. Понять, на какую функцию ставить хук.
  2. Сделать свою библиотеку с функцией, которая будет заменять исходную и делать нужные нам вещи.
  3. Установить хук (загрузить библиотеку в память нужного процесса и переставить указатель на нужную нам функцию).
  4. PROFIT!

Куда ставить хук

  1. Вместо SendMessage может использоваться PostMessage или что-то еще
  2. SendMessage может быть вообще не функцией, а макросом, ссылающимся на другую функцию (в дальнейшем мы увидим, что так оно и есть)
  3. Firefox, как некоторые кроссплатформенные приложения, может вообще не использовать функции Windows для рисования стандартных элементов окна, используя вместо этого какие-то собственные кросплатформенные элементы GUI (к счастью, это не так — но вдруг!)

Переходим в Firefox, открываем Хабр, дожидаемся изменения заголовка на нужный и возвращаемся в Api Monitor чтобы остановить мониторинг. Скорее всего, вы будете удивлены количеством вызванных функций — их могут быть сотни тысяч буквально за несколько секунд мониторинга. А мы ведь еще и следим далеко не за всем. Да-да, это всё реально происходит внутри безобидного открытия всего одного сайта в браузере! А вы еще жалуетесь, что эта пара секунд — слишком долго. :)


Делаем свою библиотеку


5. Компилируем проект: Build -> Build Solution. На выходе получаем длл-ку (пусть будет называться hooktest.dll)

Давайте разберем исходник. В начале мы подключаем заголовочные файлы Windows (чтобы пользоваться функцией SendMessageW) и Detours (чтобы иметь возможность ставить\снимать хуки).
В сложной на первый взгляд строке №3 мы всего лишь сохраняем реальный указатель на функцию SendMessageW в переменную TrueSendMessageW. Это нам понадобиться для двух целей:

Функция DllMain вызывается операционной системой в определенных случаях — например, в моменты аттача\детача библиотеки к процессу. Тут тоже всё просто. В момент аттача нам нужно установить хуки, в момент детача — снять. Библиотека Detour требует делать это транзакциями, и в этом есть смысл — представьте себе что будет, если сразу несколько желающих захотят поставить хуки в один процесс. Самое важное в этом коде это строка

Устанавливаем хук

Microsoft Detours предлагает разные варианты установки хуков — мы воспользуемся самым простым. В комплекте примеров, которые идут с библиотекой, есть программа withdll.exe — она принимает в качестве параметров путь к приложению и библиотеку, которую нужно подгрузить в память этого приложения после его запуска. Запускаем всё это как-то вот так:

Хочешь стать Черным Властелином своего компьютера? Хочешь знать все тайны разработчиков малвари и антивирусов? Читай статью, медитируй, постигай азы дзена, и да снизойдет на тебя прозрение (всем спокойно, познание Дао и прободение Шамбалы в результате прочтения этой статьи редакцией не гарантируется — прим. ред)!

Что такое хук (hook — крючок, англ.)? Это механизм, позволяющий отследить некое событие в операционной системе. Было оно разработано дяденьками из Microsoft с самыми благими намерениями — позволить программисту более эффективно решать свои задачи путем установки контроля над событиями клавиатуры, мыши и многого другого. Реализовался он при помощи всем известных функций: SetWindowsHook(Ex), UnhookWindowsHook(Ex) и CallNextHook(Ex).

Со временем благородное понятие хука извратилось, причиной чего стали действия вирусописателей и малварщиков. Первые вирусы были, как бы это сказать… наивными, наверное. Они представляли собой отдельный exe-файл, напрямую вызывающий нужные функции системы. Шло время и антивирусы, которые появились чуть позже и вдруг стали коммерческими, довольно быстро научились ловить вирусы по сигнатурам путем простого сканирования оперативной памяти или дискового пространства.

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

Что имеем?

Проще всего установить хук в системе путем создания так называемой прокси-функции. Иначе говоря, тебе надо определиться, какую функцию ты перехватываешь, и найти адрес ее вызова. Для этого обычно используется функция GetProcAddress примерно вот так: GetProcAddress(GetModuleHandle("ntdll.dll"), "CsrNewThread").

Однако просвещенные знают, что она практически всегда перехватывается аверами, и для нахождения адреса функции используют парсинг таблицы импорта той или иной библиотеки, обычно ntdll.dll, kernel32.dll (kernelbase.dll в Windows7) или advapi32.dll.

Далее тебе нужно создать свою прокси-функцию, точь-в-точь повторяющую вызываемую примерно вот таким образом:

int MyNewFunction(void *param1,
int param2, bool param3)
return OriginalFunction(param1,
param2, param3);
>

После этого следует перезаписать адрес вызова OriginalFunction на свой — то есть, на MyNewFunction.

Итак, едем дальше. Как я уже говорил, использование хука в виде прокси-функции хоть и удобная вещь, но, во-первых, палевная, а во-вторых, подходит лишь для начинающих. То есть не для тебя :). Самый распространенный вид хука — это сплайсинг. Уверен, ты не раз слышал это слово. В нашем случае это запись на начало функции пятибайтовой последовательности, которая представляет собой команду jmp по адресу обработчика перехвата. Здесь первый байт — опкод jmp, оставшиеся четыре байта — адрес твоей функции.

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

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

IAT, EAT и другие звери

Возникает вопрос: а на что и, самое главное, где можно ставить свои хуки? Первое, что приходит на ум — конечно же, поставить перехват на Import Address Table (IAT). Когда приложение использует функцию из библиотеки, приложение должно импортировать адрес функции. Каждая DLL, используемая приложением, описана в структуре, называемой IMAGE_IMPORT_DESCRIPTOR. Эта структура содержит имя DLL, чьи функции импортированы приложе нием, и два указателя на два массива структур IMAGE_IMPORT_BY_ NAME. Структура IMAGE_IMPORT_BY_NAME содержит имена импортированных функций, используемых приложением.

Когда операционная система загружает приложение в память, читается структура IMAGE_IMPORT_DESCRIPTOR и каждая требуемая DLL загружается в память приложения.
Как только DLL отображена (mapped), операционная система располагает каждую импортированную функцию в памяти и записывает поверх одного из массивов IMAGE_IMPORT_BY_ NAME с исполнительным адресом функции.

STELTH-хуки: поймай меня, если сможешь

Как я уже писал выше, главный недостаток вышеуказанных методов перехвата — это вынужденная модификация памяти, что неизбежно ведет к ее детекту со стороны аверов. Есть ли выход? Как ни странно, есть. Даже два. Первый из них — это зарегистрировать свой обработчик исключений, затем добиться, чтобы он получил управление. Это можно сделать, например, потерев какой-либо участок памяти. Второй способ представляет собой несколько видоизмененный первый. То есть, ты, как и раньше, регистрируешь обработчик исключений, но для их генерирования ты используешь прием, известный среди дебаггеров. Как ты знаешь, дебагрегистры процессора используются для отладки приложений и доступны, как правило, из кернелмода. Однако их можно устанавливать и из юзермодных приложений путем использования функций GetThreadContext/ SetThreadContext. Используются дебаг-регистры для установки точек останова (Breakpoints) на доступе к участку памяти или исполнении.

Всего имеется восемь регистров, их назначение следующее:

  • DR0 - DR3 — Каждый из этих регистров содержит линейный адрес одной из четырех контрольных точек. Если подкачка страниц разрешена, то их значения транслируются в физические адреса по общему алгоритму;
  • DR4 - DR5 — Регистры зарезервированы и в процессоре i486 не используются;
  • DR6 — Отладочный регистр состояния. Он сообщает об условиях, выявленных во время генерирования отладочного исключения (номер 1). Биты регистра устанавливаются аппаратно, а сбрасываются программно;
  • DR7 — Регистр задает вид доступа к памяти, связанный с каждой контрольной точкой.

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

int SetDebugBreak(FARPROC address)
int status = -1;
HANDLE thSnap = CreateToolhelp32Snapshot(
TH32CS_SNAPTHREAD, NULL);
THREADENTRY32 te;
te.dwSize = sizeof(THREADENTRY32);
Thread32First(thSnap, &te);
do
if(te.th32OwnerProcessID != GetCurrentProcessId())
continue;
HANDLE hThread = OpenThread(
THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
CONTEXT ctx;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
GetThreadContext(hThread, &ctx);
if(!ctx.Dr 0)
ctx.Dr0 = MakePtr( ULONG, address, 0);
ctx.Dr7 |= 0x00000001;
status = 0;
>
else if(!ctx.Dr1)
ctx.Dr1 = MakePtr( ULONG, address, 0);
ctx.Dr7 |= 0x00000004;
status = 1;
>
else if(!ctx.Dr2)
ctx.Dr2 = MakePtr( ULONG, address, 0);
ctx.Dr7 |= 0x00000010;
status = 2;
>
else if(!ctx.Dr3)
ctx.Dr3 = MakePtr( ULONG, address, 0);
ctx.Dr7 |= 0x00000040;
status = 3;
>
else
status = -1;
ctx.ContextFlags = CONTEXT_DEBUG_REGISTERS;
SetThreadContext(hThread, &ctx);
CloseHandle(hThread);
>
while(Thread32Next(thSnap, &te));
return status;
>

Заключение

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


В октябре 2021 года к нам в Solar JSOC CERT поступил запрос: одна крупная технологическая компания попросила помочь в расследовании инцидента. В процессе работы мы обнаружили старую знакомую - вредоносную DLL TeamBot (aka TeamSpy, TVSPY, TeamViewerENT, TVRAT), которая загружалась легитимной утилитой TeamViewer. Это ВПО уже лет 10 фигурирует в отчетах как отечественных, так и зарубежных ИБ-компаний. Но за эти годы TeamBot научился кое-чему новому, о чем мы и расскажем в этом посте.

Вектор атаки

Итак, TeamBot в основном распространяется через фишинг (какая неожиданность!). В нашем кейсе жертвы получали вот такие письма:


Архив содержал текстовый файл "Код 0921.txt", имя которого является паролем для распаковки внутреннего архива с полезной нагрузкой.

Файл

Описание

Легитимный DLL-файл TeamViewer 5.0.7687.0, необходимый для его работы

Вредоносный DLL-файл TeamBot

TeamViewer Quick Support (TVQS) 5.0.7687.0

Легитимный cab-архив с файлами для установки vpn-адаптера TeamViewer

Далее запускался файл Uniprint.exe (далее – процесс TeamViewer) с аргументом f: UniPrint.exe f.

Вредоносная DLL, располагаемая рядом с Uniprint.exe, через технику DLL Hijacking загружалась процессом TeamViewer.

В статье Dr.Web, упомянутой выше, в составе BackDoor.RMS.180 для легитимной утилиты удаленного управления использовалось аналогичное имя – Uniprint.exe:

«Состав самораспаковывающегося дроппера:

libeay32.dll (f54a31a9211f4a7506fdecb5121e79e7cdc1022e), чистый;

ssleay32.dll (18ee67c1a9e7b9b82e69040f81b61db9155151ab), чистый;

UniPrint.exe (71262de7339ca2c50477f76fcb208f476711c802), подписан действительной подписью;

WinPrint.exe (3c8d1dd39b7814fdc0792721050f953290be96f8), подписан действительной подписью;

Анализ TV.dll

Вредоносная DLL – 32-разрядный файл, скомпилированный 31.08.2021 07:21:32 UTC. Он имеет идентичные оригинальной DLL метаданные и pdb-путь, но экспортируемые функции отличаются, а цифровая подпись отсутствует. Cравните:



Для сравнения в качестве оригинальной TV.dll была использована следующая:

Техники для усложнения анализа (anti-analysis)

1. Шифрование домена и пути сервера управления (далее – C2).

Для шифрования применяется операция NOT к каждому байту домена и пути C2. В некоторых образцах данные C2 представлены в незашифрованном виде, но после запуска шифруются. Зашифрованные домен и путь С2 чаще всего располагаются рядом и разделены несколькими 0x00-байтами:


2. Использование StrChr + wsprintf

С помощью WinAPI-функций StrChr выполняется поиск нужных подстрок, а wsprintf используется для формирования конечной строки.


3. Использование хешей API-вызовов при динамическом импорте

Псевдокод алгоритма хеширования:

api_hash = crc32("") ^ xor_key ,

где – имя API-вызова, например, LoadLibraryA ;

Кстати, аналогичным образом кодируются команды, получаемые от C2.

4. Получение строк по raw-смещению из указанного PE-файла

Строки берутся из легитимного файла TeamViewer.exe (в данном случае Uniprint.exe) по смещению.


5. Anti-debug техника через поиск окна OllyDbg, но со своими особенностями

Злоумышленники используют WinAPI-функцию FindWindow для поиска окон с заголовками "ollyDbG" и "ollyDb":


Особенность в том, что вместо стандартного поведения – после обнаружения окна завершать программу – злоумышленники изменяют значение xor-ключа. Из-за этого не происходит динамической загрузки API, а значит, не устанавливаются хуки на функции, а весь основной функционал содержится в хуках.

Перехват функций с помощью библиотеки MinHook

Для установки хуков на функции использовалась библиотека с открытым исходным кодом MinHook. Совпадение по коду видно на следующем примере:


Начальный этап запуска

После загрузки в легитимный процесс Uniprint.exe (переименованный Teamviewer.exe) вредоносная DLL выполняет несколько проверок:

Определяет наличие файла foobar.jpg на рабочем столе текущего пользователя:


При наличии файла происходит завершение процесса TeamViewer.

2. Проверка процесса TeamViewer

Выполняется путём проверки контрольной суммы файла или даты его компиляции:

FileHeader.TimeDateStamp == 0x4B4CA51F (12.01.2010 16:36:47 UTC)

3. Проверка отсутствия тестового режима Windows

Тестовый режим в Windows позволяет установить драйверы без цифровой подписи.


Если данный режим включен, то происходит изменение xor-ключа. Из-за этого не выполняется динамический импорт API-вызовов и не устанавливаются хуки на функции.

Когда все проверки успешно пройдены, выполняется обработка аргументов командной строки и установка хуков на различные WinAPI-функции.

Подключение старой версии клиента TeamViewer к серверам

Чтобы получить удаленный доступ к жертве, злоумышленники используют довольно старый файл Uniprint.exe. Это легитимный файл TeamViewer QuickSupport 2010 года выпуска. Версия файла 5.0.7687. Вероятнее всего, использование такой старой версии обусловлено наличием в ней уязвимости к технике DLL Hijacking. При запуске данного файла без вредоносной библиотеки TV.dll он не подключается к серверам TeamViewer, не переходит в режим онлайн и, соответственно, не может предоставить удаленный доступ.

В рассматриваемой версии TeamBot рядом с вредоносной DLL и процессом TeamViewer находилась легитимная DLL Teamviewer_Resource_ja.dll, которая содержала в себе строки интерфейса TeamViewer на японском языке. Скорее всего, это было сделано для усложнения взаимодействия исследователей с TeamViewer. Приведем скриншот основного окна TeamViewer после запуска без изменения версии (для удобства приводим справа скриншот аналогичного окна англоязычной версии программы):


Для того чтобы такой старый файл мог подключаться к серверам TeamViewer и предоставлять удаленный доступ, злоумышленники перед установкой хуков изменяют значение версии в памяти процесса TeamViewer:


Функция mw_replace_tv_version выполняет поиск страниц памяти, которые удовлетворяют следующим требованиям:

состояние страницы MEM_COMMIT;

тип страницы MEM_PRIVATE;

права доступа PAGE _READWRITE.

Далее в найденных страницах выполняется последовательное сравнение 16 байт, пока не будет обнаружена UTF16-LE строка "5.0.7687".

После обнаружения данной строки происходит замена "5.0.7" на "15.0.", в результате чего версия становится "15.0.687".



Мы также попробовали применить данный прием на другой старой версии TeamViewer Quick Support – 5.1.17330 QS – и срабатывало!

Такая техника замены версии перестала работать примерно с ноября 2021 года. Скорее всего, производитель (компания TeamViewer) ввел дополнительные проверки. Здесь стоит отдельно отметить, что из-за неработающей техники замены версии злоумышленники потеряли только возможность удаленного управления через TeamViewer. RAT-функционал, реализуемый вредоносной DLL, остался и позволял выполнять команды управления, получаемые с C2.

Аргументы командной строки

Вредоносная DLL поддерживает следующие аргументы командной строки, которые передаются процессу TeamViewer:

Аргумент

Описание

Выполняется перезапуск легитимного процесса TeamViewer без аргументов командной строки через WMI с помощью COM-интерфейса IWbemServices и вызов метода Win32_Process::Create.

Удаляет все файлы и методы закрепления, завершает свои процессы.

– задержка в секундах

Задает задержку перед запуском основного кода оркестратора

Хук user32.CreateDialogParamW. Закрепление и запуск RAT-потока

Большинство хуков предназначены для сокрытия окон TeamViewer
и обеспечения его работы в тихом режиме. Общий список API-функций, на которые устанавливаются хуки, приведен ниже.

Читайте также: