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

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

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

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

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

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

Собейкис В.Г. Азбука хакера 3. Компьютерная вирусология — М.: Майор, 2006. — 512 c.
ISBN 5-98551-013-1
Скачать (прямая ссылка): hakeriazbukahakera2006.djvu
Предыдущая << 1 .. 22 23 24 25 26 27 < 28 > 29 30 31 32 33 34 .. 123 >> Следующая

90
ГЛАВА 3. Сложные СОМ-инфекторы
это расстояние подпрограммы CALL_ME от инструкции, следующей за вызовом:
1А4Н - 327Н - 183Н.
Так как вызов ссылается только на расстояние между текущим ip и
подпрограммой вызова, этот кусок кода можно перемещать в любой офсет, и
он там будет правильно работать. Это называется относительной адресацией.
С другой стороны, у процессоров семейства 80x86 прямой доступ к данным
управляется с помощью абсолютной адресации. Рассмотрим следующий код:
mov dx, OFFSET COM_FILE COM_FILE db ''.COM'.O
Он загрузит регистр dx абсолютным адресом строки COM FILE. Если этот тип
конструкции, будет использован в вирусе, то при изменении офсета система
даст сбой. Как только вирус переместится в офсет, отличный от офсета, в
котором его компилировали, регистр dx больше не будет указывать на строку
"*.СОМ".
Вместо этого он может указывать на инициализационные данные или данные в
программе-жертве, что, соответственно, приведет к их переписыванию и
дальнейшему сбою программы.
Любой вирус, размещенный в конце СОМ-программы, обходит эту трудность с
помощью косвенной адресации к данным. Сначала вам нужно понять, в каком
офсете будет выполняться код. Затем вы сохраняете это значение в
регистре.
Далее, используя этот регистр в комбинации с абсолютным офсетом, вы
получаете доступ к данным. Например, код:
call GET_ADDR ; поместить OFFSET GET_ADDR в стек
GET_ADDR: pop di ;поместить этот офсет в di
sub di.OFFSET GET_ADDR ;вычесть расчетное значение
загружает di значением перестановки, которое может использоваться для
косвенного доступа к данным. Если GET_ADDR находится в той же локации, в
которой была компилирована, то при выполнении вызова di окажется нулевым.
91
Варфоломей Собейкис. АЗБУКА ХАКЕРА-3
С другой стороны, если она передвинется, то значение, помещаемое в стек,
будет рабочей локацией GET_ADDR, а не его ассемблированным значением.
Однако значение, вычтенное из di, будет компилированным значением.
Результат в di - это разница между компилированным и рабочим значениями.
(Прием работает по той причине, что вызов толкает в стек абсолютный адрес
возврата.) Чтобы получить доступ к данным, вы можете использовать
следующий код:
lea dx.fdi+OFFSET COM.FILE]
вместо
mov dx.OFFSET COM_FILE
Или
mov ax, [di+OFFSET WORDVAL]
вместо
mov ax, [WORDVAL]
Другой важный метод для обхода абсолютных данных при перестановки кода
заключается в хранении временных данных в стековом фрейме. Это
универсальная техника в обычных программах, которые создают временные
данные для использования одной подпрограммы в момент ее выполнения.
Чтобы создать стековый фрейм, нам необходимо вычесть желаемое число из
регистра sp (сдвигая стек вниз), а затем применить регистр Ьр для доступа
к данным.
Например, код:
push bp {сохраним старый Ьр
sub sp, 10ОН ;вычтем 256 байтов из sp
mov bp.sp {установим bp = sp
создаст блок данных в 256 байтов, который может свободно использоваться
программой. Закончив работу с данными, программа может очистить стек:
92
ГЛАВА 3. Сложные СОМ-инфекторы
add sp, 10ОН восстановить sp до первоначального значения pop bp
восстановить bp
Данные будут удалены. •
Для адресации к данным в стековом фрейме мы используем регистр Ьр.
Например: mov [Ьр+10Н], ах сохранит ах в байтах ЮН и 11Н в области данных
стека. Сам стек останется функциональным, так как любые данные,
втолкнутые в него, разместятся ниже этой области данных.
Хм! Мне кажется, вы уже устали от теории. Ладно. Начнем создавать простой
паразитический СОМ-инфектор. Логика его действий будет следующей:
1. Мы определяем дельта-офсет.
2. Восстанавливаем оригинальные три байта вирусного файла.
3. Устанавливаем новый адрес DTA.
4. Находим СОМ-файл.
5. Если такового не имеется, перейти к шагу 16.
6. Открываем файл.
7. Читаем его и сохраняем первые три байта программы.
8. Проверяем, не заражена ли программа.
9. Рассчитываем размер прыжка к основному телу вируса.
10. Переходим к началу файла.
11. Записываем прыжок в основное тело вируса.
12. Переходим к концу файла.
13. Прикрепляем тело вируса к концу файла.
14. Закрываем файл.
15. Находим следующий файл, пригодный для инфекции. Возвращаемся к шагу
4.
16. Возвращаем DTA в 80 hex и передаем контроль программе-жертве.
93
Варфоломей Собейкис. АЗБУКА ХАКЕРА-3
Дельта-офсет является вычисленным значением сдвига основного тело вируса,
необходимого для закрепления к концу программы-жертвы. Не забывайте, что
в начальной стадии вирус создает первое поколение, которое должно
адаптироваться в новой среде. Мы пока не инфицируем файл. Основная работа
вируса начнется только после того, как пользователь захочет выполнить
файл, к которому прикрепился инфектор.
Итак, приступим к написанию:
code segment
Директива сегмента определяет параметры для сегмента. В данном случае мы
определяем сегмент кода - то есть весь исполнительный код нашей программы
будет находиться внутри сегмента кода. В более крупных программах нам
Предыдущая << 1 .. 22 23 24 25 26 27 < 28 > 29 30 31 32 33 34 .. 123 >> Следующая