e-mail    Debatní kniha    Mapa stránek    Hlavní  
 perličky 
 

Kontrola Master BOOT sektora

Ing. Miroslav Frohlich

Isto sa vám už stalo, že ste zabudli pri resetovaní počítača v zatvorenej mechanike A podozrivú (rozumej nakazenú) disketu. BOOT vírus sa dostal do pamäti a z tade na váš hard disk, do Master Boot sektora. Pri každom novom naťahovaní systému vírus dostáva riadenie a až potom natiahne systém.

Snažil som sa využiť tento princíp bootvírusov proti nim. BOOT vírus je uložený v BOOT sektore diskety. Tento sektor je normálnemu užívatežovi neprístupný. Fyzicky je umiestnený na povrchu 0, stope 0 a prvom sektore. Toto označovanie používa BIOS. V bežnom prípade obsahuje základné informácie o celej diskete, tzv. Bios Parameter Block, identifikáciu programu, pod ktorým bola formátovaná, a hlavne zavádzací kód. Pri systémovej diskete tento zavádzací kód zavádza systém, pri nesystémovej diskete vypíše na obrazovku známu hlášku Non-system disk. Pri resetovaní počítača naťahuje BIOS zo zasunutej diskety BOOT sektor do pamäti na adresu 0000:7C00 a odovzdá mu riadenie, to znamená, že skočí na túto adresu.

MASTER BOOT sektor je uložený podobne ako boot sektor na diskete, ale obsahuje PARTITIONS TABLE - tabužku rozdelenia disku a kód, ktorý podža tabužky rozdelenia zavádza z aktívnej oblasti disku BOOT sektor do pamäti, a ďalej je to ako pri diskete.

Mnou navrhnutý zavadzací kód začne vykonávať takúto činnosť:
Prekopíruje sám seba vyššie do pamäti a potom odovzdá riadenie tejto druhej kópii. Predstaví sa, a natiahne do pamäte Master Boot z disku namiesto svojej prvej kópie.

V ďažšom kroku natiahne nad seba do pamäti prvý datový sektor z materskej diskety. Do tohto sektora sme predtým pomocou Norton Utility uložili Master Boot sektor z disku. (Prečítame ho iba cez položku v menu Absolute Sector a uložíme cez File Mode na prázdnu disketu - tým sa dosiahne uloženie do prvého datového sektora. On síce obsadí jeden cluster čo sú dva sektory, ale to nás nezaujíma.)

Po porovnaní zálohovaného a originálneho Master Boot sektora pri zhode odovzdá riadenie originálnemu Master Boot sektoru, ktorý normálne natiahne systém, ako keby disketa v mechanike A vôbec nebola, čo je hlavné využitie tohto kódu.

V prípade akejkožvek zistenej zmeny program zastaví procesor. Teda nielen pri vírusovej zmene, poškodení, ale aj pri zmene aktívnej oblasti disku, čo je nevýhoda tohto programu. Táto nevýhoda sa však dá odstrániť.

Ďažšie možné vylepšenia
Program by mohol Master Boot sektor aj obnovovať, prípadne pri zmene neobnovovať, len natiahnuť systém tak, že by odovzdal riadenie zálohovanému Master Bootu. Ďalej by mohol zálohovať FAT, ROOT ale aj CMOS na materskú disketu. To by však značne predžžilo kód, takže by sa nezmestil do 512 B a musel by sa doťahovať z diskety. A z perličky by bola vežká perla.

Ešte upozornenie - nepoužívajte začiatok pamäti, kde je tabužka vektorov a datová oblasť BIOSu. Tiež nepoužívajte služby DOSu, lebo ten v pamäti ešte nie je. Samozrejme, že tento program v prostredí operačného systému DOS nie je spustitežný.

A ako dostať hotový program QUARD.COM do BOOT sektora diskety? Ja som to urobil pomocou debuggera SID, ale dá sa to aj pomocou Norton Utilities - prečítanie cez File Mode a zapísanie cez Sector Mode.

