Обзор xehook stealer ИЛИ как продавать паблик проект за 60$

D2

Администратор
Регистрация
19 Фев 2025
Сообщения
4,380
Реакции
0
Всех приветствую

На обзор попал известный в узких кругах стиллер под названием xehook (тема тут)
В данном обзоре я рассмотрю лишь БИЛД данного продукта, и на основе этого дам личное мнение.
Версия стиллера, которая рассматривалась в данной статье - 2.1.4. Stable

Начну с того, что данный проект, предположительно, связан с такими проектами как cinoshi <- holdthismoney <- ginzo <- exostub. если с holdthismoney, ginzo, exostub все понятно (их стабы имели минимальные отличия, все они подкачивали ддлки для просмотра БД, архивации и т.д.), тогда почему с xehook не все так однозначно?
Оснований у меня немного, но я и не буду утверждать что это правда. Во-первых веб-панель что xehook, что cinoshi очень схожи между собой (конкретно благодаря тому, что везде используются компоненты из tabler.io). Во-вторых, подмечу, что оба проекта развивались последовательно, причем xehook появился на свет спустя некоторое время после новости по поводу продажи cinoshi в Telegram-канале. Также вероятно, что проект просто выкупил человек, который до этого не имел отношения к выше перечисленным проектам, но не стоит отменять и того факта, что автор данного проекта и есть тот самый кодер cinoshi aka holdthismoney aka ...

Собственно, к чему я веду?
Если xehook - это проект того же человека, что и cinoshi, значит у человека есть большой опыт с мальварью, в частности с написанием кода для стиллеров. Будем это иметь ввиду при разборе билда.

Первичный осмотр

Билд стиллера представляет собой exe-файл весом ~950kb
Спойлер: Результат Exeinfo PE
1713988331113.png

При анализе Exeinfo PE видим сборщик Microsoft Visual C++, но сам стиллер, как мы знаем, написан на C#. Давайте посмотрим, что он делает.
После запуска на виртуальной машине можем видеть создание процесса RegAsm.exe, что наводит на мысль, что наш стиллер инжектится в сторонний процесс.
Давайте дампить
Спойлер: Результат дампа
1713988484919.png

На выходе видим файл под названием xehook и весом 89 кБ.

Анализ в dnSpy

Пробуем открыть полученный файл в dnSpy и бинго!
Спойлер: Xehook в dnSpy
1713988598367.png

Перед нами стиллер в чистом виде. Также видим, что на файле нет дополнительной обфускации в виде ренеймера. Благодаря этому, у меня возникло подозрение, что названия пронстранств имен (namespace) уж очень сильно что-то напоминают.
Спойлер: Референс на опен-сурс проект
1713988900501.png

Хм.. Весьма странно. Для тех, кто не понимает откуда второй скрин - это опен-сурс стиллер Phemedrone. Давайте посмотрим на код, возможно это совпадение.
Спойлер: Сравнение кода xehook и Phemedrone
1713989049216.png


1713989065448.png

Видим сходства. К сожалению, 90% кода было взято из Phemedrone. Дальше я буду рассматривать только то, чего нет в опен-сурс проекте.

Взглянем на код для обхода песочниц, виртуальных машин и прочего.
Спойлер: AntiAnalysis.cs
1713989413844.png

На скрине показан метод, который отвечает за все проверки. В данном методе меня смутило несколько вещей.
1) AntiAnalysis.Debugger() возвращает результат выполнения WinApi функции CheckRemoteDebuggerPresent, в чем я не вижу никакой логики, ведь данную проверку можно легко обойти, включив галочку в самом dnSpy.
2) AntiAnalysis.Processes() возвращает true, если в запущенных процессах были найдены какие-либо подозрительные процессы. На самом деле, ничего в этом такого нет (хотя сам исполняемый файл можно переименовать, и данная проверка провалится). Меня больше смутило, что если запущен процесс processhacker, программа закроется. Как по мне это лишнее.
3) AntiAnalysis.VirtualBox() проверяет некоторые параметры через WMI. Код можно было бы сделать чище, если удалить ненужные проверки (к примеру, зачем мы проверяем наличие слова VIRTUAL в значении, написанного капсом, а потом сверяем это же значение с VirtualBox, если на первом же условии мы получим true). В идеале можно поместить все нежелательные ключевые слова в список, и потом проходиться по каждому слову, нежели постоянно вызывать .ToString().ToLower() и т.д.
Спойлер: AntiAnalysis.VirtualBox()
1713990001160.png

Далее посмотрим на код, который парсит конфиг с сервера.
Спойлер: Методы парсинга конфига
1713990378744.png

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

Взглянем теперь на отправку лога на сервер.
Спойлер: Отправка на сервер
1713990509938.png

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

Напоследок, рассмотрим код лоадера, который идет после сбора и отправки лога.
Спойлер: Запуск пользовательских файлов (лоадер)
1713993657909.png

Опять видим нерациональное использование try catch, что говорит о том, что кодер не знает, в каком моменте может встретиться ошибка и как правильно ее обработать.
Также, видим, что код запуска файла повторяется 2 раза, с отличием в параметре Verb, который можно было присвоить отдельно после инициализации класса ProcessStartInfo.
После лоадера идет код для отображения диалогового окна с фейк-ошибкой, удалением данных крипто-расширений с Хромиум-браузеров (в коде это названо competitor, по аналогии - анти-соседи, что весьма специфично) и удалением самого себя (тут я не проверял, удаляет ли он файл в который инжектится, в моем случае RegAsm.exe, либо файл который запущен был изначально). Ничего особенного в коде этих функций нет, поэтому скриншоты прикреплять не стану.

Из уникального в этом стиллере больше ничего не осталось (крипто-расширения я не беру в счет, добавить новые пути в список - дело пяти минут).

Компетентность продавца

Предлагаю теперь взглянуть, в каких местах продавец обманывает своих покупателей.
Спойлер: Работа стиллера на чистой системе
1713992729978.png

Я бы не назвал это чистой ложью, ведь, действительно, приложения, использующие .NET Framework 4.0, запустятся на большинстве чистых системах. Но тут уточнение, что не на всех системах он запустится, к примеру на чистой Windows 7 (по-умолчанию предустановлен .NET Framework 3.5, но не 4.0). И раз уж мы говорим, о том, что нет зависимостей, это тоже заблуждение, ведь автор сам говорит, что зависимость от .NET Framework 4.0.
Спойлер: Отправка лога чанками
1713992416871.png

В коде не было замечено ни единого намека на загрузку лога на сервер чанками. Код отправки не сопровожден какими либо try catch выражениями, что означает при первой провальной отправке лога, программа просто закроется (сам метод отправки лога прикреплен выше, а ниже прикрепляю использование данного кода).
Спойлер: "Отправка чанками" на деле
1713992656463.png

Больше в описании темы я не нашел ничего противоречащего.

Заключительный этап

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

Всех благодарю за прочтение, буду рад выслушать ваше мнение
 
Сверху Снизу