Главная · Поиск книг · Поступления книг · Top 40 · Форумы · Ссылки · Читатели

Настройка текста
Перенос строк


    Прохождения игр    
Demon's Souls |#13| Storm King
Demon's Souls |#12| Old Monk & Old Hero
Demon's Souls |#11| Мaneater part 2
Demon's Souls |#10| Мaneater (part 1)

Другие игры...


liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня
Rambler's Top100
Образование - Безруков Н.Н. Весь текст 1232.53 Kb

Компьютерная вирусология ч. 1

Предыдущая страница Следующая страница
1 ... 92 93 94 95 96 97 98  99 100 101 102 103 104 105 106
загрузочном модуле.

     После загрузки СОM-файла:

     1. CS, DS, ES и SS указывают на PSP;
     2. SP указывает на конец сегмента PSP (обычно 0FFFEh, но может быть
и меньше, если полный 64K сегмент недоступен, например при работе
отладчика). Слово по смещению 06h в PSP указывает, какая часть
программного сегмента доступна;
3. вся память системы за программным сегментом распределена программе;
4. слово 00h помещено (PUSH) в стек;
5. IP содержит 100h (первый байт модуля) в результате команды JMP PSP:100

                              EXE-программы

     EXE-программы содержат несколько программных сегментов, включая
сегмент кода, данных и стека. EXE-файл загружается, начиная с адреса
PSP:0100. В процессе загрузки считывается информация заголовка EXE в
начале файла и выполняется перемещение адресов сегментов.

     После перемещения управление передается загрузочному модулю
посредством инструкции далекого перехода (FAR JMP) к адресу CS:IP,
извлеченному из заголовка EXE.
     В момент получения управления программой EXE-формата:

     1. DS и ES указывают на PSP;
     2. CS, IP, SS и SP инициализированы значениями, указанными в
заголовке EXE;
     3. поле PSP MemTop содержит значение, указанное в заголовке EXE.
Обычно вся доступная память распределена программе.


      0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F
    ЪДДДДДДДТДДДДДДДТДДДДДДДТДДДДДДДТДДДДДДДТДДДДДДДТДДДДДДДТДДДДДДД¬
 00 ¦ Sign  єPartPagєPageCntєReloCntєHdrSizeєMinMem єMaxMem єReloSS ¦
    ГДДДБДДДЧДДДБДДДЧДДДБДДДЧДДДБДДДЧДДДБДДДЧДДДБДДДЧДДДБДДДРДДДБДДДґ
 10 ¦ExeSP  єChkSum єExeIP  єReloCS єTablOffєOverlayє Rel.Table El  ¦
    ГДДДБДДДРДДДБДДДЧДДДБДДДРДДДБДДДЧДДДБДДДРДДДБДДДЧДДДБДДДДДДДБДДДґ
 20 ¦смещ.  сегмент є смещ.  сегментє  ...     ...  є  ...     ...  ¦
    АДДДБДДД†ДДДБДДДРДДДБДДД†ДДДБДДДРДДДБДДД†ДДДБДДДРДДДБДДД†ДДДБДДДЩ
 30
    ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
...  ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...

    ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
1F0  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00  00
    ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ
200  начало кода EXE-программы
    ГДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДД†ДДДБДДДґ


             Рис.11. Структура заголовка файла EXE-формата

    Как видно из рис. 11 заголовок состоит из двух частей:
