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

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

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

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

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

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

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

придется определять сегменты кода и данных отдельно, но в нашем
коротеньком коде они смешаны в одном куске.
assume cs:code,ds:code
Директива assume соответствует имени сегмента. Мы объявляем, что регистры
сегмента кода и данных ассоциируются с сегментом "кода".
Регистр DS содержит стартовый адрес для блока данных. Регистр IP содержит
офсетный адрес следующей строки выполняемого кода. Офсетный адрес - это
значение расстояния от данной точки к действительному адресу. Регистр CS
остается постоянным, a IP считает линии кода.
org 100h
Эта директива говорит компьютеру, что наш вирус является COM-файлом,
расположенным в 100 hex. Это значение 100 hex является офсетом,
размещенным сразу после PSP.
Значение 100h помещается в IP, говоря компьютеру, откуда начинать работу.
PSP содержит информацию о вашей программе и создается в памяти при
загрузке программы.
start:
db 0e9h,0,0
94
ГЛАВА 3. Сложные СОМ-инфекторы
Перовое, что нам нужно закодировать, - это прыжок нашего вирусного кода.
При первоначальном выполнении вируса мы хотим контролировать первую
строку кода, поэтому мы определяем пустой прыжок. Директива DB (define
byte - определяющий байт) обычно используется в блоке данных вируса и
определяет строки информации.
В данном примере мы определяем инструкцию мануально как "прыжок". На
самом низком уровне, на котором работает компьютерный процессор,
инструкция "jmp" преобразуется компилятором в двоичную форму "11101001".
При кодировании в Ассемблере используется шестнадцатиричная система
исчисления, поэтому мы конвертируем двоичное значение в e9h.
Надеюсь, вы не думаете, что инструкция прыжка останется нулевой, когда
вирус инфицирует программу? Конечно, нет. Когда вирус (назовем его Toad3)
заразит программу, первой инструкцией в коде зараженной программы будет
прыжок к основному телу вируса. Каждый раз, когда вирус инфицирует
программу, первые 3 байта, включая инструкцию прыжка, переписываются с
расчетом на прыжок через жертву к телу вируса.
toad: call bounce
bounce: pop bp
sub bp,OFFSET bounce
Вот он, наш дельта-офсет - одна из важнейших концепций, которую вам нужно
понять. Когда вы компилируете вирус в первый раз, Ассемблер рассчитывает
значения всех офсетов. Когда вирус присоединяется к концу жертву, офсеты,
рассчитанные при компиляции, становятся неправильными. Они не учитывают
сдвига кода в конец программы-жертвы.
Прежде чем мы перейдем к вычислениям дельта-офсета, взгляните на новые
инструкции в этой части кода. Инструкция call вталкивает IP в стек. На
первых порах стек можно рассматривать как временную локацию памяти,
которая используется для
95
Варфоломей Собейкис. АЗБУКА ХАКЕРА-3
хранения таких вещей, как IP (адрес следующей инструкции) во время
"вызова".
Термин "втолкнуть" означает, что данные перемещаются в стек.
Противоположностью для "вталкивания" (push) является "выталкивание"
(pop). Инструкция pop перемещает данные, втолкнутые в стек, в указанное
место назначения.
Итак, инструкция call вталкивает IP (адрес следующей инструкции) в стек.
Затем мы выталкиваем этот адрес в Ьр. Далее, из значения в Ьр нам нужно
вычесть оригинальный офсет прыжка (который определяется при первой
компиляции вируса).
Base Pointer - указатель базы - это 16-битный регистр, используемый для
хранения некоторых параметров (в нашем случае, дельта-офсета). Все
офсетные адреса в теле вируса требуют добавления к ним Значения в Ьр. Как
уже говорилось ранее, в первом поколении вируса дельта-офсет (или Ьр)
будет нулевым.
first_three: mov сх,3
lea si,[bp+OFFSET thrbyte] mov di,100h push di rep movsb
Подпрограмма firstthree (первые_три) записывает оригинальные три байта
жертвы назад в свою первоначальную локацию 100 hex в начале программы.
Инструкция Load Effective Address {загрузка эффективного адреса) нам уже
известна. Но что означают квадратные скобки? Они определяют индекс и
велят процессору использовать комбинированное содержание выражения,
указанного в скобках, как один офсетный адрес. Мы используем дельта-офсет
в регистре Ьр в первый раз. А что у нас тут за странная штучка "rep
movsb"?
Rep означает инструкцию "repeat" (повторить).
сх загружается столько раз, сколько укажет инструкция повтора.
96
ГЛАВА 3. Сложные СОМ-инфекторы
В нашем случае инструкция повторит три "movsb" (moves bytes - перемещение
байтов) раза.
В регистр индекса источника si (Source Index) загружается адрес байтов,
которые мы хотим передвинуть, а в регистр индекса назначения di
(Destination Index) загружается адрес локации, куда мы хотим передвинуть
байты.
Мы снова используем инструкцию "push" и вталкиваем локацию di (100 hex) в
стек, чтобы позже применить ее в вирусе (в подпрограмме bug_out).
Эту подпрограмму можно записать иначе:
first_three:
lea si,[bp+OFFSETthrbyte]
mov di,100h
push di
movsw
movsb
Разница в том, что здесь мы больше не повторяем байтовые передвижения.
Вместо этого мы перемещаем 3 байта с помощью "movsw" (moves word -
Предыдущая << 1 .. 23 24 25 26 27 28 < 29 > 30 31 32 33 34 35 .. 123 >> Следующая