Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf
Добавлен: 16.02.2019
Просмотров: 29226
Скачиваний: 1689
Часть III. Файловая оболочка, вирус, резидент
134
Листинг 13.8. Другой пример использования оператора movs
...
mov cx,5 ;количество пересылаемых слов (два байта)
mov si,offset Str1 ;откуда будем брать
mov di,offset Str2 ;куда копировать
rep movsw ;пересылаем пословно (по два байта), т. к. movsw.
;Теперь Str1 = Str2
...
Str1 db '0123456789'
Str2 db '9876543210'
...
Рис. 13.3. Результат выполнения команды movs
13.4. Передача управления программе,
расположенной в другом сегменте
Итак, теперь код нашего вируса расположен в двух местах в памяти:
сразу за "программой-жертвой";
в области 7-й страницы (
0BF00:0100h
).
Нам осталось "прыгнуть" на адрес
0BF00:ip
. Как известно,
cs:ip
всегда показы-
вают текущую операцию (адрес текущей операции). Обратите внимание, как мы
"прыгаем":
jmp dword ptr cs:[Off_move]
Глава 13. Поиск и считывание файлов: вирус
135
Посмотрите, что содержит переменная
Off_move
, а также посмотрите в отладчи-
ке, что будет происходить с регистрами
cs:ip
.
Остается только добавить, что, начиная с метки
Lab_jmp
, наша программа рабо-
тает уже в области 7-й видеостраницы. На рис. 13.4 показано окно отладчика AFD
с программой virus13.com после выполнения приведенной выше команды.
Рис. 13.4. Virus13.com в двух местах памяти
13.5. Поиск файлов
Установим DTA в область 7-й видеостраницы со смещения 0. Сюда будет запи-
сываться информация о найденных файлах для заражения. Теперь можно попробо-
вать найти первый файл с расширением COM в текущем каталоге. Для этого ис-
пользуется функция
4Eh
прерывания
21h
(табл. 13.4).
Таблица 13.4. Функция
4Eh
прерывания
21h
: поиск первого файла/каталога
Вход
Выход
ah = 4Eh
cx
= атрибуты для поиска файла: у нас — 0
(обычные, не read-only и hidden!)
ds:dx
= маска для поиска.
Например:
*.*
*.exe
comm???.c??
c:\*.asm
cf = 1
: нет такого файла (или ошибка)
cf = 0: DTA
заполняется информацией
о найденном файле
Часть III. Файловая оболочка, вирус, резидент
136
cf
— это флаг переноса. Если мы пишем
cf=1
, то это значит, что флаг переноса
установлен (равен 1), а если
cf=0
, то сброшен (равен 0). Флаг переноса использует-
ся DOS, как правило, для индикации ошибки после выполнения функции. В данном
случае, если функция
4Eh
установила флаг переноса, то это значит, что файлы,
удовлетворяющие условию (маске поиска), не были найдены. Если флаг переноса
сброшен (равен нулю), то в DTA заносится информация о файле. Ее мы рассмот-
рим в последующих главах. Если же
cf=0
(сброшен флаг переноса), то с найден-
ным файлом можно выполнить какие-либо действия.
Для того чтобы найти последующие файлы, удовлетворяющие нашему условию
(маске поиска), необходимо воспользоваться функцией
4Fh
прерывания
21h
(табл. 13.5).
Таблица 13.5. Функция
4Fh
прерывания
21h
:
поиск следующих файлов/каталогов
Вход
Выход
ah = 4Fh
cx
= атрибуты для поиска файла: у нас — 0
(обычные, не read-only и hidden!)
ds:dx
= маска для поиска (как у функции 4Eh)
cf = 1
: нет больше файлов, удовле-
творяющих условию (маске поиска)
cf = 0: DTA
заполняется информацией
о найденном файле
Как видите, функция
4Fh
прерывания
21h
аналогична функции
4Eh
.
Обращаем ваше внимание, что вирус у нас пока неработоспособный. То есть он
ничего не заражает вообще! Можете спокойно его ассемблировать и запускать.
Однако на экране ничего не будет отображено в процессе работы программы.
Лучше ее сразу смотреть под отладчиком.
Дальше все просто! В файле-приложении вполне достаточно описаний для того,
чтобы понять принцип работы программы.
Глава 14
Вывод окна в центре экрана
Эта глава довольно-таки сложная и, возможно, покажется вам не совсем инте-
ресной. Но то, что мы будем в ней рассматривать, очень важно. Вам придется
вспомнить основы математики и немного подумать. Да-да, уважаемые читатели!
Чтобы писать программы на ассемблере, нужно иметь хотя бы элементарные зна-
ния по математике и способность мыслить математически. Однако не волнуйтесь.
Большую часть работы мы для вас сделали, а именно: продумали алгоритм вывода
любого окна в центр экрана. Вам осталось только внимательно с ним ознакомиться
и разобраться.
Очень внимательно изучите данную главу и прилагаемый к ней файл
sshell14.asm!
Теперь давайте договоримся о некоторых определениях. Так как программа
у нас будет большая, то для облегчения ее понимания и поиска необходимой про-
цедуры будем указывать в скобках название самой процедуры и файла, где нужно
искать то, о чем мы вас попросим. Например: "... Затем мы удаляем файл
(
Delete_file
, files.asm)...".
Здесь
Delete_file
— процедура, которая удаляет файл, а files.asm — файл,
в котором нужно ее искать.
14.1. Модели памяти
14.1.1. Почему мы пишем только файлы типа COM?
Потому, что модель памяти Windows (FLAT) очень похожа на модель памяти
COM-файлов, которые мы сейчас рассматриваем (TINY).
14.1.2. Что такое модель памяти
и какие модели бывают?
Модель памяти определяет структуру и способ расположения кода и данных
программы. Модели памяти могут быть следующими:
TINY — "крошечная" модель, где код программы, ее данные и стек располага-
ются в одном сегменте, при этом используется 16-битная адресация (т. е. размер
Часть III. Файловая оболочка, вирус, резидент
138
программы не может превышать 64 Кбайт). Эта модель памяти используется
в файлах типа COM, она компактна и очень удобна для написания небольших
программ на ассемблере (например, резидентов). Все предыдущие наши приме-
ры имеют именно такую модель памяти;
SMALL — "маленькая" модель, где код размещается в одном сегменте, а дан-
ные и стек — в другом;
COMPACT — "компактная" модель, где код программы размещается в одном
сегменте, а данные могут занимать один сегмент и более. В этом случае обра-
щение к данным происходит с указанием сегмента и смещения;
MEDIUM — "средняя" модель, где код размещается в нескольких сегментах,
а данные — в одном. Следовательно, к данным можно обращаться, используя
только смещение, а к коду (вызов подпрограмм, безусловные переходы и т. п.) —
не только смещение, но и сегмент;
LARGE и HUGE — "большая" и "огромная" модели, где и код, и данные могут
занимать несколько сегментов;
FLAT — "плоская" модель, где код, данные и стек размещаются в одном сег-
менте (как и в модели TINY), но при этом используется 32-битная адресация.
Таким образом, один сегмент может иметь размер до 4 294 967 296 байт (до
4 Гбайт). Подобная модель используется, как правило, в программах, написан-
ных под Windows.
Модель памяти задается директивой
.model
. Приведенная в листинге 14.1 про-
грамма типа COM оформлена с использованием этой директивы.
Листинг 14.1. Использование директивы .model
;Указываем программе-ассемблеру тип модели памяти (TINY).
;Директиву ASSUME в таком случае можно опустить.
.model TINY
csEG segment ;Однако имя сегмента и счетчик (ORG) задаются.
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
ret
Message db 'Hello, world!$'
;Данные и стек расположены в том же сегменте, что и код. Вершина стека
;изначально равна 0FFFEh того сегмента, куда загрузилась программа.
CSEG ends
end Begin