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

Ochrana CMOS proti zápisu

Jan Souček

Občas se stává, že počítač po resetu vypíše hlášení CMOS checksum failure... a vesele se ,,cucne". Uživatel potom mívá problémy se zpětným nastavením informací, hlavně typu HDD (převážná většina lidí má typ 47). Na takovýchto radostech se podílejí počítačové viry (Civil Defense 1.1) nebo různé programy v cháněném módu po kolizi.

Proti zápisu do CMOS se dost dobře nemůžeme bránit přímo, protože se provádí přes I/O port. Je ale možné čas od času kontrolovat data v CMOS a v případě změny je obnovit. Můj program instaluje vlastní rutinu na přerušení 8, která každých 55 ms provádí kontrolní součet CMOS a porovnává ho se součtem provedeným při startu. V případě změny vrací původní obsah CMOS, vypisuje hlášku a zastavuje procesor. Tento HALT není nutný, stejně dobře by mohl normálně opustit přerušení. Program nechrání volně měnitelné oblasti CMOS -- např. adresu 0f změněnou při opouštění chráněného módu procesoru 286.

Přestože se rutina aktivuje každých 55 ms, nebylo zpomalení na 386SX/25 vůbec patrné. Program kompilujte kompilátory MASM nebo TASM. Výsledný kód musí být linkován do souboru COM, protože program zůstává rezidentní pomocí INT 27h.

RADIX 16 ; program CMP.COM - ochrana CMOS proti zápisu .MODEL TINY cva EQU 040 .286 .CODE ORG 100h start: jmp install old8 dd ? ; původní vektor INT 8 sumca dw ? ; kontrolní součet cmos: db 030 dup(?) ; počáteční obsah CMOS mes: db ' Pokus o zapis' db ' do chranene oblasti CMOS',13d,10d db ' Procesor zastaven $' new21: push ds pusha push cs ; mov ds,cs pop ds mov cx,010 ; začíná se sčítat od adresy 10h xor bx,bx ; obsah CMOS před 10h může být změněn xor ah,ah rug: mov al,cl out 070,al ; adresa jmp $+2 ; zpoždění in al,071 ; přečtení hodnoty z CMOS add bx,ax ; přičtení k kontrolnímu součtu inc cl cmp cl,cva ; sčítá se až do konce CMOS jnz rug cmp bx,sumca ; porovnání součtu s pův.hodnotou jz nic ; je-li stejná => původní int 8 mov cx,010 ; když se liší, je obnoven CMOS xor bx,bx ; z kopie vytvořené při instalaci xor ah,ah lea si,cmos ruf: mov al,cl ; tento kód se podobá předchozímu out 070,al jmp $+2 mov al,[si] out 071,al inc si inc cl cmp cl,cva jnz ruf MOV AH,09 ; vypíše se zpráva lea dx,mes int 021 cli hlt ; a počítač se cucne nic: popa pop ds jmp dword ptr cs:[old8] ; volání pův. int 8 INSTALL:mov cx,010 xor bx,bx xor ah,ah lea si,cmos ru: mov al,cl out 070,al jmp $+2 in al,071 add bx,ax ; výpočet kontrolního součtu mov cs:[si],al ; a kopírování CMOS ; do připraveného prostoru inc si inc cl cmp cl,cva jnz ru mov sumca,bx ; sumca := součet mov ax,03508 int 021 ; současný vektor int 8 mov word ptr [old8],bx ; přemístěn do old8 mov word ptr [old8+2],es mov ax,02508 lea dx,new21 int 021 ; je nastven nový mov ah,09 lea dx,mess int 021 ; výpis lea dx,install ; stay resid. až po label install int 027 ; TSR mess: db 'Ochrana pameti CMOS uspesne' db ' nainstalovana !',0D,0A,'$' END start


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