nvflash mybios.rom Поскольку мы прошили тот же BIOS, который только что сохранили, в работе карточки не должно было измениться ровным счетом ничего. Если же что-то испортилось, то лучше отказаться от дальнейших опытов. Модифицированные прошивки, которые вы будете делать сами, прошиваются точно также. Русификация ASUS N7600GS Silent 256 Так как BIOS видеокарт разных поколений и производителей может сильно различаться, для русификации каждого требуется свой подход. Далее идет подробное описание процесса русификации BIOS нескольких карточек, и вам нужно внимательно читать написанное и следовать принципу «делай, как я». ASUS N7600GS Silent 256 (моя видеокарта, с которой все и начиналось) — относительно простой случай. Делаем первую копию, с оригинальной прошивки — new1.rom. Так нужно делать после каждого удачного шажка. Т.е. получилось что-то — копируем удачный new1.rom в new2.rom и дальнейшие опыты проводим уже с ним. Опять получилось — делаем new3.rom, и т.д. пока не дойдем до совершенства. Не получилось — безжалостно стираем неудачный файл и начинаем с предыдущего. Только так!!! Итак, у нас есть new1.rom. Запускаем hiew и смотрим его дамп: 00000000: 55 AA 78 EB-4B 37 34 30-30 E9 4C 19-77 CC 56 49 UêxûK7400ùL w¦VI 00000010: 44 45 4F 20-0D 00 00 00-B8 00 19 11-00 00 49 42 DEO ¬ IB 00000020: 4D 20 56 47-41 20 43 6F-6D 70 61 74-69 62 6C 65 M VGA Compatible 00000030: 01 00 00 00-80 10 94 8D-30 32 2F 30-37 2F 30 37 À ÔÍ02/07/07 ============ 0000EFD0: FF FF FF FF-FF FF FF FF-FF FF FF FF-FF FF FF FF 0000EFE0: FF FF FF FF-FF FF FF FF-FF FF FF FF-FF FF FF FF 0000EFF0: FF FF FF FF-FF FF FF FF-FF FF FF FF-FF FF FF 9C Ü Здесь нужно пояснить формат блока BIOS (любого «культурного», не только видеокарты, этот формат описан еще в первой документации на IBM PC): * 0000: 55 AA — это сигнатура, если ее не будет, системный BIOS проигнорирует этот блок: «БИ-БИ, это что ты мне подсунул?», и результатом будет черный экран; * 0002: ХХ — очень важный байт, счетчик размера блока BIOS; сам размер есть 512 х ХХ = от 512 байт до 128 Кб; * bububu: xx — последний байт блока, такой, чтоб контрольная сумма по модулю 256 всех байтов в блоке, заданном байтом 0002, равнялась нулю. Если контрольная сумма не нулевая, результат будет такой же, как и при неверной сигнатуре; * 0003: jmp туда-то — точка входа в BIOS, сюда передается управление системным BIOS по команде callf. Возврат из BIOS соответствующий — retf. С анализа готового распакованного BIOS начинается самое интересное. Считывается он с адресов C0000h—XXXXXh утилитой grb. Она создает файл grb.bin там же, где лежит сама. Этот файл и есть образ рабочего (т.е. уже загруженного и настроенного) BIOS видеокарты. Естественно, что шрифты в нем уже распакованные. Поэтому нужно отыскать, где оные начинаются. В этом нам поможет тот факт, что обычно шрифты начинаются с размера 8х8, и первые два символа с кодами 00h & 01h стандартные, и их можно рассматривать как сигнатуру: 0000C442: 00 00 00 00-00 00 00 00-7E 81 A5 81-BD 99 81 7E ~ÁåÁ-ÙÁ~ Найдя ее и посмотрев окрестности, убеждаемся, мы действительно нашли нужную точку. Итак, шрифты распаковываются по адресу C442h. Открываем new1.rom и ищем ссылки на этот адрес (разумеется, она может быть не одна, и выбор нужной зависит исключительно от опыта и таланта хакера): 0000EDF8: 6660 pushad 0000EDFA: 0E push cs 0000EDFB: 1F pop ds 0000EDFC: 8D3642C4 lea si,[0C442] 0000EE00: C7069DED0703 mov w,[0ED9D],00307 ;" " 0000EE06: 8D3EE4DF lea di,[0DFE4] 0000EE0A: 8D2EBEE5 lea bp,[0E5BE] 0000EE0E: E8AEFF call 00000EDBF --- (1) 0000EE11: C7069DED0F04 mov w,[0ED9D],0040F ;" " 0000EE17: 8D3E11E6 lea di,[0E611] 0000EE1B: 8D2E4BED lea bp,[0ED4B] 0000EE1F: E89DFF call 00000EDBF --- (2) 0000EE22: 6661 popad 0000EE24: E95349 jmp 00000377A --- (3) Вот оно! Очевидно, EDBFh — распаковщик, читающий упакованные шрифты с адресов DFE4h, E5BEh, E611h, ED4Bh и записывающий их на адрес C442h, а сам распаковщик лежит прямо за шрифтами. Хотя код вызывается с адреса CB7Fh, после распаковки управление передается безусловным jmp 377Ah, потому что вызвавший код будет затерт распакованными шрифтами. Имеем: для русификации достаточно после штатной распаковки записать по адресу C442h наш шрифт. Шрифт можно позаимствовать из файла ega3.cpi или iso.cpi из комплекта операционных систем Microsoft (DOS/Windows 3.x/Windows 9x) или из других источников (например, из русификатора keyrus, чтобы получить его шрифты, выполните исполняемый файл как keyrus.com /files). Но вот как его записать в BIOS? Полный комплект шрифтов 8х8 + 8х16 занимает 6 Кб = 1800h, а у нас остаток пространства BIOS только 10000h – EE20h = 11E0h. Решений может быть несколько: * записать половину шрифтов, символы с 80h по FFh (требуется C00h свободного места); * записать целиком новые шрифты поверх стандартных, сжав их и заменив распаковщик. Для начала пробуем первый способ. Раздуваем BIOS до 64 Кб ровно (байт 0003 = 80h), записываем по адресам F000h половинки наших шрифтов (8х8, затем 8х16) и дополняем штатный распаковщик нашим: 0000EE22: cld 0000EE23: mov di,0c842 0000EE25: mov si,0f000 0000EE28: mov cx,00400 0000EE2a: repe movsb 0000EE2c: mov di,0d442 0000EE2e: mov si,0f400 0000EE30: mov cx,00800 0000EE32: repe movsb 0000EE34: popad 0000EE36: jmp 00000377A Теперь нужно пересчитать контрольную сумму. Выделяем в блок весь файл, кроме последнего байта! Выбираем команду CryBlk, вводим: 1: add bl,al 2: loop 1 Запускаем, смотрим содержимое BL, вычисляем 100h-BL, записываем его вместо последнего байта (разумеется, потом мне это надоело, и я создал утилиту bsum, которая делает все это сама). Прошиваем, перезагружаемся (не забудьте отключить имеющийся русификатор). Работает! Но вот беда — не все русифицировалось. Остались символы С, Ы, Э, Ю, л, м… Это не проблема! Копируем new1.rom в new2.rom, и дальше работаем уже с новым файлом. Ищем данные (откуда дровишки? Из лесу, вестимо…): 00002678: 1D 00 00 00-00 00 24 66-FF 66 24 00-00 00 00 00 $f f$ ссылку на них: 00003809: 0E push cs 0000380A: 07 pop es 0000380B: BF7826 mov di,02678 ;"&x" 0000380E: B710 mov bh,010 ;" " 00003810: C3 retn и ссылку на этот код: 000040CF: E837F7 call 000003809 --- (1) 000040D2: 2ADB sub bl,bl 000040D4: E87FF7 call 000003856 --- (2) 000040D7: E80AF7 call 0000037E4 --- (3) 000040DA: EB0B jmps 0000040E7 --- (4) 000040DC: E8D1F6 call 0000037B0 --- (5) 000040DF: 893E0C01 mov [010C],di 000040E3: 8C060E01 mov [010E],es 000040E7: C3 retn Жмем 2, и оказываемся в патчере: 00003856: 53 push bx 00003857: 55 push bp 00003858: 1E push ds 00003859: 06 push es 0000385A: 8BF7 mov si,di Забиваем 53h на C3h, снова чиним контрольную сумму, прошиваем и наслаждаемся победой! Как убрать эффект «столбов» Для сведения, что это такое. Текстовыми наши режимы называются лишь по организации видеопамяти, т.к. области B800h & B000h (монохромный режим) хранят именно символы, а не их точечные изображения, как в графике. На экране изображение всегда состоит из точек. До VGA существовали еще видеоадаптеры MDA (качественный ч/б текст), CGA & EGA. Они поддерживали эффективные экранные разрешения соответственно 720х350, 640х200 и 640х350, а матрицы символов для них имели размер 9х14, 8х8 и 8х14 точек соответственно. Для совместимости (великое дело!) с EGA, впервые позволявшим программно загружать шрифты, в VGA использовали шрифт шириной 8 точек, но при этом разрешили видеорежимы 720х400 точек. В результате получили качественный текст, в котором использовались символы полной ширины, отпала необходимость оставлять 7-й бит для раздела букв, а дополнительный пробел между буквами получался автоматически. Проблема «столбов» заключается в том, что т.н. символы заполнения B0h, B1h, B2h, используемые в псевдографике для немонолитной заливки фона, разрабатывались для CGA и пригодны лишь в случае, когда символы вплотную примыкают друг к другу. На VGA же автоматические пробелы между символами, так удобные в других местах, с успехом разделяют по горизонтали и символы заполнения, что и известно визуально как «эффект столбов». Прочие символы псевдографики VGA дорисовывает сам, а эти — нет, т.к. при этом все равно получатся столбы. Проблема решается заменой стандартных матриц этих символов на специально подогнанные под режим VGA. При этом заливка становится монолитной во всех режимах шириной 720 точек, но эти столбы проявляются уже в CGA/EGA режимах или в любом графическом — там ведь нет автоматических разделителей! Впрочем, я сомневаюсь, что в графическом режиме заполнители вообще нужны. Итак, подменяем матрицы символов B0h, B1h, B2h на следующие (8х16, матрица 8х8 есть половина матрицы 8х16): B0 — 49 00 49 00 49 00 49 00 49 00 49 00 49 00 49 00 B1 — 92 49 92 49 92 49 92 49 92 49 92 49 92 49 92 49 B2 — DB 92 DB 92 DB 92 DB 92 DB 92 DB 92 DB 92 DB 92 После этого столбы исчезли. О шрифте 8х14 Как его увидеть? Переключиться в режим EGA: MODE CON LINES=43 MODE CON LINES=25 Откуда он берется? Он автоматически генерируется из шрифта 8х16, обрезанием самой верхней и самой нижней строк. Поэтому, подбирая шрифт 8х16, заранее подумайте, как будет выглядеть получившийся из него шрифт 8х14. Он имеет обыкновение появляться в самый неподходящий момент, например, при переключении видеорежима в консоли Windows. | |
| |
Просмотров: 6754 | Комментарии: 1 | | |
Всего комментариев: 0 | |