Архив статей
Обновление: 24.05.2014
Всего статей: 17


Ремонт и сервис
Обновление: 01.05.2014
Документов: 8


Программирование
Обновление: 18.04.2014
Разделов: 2


Скачать
Общий объём: 4.3 Mb
Файлов: 12


ICQ: 680172615
rumit-71@mail.ru

Наши новости
24.05.2014 Полность переработано содержимое и обновлён интерфейс сайта
01.05.2014 Добавлены статьи в разделы "Ремонт и сервис", "Железо"
01.05.2014 Добавлены несколько нужных программы для бесплатного пользования
Хачим BIOS. (AWARD)

Если ЦП - это сердце компьютера, то BIOS - его душа!!! Прошивка определяет всё... Для наглядности я взял свою прошиву BIOS (P4M8M10E.bin), на которой и буду проводить все эксперементы.

Как устроен BIOS?
...он состоит из двух главных частей:

1) Основная часть кода.
Главный код состоит из нескольких «модулей» и хранится в запакованном виде, как архив-LHA. Для просмотра и упаковки изменённых (в процессе HACK'а) модулей, рекомендую использовать утилиту CBROM. После запуска утилиты вводим название прошивки и получаем список модулей и вес каждого из них.

2) BootBlock (BB).
ВВ - инициализирует регистры чипсета и распаковывает главную часть в ОЗУ для последующего исполнения. При несовпадении контрольной суммы биоса (Bios check-summ error), бут-блок запускает программу аварийного восстановления с флопа, в виде запуска программы awdflash.exe вшитого в прошивку! Boot-block находится в прошивке в незапакованном виде.

Запустим CBROM и введём имя прошивки. Ух ты, сколько всего!

CBROM за работой

- p4m8m10e.bin – главная часть (всегда размером 128k). Именно в ней происходит вся инициализация компьютера, в ней же подпрограмма BIOS Setup.

- awardext.rom – это "расширение" основного кода BIOS, которое инициализирует оборудование на финальной стадии загрузки (детектирует харды и приводы, выводит таблицу PnP/PCI устройств и т.д.). В модуле awardeyt.rom содержится его продолжение.

- ACPITBL.BIN – здесь содержится таблица ACPI (интерфейс питания и конфигуации). ACPI - это не простой менеджер питания, а еще и главная шина, управляющая всеми устройствами и распределяющая системные ресурсы (прерывания). Модификация этой таблицы открывает большие возможности, однако это тема для отдельного разговора.

- AwardBmp.bmp – «картинка» Energy Star. Во времена динозавров производители использовали картинки формата *.epa, теперь-же - это простой BMP с размерами 136 на 84px, и весом не более 1742 байт. Меняй на что-хош и любуйся! Можно использовать спец-утилиту для замены лого - BMPtoEPA.

- _EN_CODE.BIN - набор текстовых ASCIIZ-строк, используемых BIOS'ом. Вот где можно развернуться начинающим хакерам!

- _ITEM.BIN - набор микрокодов для поддерживаемых BIOS'ом моделей процессоров. Микрокоды предназначены для исправления ошибок, допущенных при разработке процев. При желании можно скачать свежую версию микрокодов с сайта производителя и залить их в BIOS.

- P4M1623.ROM - как видно из названия (VGA ROM[1]), это поддержка интегрированного видео (драва и всё прочее). Если интегрированное видео отсутствует, то этот модуль не включают в прошивку.

- 8233LAN.bin - как и предыдущее, только для встроенной сети.

- awdflash.exe - вшитая утилита для автоматического восстановления при сбое.

Вот, вобщем-то и всё содержимое BIOS'а. Названия модулей могут меняться производителем, но по названию всегда можно догадаться о его функции.

Как видно, просто редактировать биос нельзя, т.к. это архив. Если мы хотим что-то изменить, сначала надо распаковать нужный модуль, исправить что нужно, и потом запаковать обратно! Проблеммы могут возникнуть с контрольными суммами изменённых модулей, поэтому при изменении содержимого нужно строго придерживаться оригинальных размеров данных.


