Файл: О.А.Калашников. Ассемблер Это Просто. Учимся программировать.pdf

ВУЗ: Не указан

Категория: Книга

Дисциплина: Программирование

Добавлен: 16.02.2019

Просмотров: 29226

Скачиваний: 1689

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
background image

 

Часть 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] 


background image

Глава 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 

заполняется информацией  

о найденном файле 


background image

 

Часть 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

Обращаем ваше внимание, что вирус у нас пока неработоспособный. То есть он 

ничего  не  заражает  вообще!  Можете  спокойно  его  ассемблировать  и  запускать. 
Однако  на  экране  ничего  не  будет  отображено  в  процессе  работы  программы. 
Лучше ее сразу смотреть под отладчиком. 

Дальше все просто! В файле-приложении вполне достаточно описаний для того, 

чтобы понять принцип работы программы. 

 


background image

 

 

 

Глава 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-битная адресация (т. е. размер 


background image

 

Часть 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