Boot/Mbr Virusleri hakkında
Boot, MBR, Fat16 ve Fat32

Boot/mbr virusleri ile ilgili bazı temel sayılabilecek bilgiler:
Burada virus konusunun yanısıra, sistem programlama konusunda da birşeyler yazıyorum.Daha doğrusu, bir boot virusu yazarken nelere dikkat etmek gerekir bunlardan bahsetmek istiyorum.

Boot/mbr virusleri daha once de belirttiğim gibi işletim sisteminden once yuklenirler. Ortada DOS olmadığına gore virus yuklenme esnasında BIOS ile muhatap olmalıdır. Once bilgisayarın sistemi nasıl başlattığını hatırlayalım;

Bilgisayarın elektrik duğmesine bastığımızda, ilk olarak BIOS programı FFFF:0000 adresine kopyalanır ve bu adresteki program calıştırılır.Bu program POST(Power on self test) uygular ve setup ayarlarını gozonunde tutarak işletim sistemi tutabilecek disk(et)lerin Side 0, Track 0, Sektor 1 bolgesindeki kodu 0000:7C00 adresine okumaya calışır.Eğer okunan kod bir sabit diske ait ise 0000:7DFE adresinde AA55 imzası aranır.(512 byte = 200 hex ve de imza konumu 510.cu byte = 1FE ise 7C00+1FE=7DFE). Bu imza gecerli bir partition imzasıdır ve bu imzayı taşımayan acılış kayıtlarından sistem boot edilmez. Disketlerde bu imza aranmaz. Cunku disketlerde partition diye bir olay yoktur. Buna rağmen, butun disketlerin boot sektorlerinde bu imzayla karşılaşılır. Artık butun olay okunan programdadır.

Virusun işi genel olarak disk(et)ler ile olduğu icin bu konuya girmeden once track, sector ve head terimlerini hatırlayıp, BIOS'un disklerle nasıl muamele ettiğine bakalım;

Butun disklerde sabit sayıda sektor (Sector), İz veya silindir (Track veya Cylinder) ve kafa/yuz (Head veya Side) bulunur.Kafa (head) deyimi ile diskin okuma/yazma kafaları ifade edilir.İzler (Track) ise her okuma kafasının gorduğu yuzeyde, disk merkezinden dış yuzeye doğru ilerleyen dairesel oluşumlardır.Sektorler, ise izlerin belli sayıya dilimlenmesi ile oluşan parcacıklardır ve her sektor uzerinde sabit olmamakla birlikte genelde 512 baytlık veri alanı bulunur.Burada bahsettiğim tum sektor ve izler mantıksal olarak oluşturulmuştur.

Buna gore;

Sektorler : 1'den nSektor Sayısı'na kadar
İzler : 1'den nTrack Sayısı'na kadar
Kafalar : 1'den nKafa Sayısı'na kadardır.

Disk Boyutu=nKafa x nTrack x nSektor x 512 bayttır (burada her sektoru 512 byte veri kapasitesiyle formatlanmış olduğunu varsayıyoruz) ve 13h no'lu BIOS interruptı ile diskin her yerine erişilebilir. Tabi burada Int 13 sınırlamalarını da gozonunde tutmak lazım.

INT 13h ile aşağıdaki formatta erişim sağlanır.

Ah=2 ise Sektor oku 3 ise sektor yaz
Al= Okunacak veya yazılacak toplam sektor sayısı
Ch=İşlem yapılacak Track no
Cl=İşlemin başlayacağı sektor no
Dh=İşlemin yapılacağı kafa no
Dl=İşlemin yapılacağı surucu no (A surucusu 0, 1.ci harddisk=80h)
ES:BX=Okuma/yazma işleminin yapılacağı bellek adresi

Int 13h sonrasında işlemin doğru olarak yapılıp yapılamadığı CarryFlag ile kontrol edilir.Hata varsa kada kodu Al yazmacında geriye donecektir.Int 13 işlemlerinde en sık karşılaşılan hataların başında surucude disk olmaması (80h) ve yeni takılan disketlerde karşılaşılan disk değişim hattı (6) hatalarıdır.