Как будем хачить?
Для экспериментов нам потребуется материнская плата с FLASH-BIOS'ом на борту.

Внимание!!!
Чтобы не запороть оригинальный BIOS, желательно найти идентичный чип (снять с дохлой материнки) и проводить эксперементы на нём, что позволит при неудачных попытках восстановить работоспособность, путём замены на оригинал.

Приведу описание процесса редактирования:

1) Дампим свою или скачиваем с сайта производителя свежую версию прошивки.

2) Выключаем комп и вынимаем м/с BIOS'а из панельки. Нам нужно закрепить на м/с "рычаг", за который будем тянуть, чтоб вытащить её из (!)включённой матери. Для этого обвязываем чип нитками между выводами, оставляя сверху небольшое кольцо. Теперь, если взять за это колечко, м/с должна качаться как на качелях...

3) Вставляем (не плотно) обвязанный нитками чип на место и включаем машину. После запуска системы не выключая компьютера(!) аккуратно тянем за нитки и вынимаем оригинальный чип! Машина продолжает работать, т.к. BIOS считывается только при загрузки системы.

4) Далее, вставляем чип, над которым будем экспериментировать, и запустив прошивальщик заливаем хакнутую прошивку в BIOS. Теперь, случись вдруг чего, мы всегда сможем вернуть оригинальный чип на место, и исправив ошибку перешить экспериментальный BIOS вновь.

Для более продвинутых есть ещё один способ - повесить дополнительную м/с BIOS'а, по принципу Dual-Bios. В схему материнской платы вносятся небольшие изменения, в виде установки тумблера по питанию, 2-х эмиттерных повторителей и непосредственно самой Flash-ROM. Это позволяет нам создать Dual-Bios своими руками, один из чипов которого мы можем использовать для эксперементов:

Схема DUAL-BIOS'a

Итак - инструментарий:

1) Утилита CBROM (только для AWARD). Она позволяет нам просматривать содержимое прошивки и упаковывать хакнутые модули обратно с подсчётом контрольной суммы (CRC).

2) Дизассемблер (конечно-же IDA). На начальных этапах может и непонадобится, т.к. с первого раза несоветую изменять программый код "критических" модулей,...достаточно будет изменить логотип или вывести надпись на экран.

3) Любой HEX-редактор (я использую WinHex). Он нам понадобиться для просмотра и редактирования программного кода модулей.

4) Тотал-CMD для работы с архивами LHA.

С инструментами - разобрались! Едем дальше... Как было сказано выше, AWARD-BIOS состоит из модулей, запакованных LHA-архиватором. Так как-же найти начало и конец архива в прошивке, чтоб отделить один модуль от другого? Оказалось, что очень просто.. - по его сигнатуре! На форуме ROM.BY описан подобный метод. Применим его...

Архив-LHA имеет сигнатуру "LH5", поэтому всё что нам нужно - это открыть файл-прошивки-BIOS в WinHex и запустить поиск (Ctrl+F), где в качестве ключевых слов забить - "LH5". Оп-па, есть такой...

Поиск начала архива

...отделяем от первого символа три знака влево - это и будет начало архива!!! За сигнатурой следует имя архива, указанное в виде ASCII-строк (p4m8m10e.bin). Записываем адрес начала архива (00010000) и продолжаем поиск, для чего жмём в WinHex клавишу [F3].

Поиск конца архива LHA

..нашёлся ещё один по адресу (00023830 - awardext.rom). Архивы идут подряд, один за другим. Значит, где начинается второй, там заканчивается первый! Выделяем и копируем в буфер область с 10000 до 2382E, и создаём новый файл из буфера [Ctrl+Shift+N]. Далее жмём "Сохранить как..", и выбираем расширение *.LHA. Теперь осталось распаковать архив в "тотале", и перед нами содержимое архива, которое мы можем править...

Остальные модули распаковываются так-же..., но как уже говорилось, Boot-Block лежит в незапакованном виде и находится он в самом конце прошивки. Между концом (не в привычном нам понимании) последнего архива и началом бут-блокa имеется свободное пространство в виде заполненных 00 или FF. В моей прошивке бут-блок начинается с адреса 7E000 и заканчивается 7FFFF. Как видите, всё очень просто!

