Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29243
Скачиваний: 1689
Часть III. Файловая оболочка, вирус, резидент
224
Флаг прерывания
IF
(Interrupt Flag). Содержит 1, если разрешена обработка
прерываний микропроцессором.
Флаг управления
DF
(Direction Flag). Управляет направлением передачи
данных: если он содержит 0, то после каждой индексной операции
содержимое индексных регистров увеличивается на 1, в противном случае —
уменьшается на 1.
Флаг переполнения
OF
(Overflow Flag). Равен 1, если в результате операции
получено число, выходящее за разрядную сетку процессора, т. е. число, пре-
вышающее максимальный размер регистра или переменной.
3. Я только начинаю изучать ассемблер, но у меня уже возникла необхо-
димость иметь документацию по всем прерываниям MS-DOS. Где можно ее
найти?
Документацию на русском языке можно скачать на сайте http://www.Kalashnikoff.ru.
Программа называется helpassm.exe.
Если у вас возникли вопросы по работе с ассемблером, вы можете свободно об-
ращаться к нашим экспертам портала RFpro.ru, которые дадут вам исчерпываю-
щие ответы. Желаем вам успехов!
Глава 23
Область PSP и DTA. Системные
переменные (окружение DOS)
Настоящая глава информативная и достаточно интересная. В ней мы рассмот-
рим то, что не затрагивалось в предыдущих главах, а именно:
что такое системные переменные (в MS-DOS назывались окружением DOS);
как уменьшить размер резидента в памяти;
как менять "на лету" параметры резидента;
как получить переданные нашей программе параметры в командной строке;
как фиксировать в файле нажимаемые пользователем клавиши (в том числе и ввод
паролей в программах командной строки);
и прочее, по мелочам.
Прежде чем начнем рассматривать подробно работу резидента, мы хотели бы
обратить ваше внимание на то, как теперь задается имя файла, в котором хранятся
нажатые пользователем клавиши (в дальнейшем этот файл именуется LOG-
файлом).
В одной из предыдущих глав мы также сохраняли действия программ (запуск,
создание, удаление файла, создание/удаление каталога и пр.) в LOG-файле, имя
которого указывалось в ассемблерном листинге. Впоследствии, после ассемблирова-
ния, мы не могли менять имя LOG-файла и его местоположение в каталоге (если, ко-
нечно, не менять его вручную непосредственно в COM-файле, используя какой-
нибудь текстовый редактор типа Hacker's View). Теперь же наш резидент стал более
гибким. Имя LOG-файла можно задавать при запуске программы, указав его в па-
раметрах командной строки. Например:
RESID23.COM c:\assm\log_file.txt
После загрузки резидент создаст файл C:\assm\log_file.txt, в который и будет за-
носить нажатые пользователем клавиши.
В настоящей главе рассмотрим, как можно менять параметры резидента "на ле-
ту". Для начала зададим себе несколько вопросов.
Допустим, мы загрузили резидент, указав перед его запуском имя LOG-файла
A:\super\file.log. Имеется ли возможность изменить имя LOG-файла, не перезагру-
жая резидента, т. е. не удаляя его из памяти, а затем, не загружая его, опять с но-
вым параметром в командной строке? Можно ли запускать резидент без каких-
либо параметров вообще? И всегда ли нужно указывать параметры?
Часть III. Файловая оболочка, вирус, резидент
226
23.1. Структура командной строки
Прежде всего разберемся, что собой представляют параметры командной стро-
ки. Мы уже вкратце рассматривали данную тему, а сейчас заполним пробелы.
Параметры командной строки указываются при запуске файла и должны распо-
лагаться после имени запускаемого файла. Например:
SYS.COM C: A:
Здесь
SYS.COM C: A:
— командная строка, а
C: A:
— параметры командной
строки, которые передаются файлу SYS.COM после загрузки. В данном примере
SYS.COM скопирует системные файлы с диска С: на диск А:. Как же нашей про-
грамме получить эти параметры?
Как уже упоминалось, параметры командной строки, передаваемые файлу, рас-
полагаются в PSP по смещению
80h
. PSP, в свою очередь, находится в том сегмен-
те, в который загрузился наш COM-файл. Проще говоря, первая инструкция COM-
файла начинается со смещения
100h
(
org 100h
), а по смещению
80h
находятся па-
раметры командной строки, а также по умолчанию DTA. Вспомните, мы переноси-
ли тело вируса в область экрана для того, чтобы не затереть эти параметры при по-
иске файлов.
Каким образом параметры командной строки записываются по этому адресу
и кто или что это делает?
Все эти действия выполняет операционная система, и программисту нет необхо-
димости делать что-либо дополнительно.
Что именно находится по смещению
80h
и какова структура размещения пара-
метров?
Первый байт, расположенный по смещению
80h
, указывает на длину командной
строки. Если файлу никаких параметров не было передано, то этот байт будет ра-
вен нулю. Второй байт, как правило, — пробел (
20h
). За ним идет собственно то,
что мы указали после имени запускаемого файла. Заканчиваются параметры
командной строки символом
0Dh
(код клавиши <Enter>). Для наглядности предста-
вим это в табл. 23.1.
Таблица 23.1. Командная строка
Смещение
Значение
80h
Длина строки
81h
<
Пробел> (20h = 32)
82h
Параметры
?
Символ 0Dh (13)
Допустим, мы запускаем программу SYS.COM таким образом:
SYS.COM C: D:
Тогда по смещению
80h
будет находиться следующее (табл. 23.2).
Глава 23. Область PSP и DTA. Системные переменные (окружение DOS)
227
Таблица 23.2. Данные командной строки
Смещение
Значение
80h
06h
81h
<
Пробел> (20h = 32)
82h
43h 3Ah 20h 44h 3Ah
87h
Символ 0Dh (13)
П
Р И МЕ Ч А Н И Е
43h 3Ah 20h 44h 3Ah
— ASCII-символы "C:_D:" (символ "_" — пробел).
Длина 6 байт устанавливается потому, что система считает пробел, расположен-
ный по адресу
81h
, частью командной строки.
Параметры командной строки можно наблюдать в отладчике. Для этого загрузи-
те программу под отладчиком следующим образом:
afd resid23.com params
где
params
— параметры командной строки (рис. 23.1).
Рис. 23.1. Параметры командной строки в DTA после загрузки программы
23.2. Системные переменные
(окружение MS-DOS)
Системные переменные содержат параметры, устанавливаемые автоматически
при запуске консоли либо вручную с помощью внутренних команд. Пример сис-
темных переменных:
PATH C:\WINDOWS;C:\WINDOWS\COMMAND
COMSPEC=C:\COMMAND.COM
Часть III. Файловая оболочка, вирус, резидент
228
TEMP=C:\TEMP
PROMPT=$P$G
... и прочие.
Системные переменные передаются каждой программе, которая загружается.
Причем не важно, резидент это или обычная программа. Читая данные переменные,
многие программы находят файлы по пути, который содержит переменная
path
. Бо-
лее того, вирусы могут заражать файлы, используя значение этой переменной.
Посмотреть системные переменные можно с помощью внутренней команды
SET
, набрав ее в командной строке. На рис. 23.2 показаны эти переменные под опе-
рационной системой Windows 2000. Изменения системных переменных с помощью
команды
SET
действительны только для текущего сеанса консоли.
Также посмотреть и изменить эти переменные можно следующим способом:
правая кнопка мыши на значке Мой компьютер, далее Свойства | Дополнительно |
Переменные среды | Системные переменные. Изменение переменных в данном
окне сохраняется и действует при следующем сеансе работы в операционной системе.
Эти параметры создает DOS автоматически после загрузки программы в па-
мять, но до передачи ей управления и заносит в сегмент, адрес которого находит-
ся в PSP по смещению
2Ch
, причем смещение всегда равно нулю. Пример чтения
окружения рассмотрим далее. Сейчас разберем, чем оно может помешать нашему
резиденту.
Рис. 23.2. Параметры окружения DOS