форматированной части (первые 1Ch байт) и таблицы перемещения
(Relocation Table) переменного размера, причем начало таблицы
перемещений определяется значением поля TablOff (обычно это поле
содержит 1Ch, но могут быть и другие значения).  Форматированная часть
заголовка включает 14 двухбайтовых полей:

 Sign    -  "подпись" EXE-файла (4Dh 5Ah -'MZ')[0;2];
 PartPag -  длина неполной последней страницы (обычно игнорирует-
            ся)[2;2];
 PageCnt -  длина образа загружаемой программы в 512-байтовых страницах,
            включая заголовок [4;2];
 ReloCnt -  число элементов в таблице перемещения[6;2];
 HdrSize -  длина заголовка в 16-байтовых параграфах[8;2];
 MinMem  -  мин. треб. памяти за концом программы (параграфы)[0Ah;2];
 MaxMem  -  макс.треб. памяти за концом программы (параграфы)[0Ch;2];
 ReloSS  -  сегментное смещение сегмента стека (для устан. SS)[0Eh;2]
 ExeSP   -  значение регистра SP (указателя стека) при запуске [10h;2]
 ChkSum  -  контрольная сумма (отрицательная сумма всех слов файла;
            в существующих версия MS DOS, к сожалению, при загрузке
            не проверяется) [12h;2]
 ExeIP   -  значение регистра IP(указателя команд) при запуске[14h;2];
 ReloCS  -  сегментное смещение код. сегмента (для устан. CS)[16h;2];
 TablOff -  смещение для 1-го элемента перемещения (часто 1Ch) [18h;2];
 Overlay -  номер оверлея (0 для главного модуля)[1Ah;2];

     Как видно из приведенной структуры, заголовок EXE-файла, всегда
начинается с подписи MZ. После загрузки программы, загрузчик анализирует
эти первые два байта и, если они содержат "MZ", то рассматривает даный
файл как EXE- файл, независимо от расширения имени файла (оно может быть
и COM и BIN, а не только EXE).  Эта особенность MS DOS учитывается не
всеми файловыми вирусами. Поэтому, если при заражении вирус исходит из
предположения, что тип файла  соответствует расширению его имени, то он
неправильно заражает "замаскированные" EXE-файлы, которые после
заражения, естествнно, становятся неработоспобными.  В то же время этот
эффект потери работоспособности является обратимым: после лечения фагом
заголовок будет восстановлен.

      Обычно заголовок имеет размер 512 байт (200h) и значительная часть
его неиспользуется (содержит нули).

      Файловые вирусы при заражении изменяют заголовок EXE-файла и это
обстоятельство можно использовать для контроля.  Обычно файловые вирусы
изменяют значение полей ExeIP и ReloCS таким образом, чтобы они
указывали на начало тела вируса, дописанного в конце программы (перед
передачей управления программе загрузчик заносит в регистры значения из
соответствующих полей заголовка, а затем передает управление по адресу
CS:IP).  Некоторые вирусы используют способ, неосторожно
"рекомендованный" Д.Н.Лозинским в документации к полифагу AIDSTEST и
основанный на корректировке соответствующего элемента Relocation Table.
Как уже указывалось, эта таблица начинается с байта, адрес которого
указан в поле TablOff (обычно 1Ch) и имеет ReloCnt элементов. Каждый
элемент занимает четыре байта и содержат два поля:  <смещение> и
<сегмент>:

             Формат таблицы перемещения (Relocation table)
                ЪДДДДДДДВДДДДДДДВ Д Д ВДДДДДДДВДДДДДДД¬
                ¦ смещ.  сегмент¦  ¦ смещ.  сегмент¦
                АДДДБДДДБДДДБДДДБ Д Д БДДДБДДДБДДДБДДДЩ

     Загрузчик добавляет к каждому из слов, определенных адресом
соответствующего элемента таблица перемещений, адрес начала сегмента
(обычно PSP +10h). Легко видеть, что этот процесс можно использовать для
изменения команды перехода или вызова подпрограммы, содержащегося по
адресу ReloCS:ExeIP, как бы возвращаясь тем самым к способу, обычно
применяемому вирусами при заражении COM-файла.


                        РЕЗИДЕНТНЫЕ   ПРОГРАММЫ

     Выход из программы в MS DOS можно выполнить двумя способами:

     1. С помощью функции 4Ch (EXIT) в любой момент, независимо от
значений регистров.

     2. С помощью функции 00h или прерывания INT 20h, когда Ваш CS
указывает на PSP.

     В этих случаях занимаемая программой память освобождается.

     Кроме того, MS DOS позволяет завершить программу и оставить ее
постоянно резидентной (TSR), используя либо INT 27h , либо функцию DOS
31h (KEEP). Последний способ применяется, когда резидентный код длиннее
64K или необходимо сформировать код выхода для родительского процесса.

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





                                                            ПРИЛОЖЕНИЕ 8
                       ПРЕРЫВАНИЯ MS DOS

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

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

    Следует отметить, что в строгом смысле этого слова прерыванием