Начало BOOT-блока


Добавляем свой модуль в прошивку
Теперь, когда мы знаем структуру BIOS'а, попробуем добавить к уже существующим, свой модуль. Проще всего добавить ISA-ROM модуль, который при загрузке компьютера будет выводить приветствие на экран, и ждать ввода пароля (ENTER - начать ввод заново)... что-то вроде дополнительной парольной защиты, которую без выдирания BIOS'а никто не взломает!

Обычно такие модули используются для управления интегрированными ISA-контроллерами. Разумеется, что никакого ISA-контроллера у нас нет, а ISA-слоты давно исчезли,...но ISA-модули по-прежнему поддерживаются BIOS'ом.

По идеи, ISA-модуль загружается после того, как отработает главный модуль -p4m8m10e.bin, что позволяет ему получить полный доступ ко всему оборудованию, в том числе и PCI-шине. При желании, можно добавить и PCI-модуль, только это слишком-уж геморно. Потребуется подделать идентификатор PCI-устройства в заголовке модуля так, чтобы он совпадал с идентификатором реально существующего устройства, подобно модулю 8233LAN.BIN в эксперементальной прошивке.

ISA модуль представляет собой бинарный файл размером, кратным 200h байт (200h=512d). Часть оборудования (ОЗУ, клавиатура, видеокарта) к моменту его вызова уже инициализирована, а часть (жесткие диски, например) - еще нет. Этим модулем можно смело дёргать прерывания INT 10h (видео) и INT 16h (клава), а вот с INT 13h (диски) - ничё не получится!!!

Структура модуля

В начале расположен стандартный, загрузочный 55 AA-заголовок, а в последнем байте хранится контрольная сумма (CRC). Простейший ISA-ROM модуль, написанный на FASM'е, выглядит так... (копируем код в блокнот и сохраняем как *.ASM).

Программа выводит текст на экран, и ждёт набора с клавиатуры заданных символов, ...ENTER мотает цикл:

; ISAOEM.ASM
use16           ; ISA-модуль работает в 16-разрядном сегменте
DB 55h, AAh     ; загрузочная сигнатура
DB 01h          ; размер блока в 200h байтовых секторах
jmp x_code      ; передача управления нашему коду

x_code:
; подготовка регистров
; --------------------
MOV DX, 101Dh   ; куда выводить инфу (DH - ось Y, DL - ось X)
MOV SI, text    ; что выводить
XOR BX,BX       ; начальный цвет символов - 1
MOV CX,1        ; выводим по одному символу

; вывод строки в цвете
; --------------------
print_string:
MOV AH, 02h     ; функция управления курсором
INT 10h         ; дёргаем прерывание, позиционируем курсор
INC DL          ; перемещаемся на следующую позицию

LODSB           ; загружаем очередной символ
TEST AL,AL      ; конец строки???
JZ input        ; если конец, то выходим

MOV AH, 09h     ; функция печати символа
INC BL          ; перебираем все цвета
INT 10h         ; печатаем символ
JMP print_string ;мотаем цикл

; ожидание ввода пароля
; ---------------------
input:
XOR DX,DX       ; контрольная сумма
enters:
XOR AX,AX       ; функция чтения символа с клавиатуры
INT 16h         ; читаем символ
CMP AL,0Dh      ; это ENTER???
JZ input        ; если ENTER, начинаем ввод сначала
XOR AH,AH       ; очистить скан-код
ADD DX,AX       ; считаем контрольную сумму
CMP DX, 'r' + 'u' + 'm' + 'i' + 't' ;загоняем пароль
JNZ enters      ; если это не "rumit", продолжаем ввод
retf
text db "Matrix has you!",0

На этом этапе надобно скачать виндозный Flat Assembler v.1.67 (FASM). Скомпилировав исходный код в FASM'е [Ctrl+F9], мы получим на выходе ISAOEM.BIN. Загружаем его в WinHex и дополняем нулями до размера, кратного 200h байт (512d байт). В самом последнем байте модуля необходимо указать его контрольную сумму.