Şimdi de bilgisayar resetlendiğinde veya acıldığında neler yapılıyor bunlara bakalım.

Bilgisayarı actığımızda BIOS once kendi icsel testini gercekleştirir.Testin bitimi ile BIOS parametrelerinde ilk bootable surucu olarak gosterilen surucuden bilgisayar boot edilmeye başlanır.BIOS bu surucunun Kafa 0, Track 0, Sector 1 bolgesini okumaya calışır.

Hatırlatma : Bu bolge disketlerde BootSektor, harddisklerde Master boot record (veya partition table) adını alır.Ancak BootSektor ve MBR yapı olarak farklıdır.MBR aynı anda birden cok disk bolumune ait bilgiler icerir ve bunlardan birinden makinayı acabilir.Disketlerdeki boot sektor yapısı hard-disklerin her partitionunun başında yer alır.

Master Boot Record

Master boot record aşağıdaki yapıdadır.

Ofset Uzunluk Acıklama
000h 466 bayt Calıştırılabilir kod
1BEh 16 bayt 1.ci partition girişi
1CEh 16 bayt 2.ci partition girişi
1DEh 16 bayt 3.cu partition girişi
1EEh 16 bayt 4.cu partition girişi

Partiton table, MBR'un 1BE ofsetinden itibaren 4 adet olarak bulunur.

Ofset Uzunluk Acıklama
0 Byte Boot Indikatoru : 0->Sistemi boot edemez, 80h->Boot edebilir
1 Byte Disk bolumununun başladığı kafa no
2 Word Disk bolumununun başladığı track+sektor no (Acıklama icin aşağı bakın)
4

Byte

Sistem indikatoru;
01 FAT12
04 FAT16 (Disk32Mb)
0B FAT32
5 Byte Disk bolumununun bittiği kafa no
6 Byte Disk bolumununun bittiği sektor no
7 Byte Disk bolumununun bittiği track no
8 Dword Disk bolumundeki kullanılabilir blok adeti
0C Dword Disk bolumundeki toplam blok adeti

*: Bu alan, ilk bakışta sanki sector+track gibi gorunse de bu alan şu şekilde değerlendirilir;

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
Track bitleri 7-0 Track bitleri 9-8 Sektor bitleri 5-0

Buna gore aktif olan partitionun gosterdiği alandaki boot sektor okunur ve sistem boot edilir.Boot sektor ise aşağıdaki formattadır (Bunları sırayla FAT16 ve FAT32 icin yazdım).

Boot Sektor

