Тривиальное шифрование во вредоносных файлах / Блог компании «Лаборатория Касперского» / Хабрахабр. Привет. Это снова Алексей Маланов из «Лаборатории Касперского». В прошлый раз я рассказывал про опыт найма вирусных аналитиков, а сегодня расскажу про то, что делают вирусописатели, чтобы их работа не была замечена, и что делаем мы, чтобы их труд в итоге оказался напрасен. Вообще говоря, злоумышленник пишет вредоносную программу, почти всегда заранее зная, что она рано или поздно попадет на «операционный стол» вирусному аналитику.
И вся информация из зловреда может быть использована против автора. Ну, во- первых свою личность. Порой в зловредах встречаешь строки, типа C: \Users\Vasiliy Ivanov\Documents\Visual Studio 2. Release\trojan. pdb. Во- вторых, довольно много информации, облегчающей анализ зловреда.
У этого приложения будет доступ к: Обновление Random Key Generator может автоматически добавлять дополнительные функции в каждую группу.
Давайте рассмотрим некоторые приемы вирусописателей, и выясним, почему же они бесполезны. Что скрывают: Интернет- ссылки.
Чтобы получить ключ выполняем действия: 1) Переходим на страницу раздачи: https://gleam.io/dTEn6/casual-
Экземпляры Trojan- Downloader в первую очередь скачивают/обновляют другое вредоносное ПО по одной или нескольким ссылкам. Очевидно, что если ссылки хранить в явном виде, то система автообработки любой антивирусной компании с легкостью извлечет их, добавит в список на периодическое скачивание и забанит доступ к этим ресурсам. Смысл Trojan- Downloader'а пропадает напрочь.
Как добавить в exe файл дополнительную информацию? 6.76 MB, скачали 1302 раз.
Зловредам других классов также свойственно скачивать новые версии своих модулей. Компоненты. Зловреды нынче сложные, многокомпонентые.
Один модуль отвечает за обновление, второй — драйвер- руткит, третий обеспечивает сбор паролей, четвертый ответственен за прием команд из центра управления и передачу результатов. В общем, очень часто все это оборачивается в один «инсталлятор». Это может быть специальный Trojan- Dropper стороннего «разработчика», а то и просто очередной компонент того же автора. Так же, как и с URL'ами, если внутренние PE- EXE модули не спрятать надёжнее, их легко выдерут автоматические средства, и все файлы отправятся на автоанализ и автодетектирование. Причем, если хотя бы один из модулей будет признан вредоносным, то вся пачка уже точно не потребует ручного анализа, и все будет успешно задетектировано. Пароли. Вы не поверите, но во вредоносных файлах авторы зашивают даже свои пароли.
Не часто, конечно, но бывает. Например, если Trojan- Spy делает много снимков экрана (или даже снимает видео камерой жертвы), то обычный способ доставки материала автору — заливка на FTP. Вирусописатель создает один аккаунт с доступом на чтение и запись. И чтобы никто лишний не забрел на его FTP, выставляет пароль, который вписывается в код зловреда. В результате туда забредает не абы кто, а конкретный независимый исследователь, стирает все награбленное и оставляет записочку горе- автору.
Замечу, что это «неправомерный доступ к компьютерной информации», вот только преступник не побежит писать заявление. Другой пример — пароль от почтового ящика. Автору нужно переслать себе собранные у жертвы пароли.
Но почтовый сервис, на котором у него зарегистрирован ящик, не позволяет отправлять письма непонятным людям и требует аутентификации при отправке. Понятно, что «серьезные» малварщики так не ошибаются, особенно те, кто нацелен на воровство банковской информации. Другие же, напротив, иногда намеренно рассчитывают, что их код будет просмотрен аналитиком. Сейчас- то почти все идет на автоматику, а вот 1.
Это никем не детектируемый Pinch, и мне бы хотелось, чтобы он оставался таким. Вам для этого ничего не нужно делать. Спасибо.»Тривиальное шифрование. Отсюда вывод: вирусописателям есть что скрывать внутри своих творений, и они пытаются это делать. Если вы отлично знаете, что такое битовые операции XOR, ROL и понимаете, как при помощи них можно преобразовать данные, вы можете пропустить весь этот раздел.
Предположим, у вас есть строка httр: //secret. При этом алгоритм расшифровки и ключ тоже будут находиться в этом же коде, ведь вам самим эта строка понадобится. Пожалуй, самым- самым простым способом будет следующий.
Not. Представим строку в виде цепочки битов 1. Теперь невооруженным глазом такую строку уже не узнать. Зато программно можно.
Применим ко всему файлу операцию NОТ: то, что было зашифровано, расшифруется обратно. А что нет — зашифруется.
В получившемся файле URL виден автоматике и глазам. Xor. Слегка усложним. При шифровании инвертировать можно не каждый бит, а, например, каждый четвертый (чтобы никто не догадался). Такое вот инвертирование некоторых битов называется так же операцией XOR. Записывается a : = a XOR key, где a — это преобразуемый байт, а key — ключ, в котором записано, какие биты меняем. При этом, операция NOT эквивалентна a : = a XOR FF.
Шестнадцатеричное FF равно двоичному 1. Для расшифровки нужно «поксорить» данные еще раз с тем же ключом. Убедиться, что при этом получится именно оригинал, я предлагаю любопытному читателю самостоятельно. Не забывайте, что в отличие от предыдущего метода, в этом вам придется хранить ключ в программе, если вы хотите расшифровать свои данные при исполнении. И аналитику тоже придется искать/перебирать ключ, чтобы дешифровать строку.
Есть, впрочем, еще один способ, но об этом ниже. Другие методы. Что еще можно сделать: Применять к каждому байту операцию ADD, то есть добавлять некое число — ключ. Менять ключ от байта к байту. Например, первый байт «ксорить» с ключом 7.
Тогда ключ нельзя будет уже просто перебрать, перебирать придется уже 2 ключа, а это в 2. Можно увеличить длину ключа. Например, первый DWORD «ксорить» с четырехбайтовым ключом, второй DWORD «ксорить» с ним же и т. Тогда для расшифровки без ключа вам придется перебирать уже 4 миллиарда вариантов. А если вы (или программа- выдиралка) не знаете, где точно расположена искомая информация в файле, то такой перебор придется производить для каждого байта (размер зловреда обычно составляет несколько сотен килобайт)Можно применить операцию циклического сдвига ROL на каждый байт.
Но только при побайтовой шифрации «ролить» имеет смысл только на 1- 7 битов. При циклическом сдвиге байта на 8 бит мы получаем тот же самый байт. Можно «ксорить» два раза. Один малварщик зашифровал строку. Ему показалось, что этого мало, он еще раз «поксорил» ее с тем же ключом. Что из этого получилось, догадайтесь сами.
Строчку можно записать задом наперед. Строчку можно записать через байт. Для ASCII- символов получится Unicode.
Строчку можно сдвинуть на пол алфавита, то есть a- > n, b- > o, .., z- > m, 0- > 5, 1- > 6.. Записать символы в hex- виде, то есть 6.
A2. F2. FРазместить строку на стеке . Есть файл длиной в 1 Мб. Внутри в неизвестном месте зашифрована одним из описанных выше методов строка, начинающаяся с http: //. Надо написать программу, которая обработает файл и, без эпического перебора, извлечет эту строку.
Зашифровано может быть что- то еще, например, MZ- PE заголовок внутреннего файла, но с условием: вам известно, что именно вы ищете. А то искать неизвестный мусор, зашифрованный неизвестно чем, в неизвестном месте – не очень- то благодарное занятие. Небольшое отступление. В ЛК сейчас используются такие методы автоанализа, которым все равно, что зашифровано, и как.
Хотя бы даже очень стойким алгоритмом (в отличие от описанных). Если данные используются самой программой, они все равно будут нами извлечены. Ниже я лишь продемонстрирую, что описанные методы шифрования не защитят вирусописателя и не составят трудности даже для аналитика- любителя. Следите за руками. Xor. Вы помните урл, к которому применили операцию NOT? Увидев эти буквы вновь, вы всегда угадаете, что это урл. А вот строка, поксоренная с ключом F0: .
Обратите внимание, второй и третий, а также последний и предпоследний символы равны. Но у XOR есть еще полезное свойство — операция обратима. То есть, из 'Ш' = 'h' XOR key. Ш' XOR 'h'. А это значит, что если есть последовательность . Далее проверяем, что'Ц' == 't' XOR key'К' == 'p' XOR key'Е' == ': ' XOR key..
И проверяем, что оставшаяся часть урла действительно является урлом. Но вот что делать, если злоумышленник линейно менял ключ от байта к байту? Но если ключ длиной в саму искомую строку, то описанный подход не работает. Почему- то малварщики делают что угодно, но только не то, что на самом деле помогло бы им. Комбинирование. Например, они комбинируют методы.
Запишут урл задом наперед, да еще через байт, а потом еще поксорят с переменным ключом. Да, некоторую автоматику это может сбить с толку. По факту же это не мешает успешно детектировать такие файлы. А как только зловреда разберет вирусный аналитик, он добавит в дешифровщик метод Reverse(Unicode(Linear. Xor(stream))), после этого все старые и новые версии расшифровываются автоматически. Водяные знаки. Еще одно применение описанных методов шифрации: водяные знаки в программе. Предположим, вы честный программист и отдаете копию программы клиентам Василию и Георгию.
Нет, лучше Эдуарду и Григорию. И хотите знать, а не выкладывает ли один из них программу в публичный доступ. В исходном коде вы можете написать: #pragma data. Ведь неизвестно, что искать и где. Однако, как мы только что выяснили, если копия Эдуарда все- таки попадет в публичный доступ, то у Григория окажутся два варианта программы, и он без труда найдет разницу в них и разгадает шифр.
Получится только хуже для вас, Григорий сможет подделывать чужие копии. Заключение. Вот в целом и все. Мы познакомились с некоторыми тривиальными методами шифрации и выяснили, почему же они бесполезны. Если у вас есть вопросы и комментарии — отлично, очень жду. Если же материал показался вам слишком простым, то вот вам жизненный пример из области анализа вирусов на эту же тему.
Вирус (инфектор) встраивает свое тело в заражаемый файл. Тело у него постоянно, но он его ксорит по DWORD'ам с псевдослучайными числами так: srand(key); crypted. Для примера можете считать, что телом вируса является секция кода notepad. Известно, что в качестве генератора псевдо- случайных чисел используется самый популярный в компиляторах алгоритм: seed = seed * 1.