можно называть только те, которые ведут к приостановке действия текущей
программмы и выполнению каких-то дополнительных действий.  Для
микропроцессора 8086/286/386 такими "строгими" прерываниями являются
только некоторые из описываемых ниже прерываний.

    В MS DOS функции по управлению процессами и файловой системой также
привязаны к определенным прерываниям, однако не являются прерываниями в
строгом смысле этого слова.  По сути они являются функциями - точками
входа в модуль BIOS или MS DOS реализующий соответствующую операцию.
Использование прикладной программой той или иной функции удобно
выполнять, используя обращение к соответствующему прерыванию, поскольку
отпадает необходимость знать адрес начала модуля, реализующего эту
функцию. Поэтому прерывания можно условно разделить на три группы:
Собственно прерывания, сервис и указатели:

Прерывания              Сервис                        Указатели
ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ ЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ
 INT 00H Деление на 0    INT 10H Видео сервис          INT 1dH Видео параметры
 INT 01H Пошаговое       INT 11H Список оборудования   INT 1eH Параметры дискет
 INT 02H Немаскируемое   INT 12H Размер исп.памяти     INT 1fH Символы графики
 INT 03H Точка прерыв.   INT 13H Дисковый в/в
 INT 04H Переполнение    INT 14H В/в через последовательный порт
 INT 05H Печать экрана   INT 15H Расшир.сервис AT      INT 41H параметры
 INT 06H (резерв)        INT 16H В/в клавиатуры                первого винчестера
 INT 07H (резерв)        INT 17H В/в принтера          INT 46H параметры второго
 INT 08H Таймер          INT 18H ROM-BASIC                     винчестера
 INT 09H Клавиатура      INT 19H Загрузка              INT 44H граф. симв. EGA
 INT 0aH-0dH (hdwr ints) INT 1aH В/в таймера           INT 4aH user alarm addr
 INT 0eH Дискета         INT 1bH Прерывание клавиатуры INT 50H CMOS timer int
 INT 0fH (hdwr int)      INT 1cH Пользовательское прерывание по таймеру
                         INT 20H-2fH Прерывания MS DOS


    В микропроцессоре 8086/8088 предусмотрено 256 различных типов
прерываний. Команда INT данного микропроцессора имеет однобайтовое поле,
в котором записывается номер прерывания. Например, команда INT 21
обеспечивает обращение к 21 прерыванию (здесь и далее номера прерываний
приводятся в 16-ричной системе счисления, 21h = 33d).  Поскольку вместо
адреса в команде INT указывается тип прерывания (номер), то имеется
специальная таблица прерываний, ставящая в соответствие каждому номеру
прерывания адрес подпрограммы обработки этого прерывания. В
микропроцессоре 8086/286/386 для этой цели отводятся нижние 1024 байта
памяти - по 4 байта на каждое прерывание. В процессе интерпретации
команды процессор запоминает состояние флажков в стеке (специальной
области памяти, организованной по принципу первым пришел - первым ушел),
умножает номер прерывания на 4, считывает соответствующий элемент
таблицы прерываний и выполняет переход по содержащемуся в нем адресу.
Когда подпрограмма обработки прерывания отработает, она с помощью
специальной команды восстанавливает значения флажков из стека, загружает
в соответствующие регистры адрес команды, следующей за точкой
прерывания, и возвращает управление по этому адресу.

    Очевидно, что заменив адрес в таблице прерываний, можно тем самым
заменить обработчик прерываний на свой собственный. Эта операция и
называется перехватом прерывания. В приводимой ниже таблицы перечислены
основные прерывания с некоторыми пояснениями. Для экономии места
пояснения вставлены "в разрыв" таблицы.  При составлении таблицы были
использованы материалы из электронного справочника TECHHELP Дана
Роллингса (D.Rollings). Изложение ориентировано на облегчение разбора
протоколов трассировки и листингов дизассемблирования программистам, не
работающим на ассемблере.
Предыдущая страница Следующая страница
1 ... 92 93 94 95 96 97 98  99 100 101 102 103 104 105 106
Ваша оценка:
Комментарий:
  Подпись:
(Чтобы комментарии всегда подписывались Вашим именем, можете зарегистрироваться в Клубе читателей)
  Сайт:
 
Комментарии (3)

Реклама