Ofset Uzunluk Acıklama
00h 3 byte Calıştırılabilir koda atlama (JMP xxxx)
03h 8 byte OEM adı (ve version no)
0bh 1 word Sektor başına duşen byte
0dh 1 byte Her cluster'daki sektor sayısı (FAT'teki birim kayıtın kac sektor olduğu)
0eh 1 word Ayrılmış sektor sayısı
10h 1 byte Disketteki FAT adeti (genelde 1'i yedek olmak uzere 2 tane)
11h 1 word Disketteki ana dizinde bulunabilecek en fazla dosya giriş sayısı
(Fat32 icin anlamsız)
13h 1 word Diskteki toplam sektor sayısı (Disk 32Mb den buyuk ise 0)
(Fat32 icin anlamsız)
15h 1 byte Media Descriptor (Disk tipi belirteci-HDler icin F8h)
16h 1 word FAT'ın sektor olarak uzunluğu
(Fat32 icin anlamsız)
18h 1 word Track başına duşen sektor sayısı (DOS 3 ve sonrası)
1ah 1 word Yuz sayısı (DOS 3 ve sonrası)
1ch 1 dword Gizli sektorlerin sayısı (DOS 3 ve sonrası)
20h 1 dword Ofset 13h=0 ise partitiondaki sektor sayısı (DOS 4.0 ve sonrası)

Bu noktadan sonra FAT 16 icin ;

24h 1 byte Fiziksel surucu no (DOS 4.0 ve sonrası)
25h 1 byte Ayrılmış (DOS 4.0 ve sonrası)
26h 1 byte İmza=29h (DOS 4.0 ve sonrası)
27h 1 dword Disk seri no (DOS 4.0 ve sonrası)
2bh 11 byte Disketin adı (DOS 4.0 ve sonrası)
36h 8 byte FAT turu icin ayrılmış (DOS 4.0 ve sonrası)

FAT32 icin ise;

24h 1 dword FAT başına duşen sektor adeti
28h 1 word İşaretler
0-4 bitler aktif FAT kopyasını gosterir
7.ci bit FAT mirroring olayının acık veya kapalı olduğunu gosterir
2ah 1 word FAT32 surucusunun surum numarası
2ch 1 dword Root dizinin başladığı cluster numarası
30h 1 word Dosya sistemi bilgisinin sektor numarası
32h 1 word Yedek boot sektorun sektor numarası
34h 12 byte Ayrılmış
40h 1 byte Partitionun mantıksal surucu numarası
41h 1 byte Kullanılmıyor.
42h 1 byte İmza=29h
43h 1 dword Partitionun seri numarası
47h 11 byte Partitionun adı (volume label olayı)
52h 8 byte FAT adı (FAT32)

Bu noktadan sonra calıştırılacak olan boot kodu yer alacaktır.

Boot sektorde parametre bloğundan once yer alan JMP komutu 3 bayttır.Burada EB xx gibi 2 byte'lık komut varken 3 byte'lık yer ayrılmış olması ilk başta anormal gelebilir.Unutmayın ki boot sektor 512 byte uzunluğundadır.Eğer başlama kodu EB xx ile ifade edilebilecek bir alanın dışındaysa yani giriş noktası 256.cı bayttan daha uzak bir noktadaysa bu takdirde EBxx komutu kullanılamayacak, bunun yerine 3 byte'lık E9 yy xx komutu kullanılacaktır.Bilmem anlatabildim mi ?

Bu bilgilerden sonra MBR ve Boot'un ne olduğu şekillendi sanırım.Buna gore ilk yapılacak şey boot veya mbr kodunu guvenli bir yerde saklayıp, virus kodunu boot veya mbr uzerine yazmaktır.Daha sonraki işler bir virusun yapması gereken klasik işlemlerden ibarettir.

Virus kodu yuklendiğinde kendini bellek icerisinde guvenli bir yere aktarmalı, orjinal boot/mbr kodunu 0000:7C00h adresine yukleyerek sistemin işleyişine devam etmesi sağlanmalıdır.

Bir Boot/MBR virusu yazılırken gozonude tutulması gereken birkac onemli nokta:

* MBR icindeki bolumleme tablosuna (Partition table - MBR'un 1BE ofsetinden başlar) KESİNLİKLE dokunulmamalıdır.

* Bilgisayar boot edilirken ilk başta SS:SP tanımlanmamıştır.Bu yuzden SS:SP değeri belirlenmelidir (Pekcok boot/mbr virusu SS:SP=0000:0700h olarak tanımlar, boylece stack alanının bellekteki boot programının hemen altında olmasını sağlar).

* Disk utilitylerinin boot/mbr alanını okumaya calışması durumu gozonunde bulundurulmalıdır.Bu durumda utility orjinal boot/mbr kaydına yonlendirilmeli, boylece virusun farkedilmesi engellenmelidir.

* Orjinal boot/mbr kaydı cok guvenli bir bolgeye yedeklenmelidir.Eğer bu kayıt gocerse sistemi başlatmak mumkun olmayacaktır. Orjinal boot/mbr kaydının saklanması icin birkac yol vardır.

1- MBR ve ilk partition arasındak boş alan: Burada virusun ihtiyac duyabileceğinin cok daha fazlası bir boş alan mevcuttur ve bu alana hicbir program dokunmaz.

2- FAT'ın değiştirilmesi : Virus orjinal boot/mbr kaydı icin kullanacağı alanı bad block olarak işaretleyerek bu alanı koruyabilir.

3- ROOT'un sonu : Virus, orjinal boot kaydını root dizinin sonuna yazabilir.Kullanımdaki dosya bilgilerin silinme riski vardır.
__________________