Особое внимание нужно уделить пересчёту контрольной суммы модуля, ...она обязательно должна равняться нулю! В противном случае, при упаковке модуля в прошивку, возникнут проблемы. CBROM просто "пошлёт нас" ..пересчитывать CRC по-новой, и не подсовывать "всякий фуфел", ..эдакая защита от ламерского вмешательства!

Алгоритм подсчёта имеет запутанную структуру, и в программе WinHex выглядит следующим образом:

1) Открываем дополненный нулями бинарник в WinHex и жмём [Ctrl+A-->Инструменты-->Подсчитать хэш-->checksum 8bit]. WinHex сообщает 8Ch.

2) Полученное значение 8Ch нужно отнять от постоянного значения 100h, и записать в последний байт модуля, по адресу 1FFh. Для 16-тиричных вычислений запускаем виндовый калькулятор (Win+R-->calc) и переводим его в инженерный вид. 100h - 8Ch = 74h ....загоняем значение 74 в самый последний байт бинарника.

3) Жмём [Ctrl+A] и снова пересчитываем контрольную сумму. CRC=00h - вот так-то лучше!!!

Подсчёт CRC

Добавляем новый модуль в BIOS (CBROM.EXE p4m8m10e.BIN /ISA ISAOEM.bin) и с замиранием сердца прожигаем BIOS утилитой UNIFLASH или любой другой. Перезагружаем машину. Мы хакнули бивис!!!


Разгон системы
Чтобы разогнать систему, необходимо написать соответствующий ISA_ROM-модуль, настраивающий чипсет на максимальную производительность. Конфигурирование чипсета осуществляется через специальные регистры, находящиеся внутри него и подключенные к шине PCI.

Описание регистров чипсета можно найти в даташите. У меня чипсет VIA Apollo P4X800,...забиваю в гугле: datasheets +VIA Apollo P4X800, скачиваю ..и ищу там раздел, типа "PCI Configuration Registers". Сравнение конфигурационных возможностей чипсета с BIOS Setup показывает, что часть настроек обычно бывает умышленно заблокирована производителем материнской платы.

В частности, регистр 80000064h чипсета VIA Apollo P4X800 управляет чередованием банков памяти (чередование существенно увеличивает производительность), в то время как многие материнки на его основе, такой возможности не имеют. А как ее "поиметь"?

У PCI-шины есть два замечательных порта. В порт 0CF8h заносится адрес чипсетного регистра, с которым мы хотим работать, а через порт 0CFCh происходит обмен данными. Большинство чипсетных регистров представляют собой набор управляющих битов, поэтому перед тем, как что-то записывать в порт CFCh, мы сперва должны прочитать текущее состояние чипсета, взвести/опустить нужные нам биты при помощи операции OR, после чего затолкать обновленный регистр на место. На языке ассемблера это выглядит так:

Внимание! Только для чипсета - VIA Apollo P4X800!!! Обладатели других чипсетов должны заменить номера регистров, в соответствии со своей документацией.

; ISA_ROM.ASM
use16         ; ISA-модуль работает в 16-разрядном сегменте
DB 55h, AAh   ; загрузочная сигнатура
DB 01h        ; размер блока в 200h байтовых секторах
jmp x_code    ; передача управления нашему коду

x_code:
mov eax, 80000064h   ; регистр чипсета, управляющий DRAM-контроллером
mov dx, 0CF8h        ; PCI-порт (адрес регистра)
out dx, eax          ; выбираем регистр

mov dx, 0cfch       ; PCI-порт (данные)
in eax, dx          ; читаем содержимое регистра 80000064h
or eax, 00020202h   ; взводим биты, устанавливающие режим чередования
out dx, eax         ; записываем регистр чипсета

Данный модуль оформляется как и предыдущий, в виде ISA_ROM. Главное, чтобы он получил управление после того, как BIOS произведет первичную инициализацию оборудования, иначе наши настройки будут проигнорированы!

