exploit paylaşım grubumuz: t.me/HTTPwnn

Bootloader Yazma - P1

  • Konu başlatıcı Konu başlatıcı DeadWare
  • Başlangıç Tarihi Başlangıç Tarihi

DeadWare

WarNight Member
Katılım
14 Haz 2026
Mesaj
11
Reaksiyon
18
Puan
3
xentr_thread_starter
EVET yeni seriye basliyorum (aglayin) bootloader yazarken ögrendiklerimi bu seride ogreticem.

baslayalim,

BOOTLOADER NE AMK?!?!?
bootloader, os'yi rame kopyalayip calistirir.

BIOS YUKLENME SURECI
1- Power On

güç düğmesine basiyon ve anakart sinyali aliyo.
Cpu sifirlaniyo, CS:IP (o an çalışan komudun adresini belirten segment:offset çifti) = 0xFFFF:0x0000 (Reset Vector) adresinden calismaya basliyo. bu adres BIOS ROM'una (firmware) yukleniyo.

2- POST (Power On Self Test)
BIOS donanimi test ediyo:

CPU -> temel komutlar
RAM -> hızlı sağlık kontrolü
klavye/ekran/disk denetleyicileri vb. -> var yada yok diye bakiyo

Hata varsa hata mesaji veriyo, yoksa devamke.

3 - BIOS donanimi baslatiyo

PCI/PCIe aygitlarini baslatiyo.
Video BIOS (VGA/GPU) aktif oluyo ve ekran hazirlaniyo.
Disk/Depolama denetleyicilerini (IDE/SATA/NVME) taniyo.

4 - Boot Aygıtı Sırasını Belirliyo
Bios, CMOS'da kayıtlı Boot Orderi okuyo:
örnek: USB -> CD/DVD -> HDD -> NETWORK (PXE)

Her aygıt için Boot Signature (0xAA55) arar.

5 - Ilk Sektorü Okuyo

Aygıtın 0. Sektörünü (LBA 0 veya CHS 0/0/1) okur.

Tam 512 Byte (ne eksik ne fazla, bios 512 byteden fazlasını yuklemez) veriyi 0x0000:0x7C00 adresine yükler.

6 - Imza Kontrolü (0xAA55)

Bios 512 bytenin son 2 bytesini kontrol edio:

511. Byte -> 0x55
512. Byte -> 0xAA

Eşleşmiyosa -> bu aygıt bootable değil diyip sonraki aygita geciyo.

7 - Kontrolü Devreder (Jump)

Imza doğruysa BIOS:

DL registerine sürücü numarasini (0x00 = A:, 0x80 = C:) yukler.

CS:IP = 0x0000:0x7C00 ile kodu çalıştırmaya başlar.


8 - Bootloaderin Çalışması (sonunda amk)

bootloader kodu calistigina gore olacaklar sunlar:

stack kurulcak (SS:IP)
DS/ES segmentleri ayarlancak (genelde 0x7C0)
ek olarak; BIOS kesmeleri (INT 10h, INT 13h) hala kullanilabilir.

SEGMENTLER:

daha onceden bahsetmistim

CS -> code segment
DS -> data segment
ES -> extra segment
SS -> stack segment
FS -> F segment
GS -> G segment

fiziksel adres de şöyle (eski serimi okumussaniz buna da hakimsinizdir)

Offset = segmentten ne kadar uzaga gidicegin.
Örnek:
Segment = başlangıç noktası
Offset = baslangıç noktasına uzaklığın
==============
Segment = 1000h
Offset = 5h
yani 1000h den 5 ileri git.

Fiziksel adres formülü:
fiziksel adres = segment * 16 + offset
Örnek:
Segment = 1000h
Offset = 0020h
Segment x 16 (Segment x 10h) = 1000h x 10h = 10000h, 10000h + 0020h = 10020h. Ve bu bir hex olduğundan çevrilmiş hali 65568 oluyor. Yani ram'in 65568. byte'ine git demek.

Bunu öğrettim cünkü CPU Segment:Offset alır. Azonceki örneğe göre CPU'nun alacağı şey = 1000:0020'dir. Bellekteki konumu 2 parçalı gösterme şekli veya hesaplayarak byte buluyon ikiside ayni sonuc ztn.

BPB - BIOS PARAMETER BLOCK

bu şey BIOS veya OS Loadere "bu diski nasi okucam aq" sorusunun cevabini verio.

Diskin boyutunu, sektör yapısını, FAT tipini (FAT12/16/32) belirtir.
Özellikle 12/16 formatli disk veya usblerden boot ederken onemli cunku windows/linux bu bilgilerle dosya sistemine erisiyor.


BPB'nin icinde NE VAR?

boot sektörünün başlangıçından itibaren (genelde 0x00'dan başlar) şunlar var:

Offset Alan (Bytes) Açıklama
0x00 3 Jump Kodu (EB 3C 90 gibi) – BIOS’u atlayıp boot koduna geçer
0x03 8 OEM Adı (örn: "MSDOS5.0") – Marka bilgisi
0x0B 2 Sektör Boyutu (genelde 512)
0x0D 1 Küme Başına Sektör (genelde 1 veya 4)
0x0E 2 Ayrılmış Sektör Sayısı (Boot sektörü dahil, genelde 1)
0x10 1 FAT Kopya Sayısı (genelde 2)
0x11 2 Kök Dizin Giriş Sayısı (FAT12/16’da 224 veya 512)
0x13 2 Toplam Sektör Sayısı (Disk 65535’ten küçükse burada)
0x15 1 Medya Desktriptörü (0xF0 = Disket, 0xF8 = Sabit Disk)
0x16 2 FAT Başına Sektör Sayısı (Her FAT tablosunun boyutu)
0x18 2 Her İzdeki Sektör Sayısı (CHS hesapları için)
0x1A 2 Kafa Sayısı (CHS hesapları için)
0x1C 4 Gizli Sektör Sayısı (Partition başlangıcından önceki sektörler)
0x20 4 Toplam Sektör Sayısı (Disk 65535’ten büyükse burada)

BPB'nin bootloadere etkisi:


Eğer bootloader diskten dosya okuyacaksa (ikinci aşama loader veya çekirdek yüklicekse), bu değerleri kullancaz:

Root Directory’nin yerini bulmak için:
RootDirLBA = AyrılmışSektörler + (FATKopyaSayısı × FATBoyutu)
Bir dosyanın (örn: KERNEL.BIN) veri alanını bulmak için:
Önce FAT tablosunu okucan, zinciri takip etcen
 
Geri
En Üst