![](https://habrastorage.org/webt/z_/9g/zd/z_9gzdz4uyp6ifap7cw2r9bdqg4.jpeg)
Наверное, каждый из тех, кто читает эту статью, хорошо знаком с GitHub — крупнейшим веб-сервисом для хостинга IT-проектов и их совместной разработки. Здесь можно найти почти любой open source-проект. Для компиляции проекта может быть нужен какой-то специфический софт, которого прямо сейчас у пользователя нет, да и сам процесс сборки из исходников требует определенных знаний и опыта. Понимая это, разработчики, помимо исходного кода, очень часто размещают на гите готовые бинарные файлы. Илья Померанцев, специалист по анализу вредоносного кода CERT Group-IB, на примере реального кейса показывает, как использованием непроверенного чужого кода может привести к потере криптовалюты.
Началась эта история с того, что наш клиент загрузил исполняемый файл с одного из доменов GitHub — raw.githubusercontent.com. Наша система TDS Polygon признала объект вредоносным, и он был передан аналитикам.
![](https://habrastorage.org/webt/vy/qi/0b/vyqi0br-gfzqsqokn-iellxc55c.png)
Источник загрузки — GitHub пользователя под ником faca5. Изучение исходного кода проекта BitTXGenerator, генератора поддельных биткоин-транзакций, не дало никаких результатов. Во всех файлах автором числится некто bunkdeath, датой разработки указан 2010 год, в названиях файлов часто фигурирует DBMS, при этом нет никаких упоминаний про биткоин и криптовалюту.
![](https://habrastorage.org/webt/h6/_t/ro/h6_tror1dh5shmhi3hfwmb3y07e.png)
![](https://habrastorage.org/webt/hm/3a/iw/hm3aiwkx2swfmmnvno5pulszqj4.png)
По имеющимся данным легко найти оригинальный репозиторий и описание оригинального проекта.
![](https://habrastorage.org/webt/nl/ed/iu/nlediuo2_97n98wo2je4yn_mwgg.png)
Впоследствии нам удалось найти демонстрационное видео автора с использованием BitTXGenerator. Его выложил пользователь под ником Herbert Grün. Интерес привлек кадр, где можно рассмотреть открытые окна автора, в числе которых есть ArtMoney.
![](https://habrastorage.org/webt/ws/yd/-v/wsyd-voofwpsyaoiny3zyworvau.png)
Это достаточно известная программа для модификации параметров компьютерных игр. Например, для получения бесконечных виртуальных денег. Это порождает сомнения, действительно ли приложение Electrum отображает реальный баланс кошелька.
Анализ файла
Перейдем к анализу самого сэмпла. Из поведенческих маркеров стало ясно, что перед нами самораспаковывающийся архив, внутри которого находится откомпилированный AutoIt-скрипт:
![](https://habrastorage.org/webt/pk/xm/ij/pkxmijf9tpzfesxihkt7aaqvkco.png)
Анализ в DIE подтвердил эту догадку:
![](https://habrastorage.org/webt/uw/06/tz/uw06tzew6nftcfqovazov-6cq6u.png)
![](https://habrastorage.org/webt/0q/2k/as/0q2kasjwxjxezp5cgtirygdefgi.png)
Далее следует обратить внимание на дерево процессов. Мы видим, что файл PXCeHZSXMe.exe, который лежал внутри sfx-архива BitTXGenerator1.2.1.exe, дропнет и запустит скрипт eVMcf.au3, который можно найти среди созданных файлов:
![](https://habrastorage.org/webt/kp/wl/ar/kpwlarzongo4e4wkjtvqor8dnjg.png)
Распаковка
Стадия 1
После декомпиляции и последующей деобфускации PXCeHZSXMe.exe перед нами оказывается незамысловатый AutoIt-скрипт, который извлекает полезную нагрузку из секции ресурсов и сохраняет ее на диск, чтобы потом запустить.
![](https://habrastorage.org/webt/ah/va/78/ahva78vkq5tmveba5itaawwzxte.png)
Исполнение начинается с поиска открытых окон антивируса Касперского и Avast. Если они есть, то ВПО засыпает на 20 и 30 секунд соответственно. Видимо, пытается обойти антивирус, но поскольку он таким образом его не обойдет — логика этого действия абсолютно непонятна. Также интересна функция декодирования Base64-строк.
Для этой операции автор решил прибегнуть к помощи Shellcode. Еще одно лишенное логики действие, ведь подобную функцию можно легко реализовать на AutoIt:
![](https://habrastorage.org/webt/ax/u9/yi/axu9yi75i3jasambveq8aassoha.png)
В секции ресурсов в закодированном виде хранятся три файла:
- Исполняемый файл AutoIt. Служит для запуска скрипта (HLTH.exe)
- AutoIt-скрипт, содержащий вредоносную функциональность (eVMcf.au3)
- Текстовый файл с именами файлов, в которые будут сохранены AutoIt-скрипт и исполняемый файл AutoIt
Перейдем к анализу второй стадии распаковки, реализованной с помощью eVMcf.au3.
Стадия 2
Выполнение скрипта начинается с поиска виртуальной среды, а также открытого диалогового окна Avast. Почему на этот раз диалоговое окно антивируса Касперского перестало пугать автора ВПО — навсегда останется загадкой.
![](https://habrastorage.org/webt/fg/d9/oy/fgd9oy80poq2sqqysnjdvrn0y5o.png)
Интересно, каким образом малвара уходит «в спячку». Вернее, то, каким образом она проверяет, что эта «спячка» действительно была. Дело в том, что многие «глупые» песочницы осуществляют перемотку времени. То есть при попытке вызвать WinAPI-функцию Sleep песочница пропускает его, сразу же возвращая управление обратно в поток ВПО. Это отличный индикатор для ее обнаружения. Достаточно взять разницу между системным временем до системного вызова и после него. Однако то, как этот механизм реализован в нашем сэмпле, опять вызывает много вопросов.
![](https://habrastorage.org/webt/wt/ia/pi/wtiapi7apfens56nlmr1rhudjs4.png)
Дело в том, что WinAPI-функция GetTickCount возвращает время в миллисекундах, то есть очень точно. Даже если бы код был изначально написан на языке ассемблера, а оптимизация была максимальной — разница во времени никогда бы не была строго равна времени «спячки». Мы же имеем дело с интерпретируемым языком. Это попросту не имеет никакого смысла.
Далее следует опциональная проверка на повторный запуск. Реализована через проверку существования именованного семафора.
![](https://habrastorage.org/webt/zd/hw/fw/zdhwfw5zch5aehuv5g__nairj0a.png)
Сама полезная нагрузка хранится последней строкой в виде AutoIt-комментария и закодирована при помощи Base64.
![](https://habrastorage.org/webt/mv/i9/gp/mvi9gpuldoo5sszw98ihqnqsdre.png)
Функция декодирования абсолютно аналогична той, что использовалась на первом этапе. Это позволяет предположить, что у обоих скриптов идентичный автор.
Возможно хранение одной или двух полезных нагрузок. Поддерживается инжект в процесс RegSvcs и wscript. Есть поддержка x86 и x64. Опционально возможна обработка пейлоада как batch-скрипта с сохранением его в файл для последующего запуска.
Сама функция инжекта вновь вызывает ряд вопросов. Во всех загрузчиках на AutoIt, которые нам известны, инжект выполняется с помощью Shellcode. В этом же случае вся процедура встраивания в чужой процесс реализована непосредственно на AutoIt. Это вдвойне странно, если вспомнить, как реализовано декодирование Base64.
Стадия 3
После декодирования комментария мы получили два новых исполняемых файла. Первый из них является sfx-архивом. Его оставим на потом.
Второй — это приложение, написанное на Delphi. Главная форма соответствует интерфейсу рекламированного автором софта.
![](https://habrastorage.org/webt/e0/zg/3m/e0zg3mkgbz4qoclw_3oxxkcxntu.png)
При клике на кнопку Generate Transaction выводится текст Status: Generating Transaction. Затем запускается таймер, по истечении которого появляется один из 16 заготовленных текстов.
Кнопка Broadcast Transaction выведет Status: Broadcasting to all peers и тоже запустит таймер. По итогу будет просто выведена надпись Status: Broadcast successful.
Есть еще несколько таймеров, которые с разной периодичностью выводят захардкоженную информацию о якобы подключенных пирах.
По итогу оказывается, что обещанная автором функциональность — просто фейк.
![](https://habrastorage.org/webt/kx/qw/96/kxqw960kghvmlszinchzepy6k0e.png)
А теперь зададимся вопросом, зачем же было так пиарить софт, который ничего не делает?
Вот тут мы и вспоминаем про первый файл.
Кое-что он всё-таки делает...
Процедура распаковки аналогична той, что была проведена с исходным файлом. По итогу перед нами оказалось еще одно приложение на Delphi. Главная форма содержит в себе элемент TMemo, большое количество таймеров, которые не имеют обработчиков, и обработчик события onCreate для самой формы.
![](https://habrastorage.org/webt/8b/3q/34/8b3q34hyz2aiuhnedqf5oo_ypyg.png)
При создании формы модуль устанавливает перехватчик для буфера обмена. Когда появляется новое содержимое, оно проверяется на соответствие биткоин-кошельку. Если соответствие обнаружено, то содержимое заменяется на кошелек из списка TMemo. То есть происходит подмена адреса кошелька.
Для первого кошелька мы нашли информацию о двух входящих транзакциях на общую сумму $775 (приблизительно 50 000 рублей). Отмечу, что мы также нашли другие экземпляры ВПО с другим набором кошельков.
![](https://habrastorage.org/webt/um/tt/kh/umttkhgk8amzgarm42waeu6hjwq.png)
Это всего лишь один из многочисленных примеров того, чем может закончиться бездумное использование чужого кода, особенно в скомпилированном виде. Да, изучение исходников может занять время, но зато это поможет сэкономить львиную долю нервов, а возможно, и денег.