;****Macro pre vypis retazcov na obrazovku vyuziva EGA/VGA BIOS napis MACRO text,pocet_znakov,riadok,atribut push ds pop es ;ES=DS mov bp,offset text ;adresa vypisovaneho textu je v ES:BP sub bp,100h ;uprav offset voci ES mov cx,pocet_znakov mov dh,riadok mov dl,3h ;stlpec mov bh,0h ;videopage 0 mov bl,atribut ;farba pozadia,popredia a blikanie mov al,1h ;sposob vypisu s posuvom kurzora mov ah,13h ;podfunkcia 13h int 10h ;vypis retazec ENDM ;****Macro pre citanie disku/diskety pomocou funkcie biosu 13h-2h ;****s osetrenim chyby pristupu na disk obsluha MACRO drive,hlava,stopa,sector,_off,_seg,n_opat,n_ok mov cx,5h ;pocet pokusov o citanie n_opat: xor ax,ax ;AX=0 int 13h ;reset disku mov ax,_seg ;nastav adresu mov es,ax ;pre precitane data,ktore sa mov bx,_off ;ukladaju na adresu ES:BX mov dh,hlava mov dl,drive push cx ;uschovaj CX mov cl,sector mov ch,stopa ;toto plati len pre cislo stopy<=256 mov ah,02h ;citanie mov al,1h ;pocet precitanych sectorov int 13h ;citaj! pop cx ;obnov CX jnb n_ok ;bol si uspesny? loop n_opat ;nie NAPIS error,1Bh,1h,8dh ;vypis error hlt ; a zastav CPU n_ok: nop ENDM KOD SEGMENT BYTE ;tasm /q quard.asm ASSUME CS:KOD ;tlink /t quard.obj ORG 100H ;bude to quard.com .286 ;nezbytne deklaracie zacni: cli ;zakaz prerusenie sub ax,ax ;AX=0 mov ss,ax ;nastav stack mov ax,7bf0h ;SS=0 a SP=7BF0h mov sp,ax sti ;povol prerusenie mov ah,0h ;fcia 0h-nastavenie videomodu mov al,3h ;3-ti videomod int 10h ;nastav 80x25 color-textovy rezim cld sub ax,ax mov ds,ax mov si,7c00h ;vytvori si druhu kopiu vyssie v pamati mov ax,0060h ;od adresy 0060:0000 (prva uz moze byt potom mov es,ax ;prepisana) sub di,di ;kopiruje 100h slov z adresy 0000:7C00 na mov cx,0100h ;adresu 0060:0000 rep movsw ;vytvorenie druhej kopie v pamäti DB 0eah,2Ah,00h,60h,00h ;skoc na druhu kopiu,toto je instrukcia ;jmpf 0060:002A copy2: mov ax,0060h ;adresa tejto instrukcie v druhej kopii ;je 0060:002A mov ds,ax ;nastav DS na zaciatok druhej kopie NAPIS titulok,31h,4h,0eh ;vypis titulok OBSLUHA 80h,0h,0h,1h,7c00h,0000h,a1,a2 ;Cita Master boot ;z disku.Jeho fyzicke par. su hlava=0,stopa=0,sector=1 ;a ulozi ho na adresu 0000:7c00-teda prepise prvu kopiu. NAPIS sprava1,2ah,6h,0fh ;vypis sprava1 OBSLUHA 0h,1h,0h,0fh,0000h,0080h,b1,b2 ;Cita 1 datovy ;sektor na diskete.Na tomto mieste je zalohovany M_BOOT ;z C:jeho fyz.par. su Hlava=1,Stopa=0,Sector=15 ;a ulozi ho na adresu 0080:0000 push ds ;uschovaj DS xor ax,ax ;AX=0 mov ds,ax mov si,7c00h ;porovnava natiahnuty originalny M_BOOT mov ax,0080h ;z jeho natiahnutou zalohou z diskety mov es,ax xor di,di cld mov cx,100h ;bude kontrolovat cely sector 100h slov kontr: cmpsw ;su tam nejake zmeny? jne zmena ;ano!,nepokracuj loop kontr ;dalej porovnvaj pop ds ;obnov DS jmp ok ;bez zmien zmena: pop ds NAPIS sprava3,28h,8h,0fh ;vypis sprava3 stop: hlt ;zastav CPU jmp stop ;pre istotu ok: NAPIS sprava2,1ah,9h,0fh ;vypis sprava2 DB 0eah,00h,7ch,00h,00h ;skok na originálny M_BOOT-jmpf 0000:7C00 ;***********************koniec kodu**dalej su data***************** TITULOK DB 'DISK QUARDIAN 1.0 (c) Copyright 1993 MFsoftware',0dh,0ah ERROR DB 'Chyba pri citani..Halt CPU',0dh,0ah SPRAVA1 DB 'Kontrolujem MASTER BOOT-PARTITIONS TABLE',0DH,0AH SPRAVA2 DB 'MASTER BOOT je bez zmien',0dh,0ah SPRAVA3 DB 'Zistene zmeny v MASTER BOOT...Halt CPU',0DH,0AH VYPLN DB 11 dup(00h) ;dopln subor na 512B-zabera jeden sector ;POZOR! pri manipulacii zo suborom zabera 1cluster ;cluster = n*sector (n=1,2,4..) DB 55h,0AAh ;plus posledne identifikacne slovo KOD ENDS END zacni


Pascal - hlavní
Překladače
Vlastní články
Převzaté články
Věci na stáhnutí
Odkazy k tématu
BP7 buglist
Chyba Run-time 200

BASIC