...точно также, прогоняем код через FASM, заполняем полученный бинарник нулями до 512байт, пересчитываем контрольную сумму и загоняем её в последний байт:

Ещё раз проверяем контрольную сумму. Если после всех телодвижений CRC модуля равна нулю, то значит мы всё сделали правильно. Архивируем модуль при помощи CBROM в прошивку и с удовлетворением замечаем, что он появился 11-ым в списке. Прожигаем BIOS...

Зашив обновленную прошивку в BIOS, мы сразу-же видим как возросло быстродействие системы! ...как-будто не своя тачка!!! Таким же точно образом можно редактировать и остальные регистры, отсутствующие в BIOS Setup, разгоняя систему до скорости гепарда. Вообще-то, это даже не разгон, а законное использование возможностей, которые чипсет нам дает по праву!


Рецепт прошивки видео-BIOS
Экстремальный разгон требует наращивания тактовой частоты, увеличения напряжения, смены прошивки. Нам нужен точный рецепт, и этот рецепт лежит перед вами!

Китайцы выжимают из железа всё, что можно и дополнительный разгон только валит карту наповал. Серьёзные производители оставляют солидный запас прочности, который не грех поиметь. Производитель ограничивает предельные значения тактовых частот и таймингов, которые можно установить с панели управления или твикером. ...и это еще не всё! Блокируются целые модули, опции и режимы передачи данных, физически реализованные в железе, но недоступные программно!

Где брать прошивку? ...как всегда, всё лежит у нас под-носом, а вернее в памяти компьютера! Если знать распределение системных ресурсов в адресном пространстве, то можно без труда найти нужное устройство по адресу и считать содержимое его памяти (где и хранится прошивка устройства).

Сейчас мы говорим о видеокарте, BIOS которой находится в памяти по адресу C000h. Вы можете просмотреть участок памяти, запустив виндовый DEBUG (Win+R->debug). Перед нами чёрный экран и мигающий курсор. Даём команду на отображение нужного участка памяти:

- D C000:0 L256

..где С000 - сегмент (адрес), :0 - с какого смещения сегмента показать, L256 - сколько байтов показать:

Окно DEBUG

...хорошо, есть начало, но где-же конец прошивки? Как вариант - можно скачать программу Dr.Hardware для вин, которая выводит инфу о биосе (жёлтым выделил загрузочную сигнатуру блока и конечный адрес):

Внешний вид Dr.Hardware

...запускаем WinHex, и жмём в нём [Инструменты-->Открыть RAM-->PhysicalMemory-->OK]. Перед нами содержимое всей памяти компьютера, включая расширенную. Находим нужный блок, для чего идём в меню [Правка-->Определить блок] и вводим номера сегментов начала и конца блока - С0000h и C7FF0h соответственно.

Осталось скопировать блок в новый файл (Ctrl+Shift+N), и перед нами файл-прошивки видеокарты! Сохраняем новый файл как *.bin! Конечный сегмент блока может отличаться от указанного, в зависимости от модели видеокарты, но начальный всегда будет C0000h.

Что можно гнать?

Разгон видео-BIOS'а держится на трех китах: тактовой частоте, таймингах и напряжении. Это довольно "вздорная семейка", которую непросто примирить. Неправильное сочетание параметров ведет к перекосам, глюкам и тормозам.

...значит, частота (в смысле, меандр). Это сигнал такой, тактирующий. А тактировать он должен графический процессор и память. Меандр вырабатывается осциллятором (он же кварц), обычно генерирующим 14.318 MHz (старые) или 27 MHz (новые видеокарты). Это - базовая тактовая частота, еще называемая опорной. Все остальные частоты формируются путем умножения базовой частоты на множитель "Х", изменяемый с шагом от 0,25 до 1. Конкретное значение зависит от особенностей отдельно взятой модели и чем оно меньше, тем лучше!

Наивысший результат достигается лишь при определенных соотношениях частоты процессора и памяти. Обычно - это кратная частота, то есть частоты памяти/процессора соотносятся как целые числа, например, 1:2. Как правило, производитель уже нашел "золотую середину", от которой мы можем "плясать".

...к примеру, у серии GeForce 7800 графический процессор тактируется не одной тактовой частой, а сразу тремя! Различные блоки могут работать на различных частотах, значительно повышая свой разгонный потенциал. Обидно, что разработчики драйверов до сих пор не используют эти возможности. Но это не ограничение железа, а только "голимых" драйверов. Модификация BIOS'а позволяет решить проблему!

Вольтмод

Управлять напряжением намного сложнее, чем накручивать тактовую частоту. Разнообразные утилиты утверждают, что напряжение изменилось, но проверка вольтметром не обнаруживает никакого прироста. Из этих двоих кто-то нагло врет! ..и это явно не вольтметр.

Win-Hex кажет, что внутри видео-BIOS'а существует специальная таблица: одна колонка - напряжение в вольтах умноженное на 100, другая - соответствующий этому напряжению идентификатор (VID). Другая таблица сопоставляет идентификаторы с режимами производительности.

Таким образом, "табличные вольты" внутри карты никак не используются и нужны только утилитам мониторинга. Патчить их можно, но бесполезно. Реальное напряжение определяется идентификатором. Каждому VID соответствует своя комбинация логических нулей и единиц, подаваемых на вход стабилизатора. Вот эта комбинация и рулит! Изменить ее можно только путем редактирования BIOS'а, а точнее - той его части, что взаимодействует со стабилизатором.

На карте существует четыре основных потребителя электричества, каждый из которых питается своим напряжением, это:

Vgpu - напряжение питания ядра;
Vdd - напряжение на входных буферах, ядре памяти;
Vddq - напряжение на выходных буферах памяти;
Vref - эталонное напряжение для входных буферов;

Где-то в недрах BIOS'а должно быть четыре таблицы "VID -> комбинация", однако не каждая карта позволяет менять все четыре напряжения программно, да нам это и не нужно. Обычно при разгоне увеличивают только напряжение питания графического ядра (Vgpu). Напряжение памяти лучше не трогать, особенно если она без радиатора.

...но довольно теории, давайте попрактикуемся!

Есть один хитрый трюк, который легко освоить! Большинство значений (например, тактовых частот) лежат в прошивке "прямым текстом" и могут быть найдены поиском в WinHex'е.

Допустим, нам известно, что карта поддерживает следующию тактовую частоту: 250 MHz и ряд напряжений 1,56v и 1,57v. Как их найти в прошивке? Очень просто! Умножаем число на 100, переводим в hex-систему (Win+R-->calc), затем остается поменять местами старший и младший байты (поскольку в x86 процессорах младший байт располагается по меньшему адресу). Вот что у нас получится:

250 -> 25000 -> 61A8h -> A8h 61h
1,56 -> 156 -> 9Ch
1,57 -> 157 -> 9Dh

Следовательно, нам необходимо найти числа: A8h 61h, 9Ch и 9Dh. Вскрываем прошивку в WinHex, и запускаем поиск.. Главное - найти "нужные", т.к. эти же числа могут встречаться и в других местах. Как отличить какие из них наши? Ответ - "правильные" числа будут сгруппированы в одном районе. Вот они:

Прошивка видео-BIOS NV-FX5200

Теперь мы можем исправить их на любые другие значения, которые нужны нам (напоминаю, что захачить таким образом напряжение не получится), после чего обновленную прошивку можно заливать в BIOS. Контрольную сумму (CRC) пересчитывают при помощи утилиты для прожига NVFlash (для карт NVIDIA), у которой имеются для этого специальные ключи.

Если прошивка прошла неудачно...

Каждый хакер должен быть готов к тому, что прошивка пройдет неудачно и карта покажет черный экран. Что тогда?

"Правильные" хакеры создают загрузочную дискету и прописывают в autoexec.bat все необходимые строки так, чтобы утилита прошивки запускалась автоматически без участия человека! Если нет дисковода, можно создать загрузочный CD. Главное - чтобы файл прошивки был размещен на самом CD, а не на жёстком, т.к. NTFS-разделы из MS-DOS ни хрена не видны!

© Права защишены 2010-2014г.
rumit-71@mail.ru