Автор: Unknown BIOS (не проверено) , 3 апреля 2005
Модули AMI Bios

Хочу добавить совй код как модуль либо код в уже существующий модуль AMI BIOS.
Мат. Плата EliteGroup Via-P6 P4VVM2 (FC-478) Bios Date 01/24/03
e030123s.rom
(http://www.ecs.com.tw/ECSWeb/Downloads/ProductsDetail_Download.aspx?CategoryID=1&Typeid=1&detailid=140&DetailName=BIOS&DetailDesc=P4VMM2(3.1)&MenuID=35&LanID=6)

Для просмотра содержимого биоса пользуюсь программой amibcp.exe 7.51.03 (554336Byte)

Я искал место куда могу вставить свой кусок кода. Для моих нужд самым приемлимым вариантом будет вставка кода как раз перед передачей управления на MBR(0000:7C00). Распаковав каждый модуль (c помощью amibcp) и порывшись я нашёл что считывание MBR происходит в модуле runtime.
Но тут меня постиг небольшой обломс, потому-что этот модуль amibcp править не даёт(а алогритма паковки модулей в ami bios я на текущий момент не знаю - но вероятно через определённое время порывшись с idapro сумею его описать).
Поэтому я решил добавить уже свой кусок кода в модуль. Этот кусок кода у меня выполняет некоторые операции по работе с CMOS и HDD(cчитывание запись или точнее критовка раскриптовка критичной для меня информации) - код небольшой около 512 байт и я использую буфера в памяти для считывания/записи.

И тут у меня возникает несколько вопросов:
0) Какой порядок исполнения модулей в AMI Bios.
1) может ли мой код повлиять/испортить выполнение BIOS(учитывая что я пользуюсь 4kb буфеом в памяти и могу ли я вообще использовать память на момент исполнения моего кода)
как мне стоить добавить этот модуль в файл прошивки (с помощью amibcp)
как dynamic либо с фиксированным адресом ка например у runtime.
Какой указывать адрес в случае выбора фиксированного участка загрузки чтобы выполнение моего кода не повлияло на работу других модулей.
2) Нужно ли придерживаться определённой структуры для написания своих модулей для ami (имя заголовок CRC и т д )

ну и часть репорта(amibcp) может кому что-нибуудь подскажет что делать в этом случае
[code:1] AMIBIOS ROM Information Report
Name:VIA_P6 ROM File:E030123S.ROM File:repo2.dat Thu Mar 24 18:39:38 2005

BIOS MODULES
------------
(those marked '>' are compressed module)

BIOS Version : 0700 BIOS Date : 01/24/03
BIOS Tag : P4VMM2 BIOS Size : 256 Kb
Module ID/Name RomLoc SourceSize SizeInRom %% RunLoc
INIT F000:C000 04000(016384) 04000(016384) 00.00 ---- ----
NVRAM/ESCD F000:8000 04000(016384) 04000(016384) 00.00 ---- ----
AMD SIP ROM F000:7E00 00200(000512) 00200(000512) 00.00 ---- ----
>02 Runtime F090:0006 0A3E0(041952) 074E2(029922) 28.68 F000:5C20
08 Interface F01E:000C 00706(001798) 0071A(001818) 00.00 Dynamic
>00 POST EB92:000E 05BD6(023510) 048BE(018622) 20.79 F000:0000
>03 DIM E831:0004 04E18(019992) 0361A(013850) 30.72 E000:B1E0
>04 Setup Client E5F2:0004 03898(014488) 023F0(009200) 36.50 Dynamic
>01 Setup Server E3EF:000D 02F12(012050) 02027(008231) 31.69 F000:0000
06 DMI Data E3C0:0002 002E7(000743) 002FB(000763) 00.00 Dynamic
>09 MP E385:0005 0048A(001162) 003AD(000941) 19.02 Dynamic
>0A Notebook D9B4:000A 10000(065536) 09D0B(040203) 38.66 Dynamic
>0D Int-13 D498:0009 06C95(027797) 051C1(020929) 24.71 Dynamic
>0F ACPI Table D45E:0006 0988E(039054) 003A3(000931) 97.62 Dynamic
>10 ACPI AML D31A:0002 02E31(011825) 01444(005188) 56.13 Dynamic
>12 Configuration D289:0007 00A6A(002666) 0090B(002315) 13.17 Dynamic
>13 DMI Code D1F2:000A 00BBA(003002) 0096D(002413) 19.62 Dynamic
11 P6 Micro Code CD70:000E 04808(018440) 0481C(018460) 00.00 Dynamic
>3C UserDefined CD2B:0002 0059C(001436) 0045C(001116) 22.28 Dynamic
>32 Image Dsiplay Code CD0B:000E 002FF(000767) 001F4(000500) 34.81 Dynamic
>31 EPA / OEM Logo CC85:000A 011B1(004529) 00864(002148) 52.57 Dynamic
0C ROM-ID CC83:000E 00008(000008) 0001C(000028) 00.00 Dynamic
>60 ASCII Font CC2F:0000 01000(004096) 0054E(001358) 66.85 Dynamic
>52 Language 2 CB29:0008 0246A(009322) 01058(004184) 55.12 Dynamic
>20 PCI AddOn ROM C467:000B 0C000(049152) 06C1D(027677) 43.69 8D04:5333
>20 PCI AddOn ROM C1B6:000B 04000(016384) 02B10(011024) 32.71 3065:1106
50 Default Language C1B2:0003 00034(000052) 00048(000072) 00.00 Dynamic
51 Language 1 C1AD:0005 0003A(000058) 0004E(000078) 00.00 Dynamic
>2A UserDefined C15A:0003 0073F(001855) 00532(001330) 28.30 5000:0000
Bytes Used 03EA65 ( 256613) Bytes Free 00159B ( 5531)[/code:1]


P.S. Попутно собираю базу прошивок AMI , Phoenix и ASUS(преимущественно ноутбуков) для выковыривания оттуда заводских паролей(если таковые имеются).

C уважением Виктор.
Содержимое данного поля является приватным и не предназначено для показа.

BBCode

  • HTML-теги не обрабатываются и показываются как обычный текст
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.

apple_rom

20 лет 10 месяцев назад

Award = LZH
AMI = LZINT
Phoenix = LZSS/LZARI/LZINT

>теперь мой комментарий к тексту - короче, в EDX находится нечто вроде CPUIDа, если не он сам...
аз есьмь... (в плане - что-то типа "в натуре" - по старославянски)

п.с. без знания всей "карты памяти" и принципов работы ами вставить код не получится. Обходной путь - использование "юзерромовских" модулей (запудривание мозга биосу прикидываясь крайне полезным PCI-девайсом).
> Phoenix = LZSS/LZARI/LZINT

а также LZHUF и LZINTUNF ...

ivp

20 лет 10 месяцев назад

> Phoenix = LZSS/LZARI/LZINT

а также LZHUF и LZINTUNF ...

Угу, именно... :roll:
Для проверки распаковывал каждый модуль под DOS с помощью amibcp и проверял с уже распаковваными эталонными вариантами. Как результат изменения были только в модуле runtime которыя я собственно и менял.

хм... метод неточный.
История такая:
пропатчил АМИ БИОС. Распаковал модули оригинального и пропатченного: выглядять один в один (почти). Но при этом полбиоса превратилось в массив из FFок :-o
P.S. Кто нибудь отзовитесь у кого есть таблица или любая информация о регистре edx который инициализируется при включении питания. Меня интересуют значения этого регистра в зависимости от модели процессора.

Лехко.. Есть такая книжка Гука "Процессоры Pentium II, Pentium Pro и просто Pentium" (СПб, изд. Питер, 1999 год)
Раздел "8.3. Идентификация процессоров"

BIOS может получить информацию о типе 32-разрядного процессора, считав содержимое регистра DX непосредственно после сигнала RESET. Расшифровка полей регистра DX для процессоров 486 и старше приводится в таблл. 8.2. Для младших процессоров регистр DH содержит идентификатор процессора (03 - 80386), DL - номер модели.
Поле "тип" (биты 13:12) различает процессоры ОЕМ-версий (00), OverDrive (01) и Dual (10); значение 11 зарезервировано. Более интересная информация содержится в полях "семейство" (биты 11:8) и "модель" (биты 7:3). Поле степпинга (биты 3:0) несет дополнительную информацию, которую, к сожалению, без таблиц изготовителя не расшифровать. Процессоры 80386 имели несколько иное назначение бит: поле "семейство" совпадает, поле "модель" занимает биты 15:11, биты 7:0 отводятся под степпинг.
Таблица 8.2. Коды идентификации процессоров
[code:1]+----------+----------+----------+---------------------------------------------------------------
|Тип |Семейство |Модель | Процессор
|EDX[13:12]|EDX[11:8] |EDX[7:4] |
+----------+----------+----------+---------------------------------------------------------------
| 00 | 0100 | 0000 | Intel486DX
| 00 | 0100 | 0001 | Intel486DX
| 00 | 0100 | 0010 | Intel486SX
| 00 | 0100 | 0011 | Intel487, DX2, DX2 OverDrive, AMD DX2 в режиме WT
| 00 | 0100 | 0100 | IntelSXL
| 00 | 0100 | 0101 | IntelSX2 OverDrive
| 00 | 0100 | 0111 | IntelDX2 Enhanced и AMD X2 в режиме WB
| 00 | 0100 | 1000 | IntelDX4 OverDrive
| 00 | 0100 | 1001 | AMD DX4 в режиме WB
| 00 | 0100 | 1110 | Am5x86 в режиме WT
| 00 | 0100 | 1111 | Am5x86 в режиме WB
| 01 | 0100 | 1000 | IntelDX4 OverDrive, AMD DX4 в режиме WT
| 00 | 0101 | 0000 | AMD K5-PR75, 90, 100
| 00 | 0101 | 0001 | Pentium 60, 66; pentium OverDrive 60, 66; AMD K5-PR120, 133
| 00 | 0101 | 0010 | Pentium 75-200, AMD K5-PR166
| 01 | 0101 | 0010 | Pentium OverDrive 75-133
| 01 | 0101 | 0011 | Pentium OverDrive для 486
| 00 | 0101 | 0100 | Pentium MMX (166, 200, 233)
| 01 | 0101 | 0100 | Зарезервировано (OverDrive для Pentium 75-133)
| 00 | 0110 | 0001 | Pentium Pro
| 00 | 0110 | 0011 | Pentium II первого поколения (233-300 МГц)
| 00 | 0110 | 0101 | Pentium II Deshutes (333-450 МГц), Celeron (266-300 МГц), Xeon
| 00 | 0110 | 0110 | Celeron 300A, 333, 366, 400
| 01 | 0110 | 0011 | Pentium II OverDrive
+----------+----------+----------+---------------------------------------------------------------[/code:1]


>> хм... метод неточный.
Согласен что неточный. Моё окончательное решение было работать с mmtool(Windows) оттуда я модуль необходимый вытащил, изменил его потом всунул обратно потом для контроля проверил все остальные вытащенные (запустив опять mmtol c изменённой версией BIOS)

За информацию спасибо - её я и искал. Что вышло из моих экспериментов напишу ниже.

С уважением Виктор.
перед вызовом int 13h в ah=02( считывание) dl=side , cx для сектора и цилиндра, dh=80h(если загрузка с первого винта) 81h второго и т д.


Нет, к int 13h отношения не имеет (разве что нумерация та же). Когда начинается выполнение Boot-сектора (переходом из BIOS по 7С00) - dl номер диска. А насчет EDX - а смысл? Даже если там по PW-ON и есть что-то полезное, то шанс им попользоваться невелик. К тому времени, пока до тебя дойдет управление - там уже ничего не будет, скорее всего.
Поиск рулит, кстати. Яндекс, запрос "состояние процессора после включения питания", первая же ссылка
http://lib.rin.ru/cgi-bin/load/docs.pl?open=112400.txt&view=104698



У меня создаётся впечатление, что мы друг друга не поняли. Меня интересовала информация о регистрах на момент включения питания, а не на момент передачи управления на MBR(или любой другой загрузчик который начинает выполянться после отработки BIOS)

С уважением Виктор.
Award = LZH
AMI = LZINT
Phoenix = LZSS/LZARI/LZINT

>теперь мой комментарий к тексту - короче, в EDX находится нечто вроде CPUIDа, если не он сам...
аз есьмь... (в плане - что-то типа "в натуре" - по старославянски)

п.с. без знания всей "карты памяти" и принципов работы ами вставить код не получится. Обходной путь - использование "юзерромовских" модулей (запудривание мозга биосу прикидываясь крайне полезным PCI-девайсом).




Вставить код мне удалось, именно туда куда и нужно было. Об этом опишу ниже.

С уважением Виктор.
Описываю мои телодвижения как и обещал:

Запускаю mmtool(v2.22.1). Выковыриваю оттуда все модули в отдельные файлы. (Меню Extract - In uncompressed form, Module ID Offset и Segment не трогаю). Напоминаю, что программа глючная слегка и при перемещениям по меню(у меня больше чем 3 смены ) завершается аварийно, поэтому я делал так: Запустил mmtool. Выбрал 'Power MMtool'.
Выбрал Load ROM. Потом мышкой выбрал Extract. Далее мышкой выбираю нужный можудь и в меню Extract подменю Extract. Описываю я это потому что сам пока не понял , что программа подвисает из-за перемещений по меню , начинал сильно сомневаться в возможности программы.

В каждом файле поиском пытаюсь найти CD 13(int 13h). В найденных файлах уже смотрю по контексту - считывание это MBR(или другого загрузчика) в память либо работа с HDD либо какая-то логика работы с другим носителем . Итак мой выбор пал на модуль runtime.
Почему?
Просмотрев все встречающиеся места в этом и другом модулях я смотрел контексту на наличие 7С00 (смещение при считывании загрузчика в память по адресу 0000:7C00)
Итак runtime. CD 13 там встречается 3 раза.
Искал я эти баты с помощью hiew.exe
и нашёл следующее нужное мне место:
00003146: push es
00003147: push bx
00003148: push 000
0000314A: pop es
0000314B: mov cx,00004
0000314E: mov bx,07C00
00003152: push cx
00003152: mov cx,00001
00003155: mov dh,000
00003157: mov ax,00201
0000315A: int 13
0000315C: pop cx

Я думаю, что те кто знают ассемблер, либо те кто экспериментировали с int 13h (пусть даже на паскале используя asm вставки ) поймут что идёт считывание (ah=02) одного сектора( al=01) с номером Cyl=0 Sect=1 (cx=1) head=0 (dh=0) в память по адресу 0000:7C00 (es=0, bx=7C00)
что касается регистра dl - это данные касательно носителя с которого считывается сектор (для первого HDD он 80h). Если кому интересно значение этого регистра имеенно в контексте моего биоса могут глянуть выше по коду и убедиться, что он наверняка заполянется из значения CMOS касательно порядка загрузки компьютера с носителя.

Если кого-то интересует почему я выбрал именно этот (второй кусок кода с найденным CD 13 и какое значение получает dl перед int 13h спрашивайте - опишу более детально). Мне показалось что это тривиальные рассуждения поэтому я их и опустил.

Итак место где считывается загрузочный сектор в память найдено.
Начинаем править этот модуль (runtime).

Просматривая с hiew я пытался обнаружить необходимые для меня участки кода из FF. Таких оказалось одна штука (смещение 00000644). Длиной 32 байта. :) Маловато подумал я и решил более аккуратно посмотреть на куски подряд идущих 00, не забывая в принципе что это запросто могли бы быть данные которые используются для инициализации(обнуляения) какой-нить структуры данных используемой для работы BIOS. Тут я немного схалявил - понядеявшись на русский авось и не стал сильно копаться нули это для инициализации или просто пустое место. Бегло прошвырнувшись в IDAPro я стал почти уверен что те участки нулей которые я буду использовать - пустые места.

Итак имеем следующие куски свободные для записи нашего кода.
00000616: длина 90 байт
00005590: длина 110 байт
000057С9: длина 108 байт
0000598E: длина 44 байта
000091A7: длина 44 байта

По ходу дела ещё встречались участки 000046B0 (меньше 32 байт я не включил - ибо того что было мне в принципе хватило)
Плюс ещё есть достаточно большие участки из 0 (но я не стал возиться с ними по причине близкого соседства с данными строкового типа - возможно их и можно было бы использовать но для этого нужно быть уверенным и потратить время на солидный кусок трассировки BIOS - даже с IDAPro это занятие не сильно интеллектуальное - и рутинность трассировки BIOS начинает временами сильно утомлять)
И В конце runtime есть ещё солидный кусок из 20h(это пробел) который можно было бы использовать внеся небольшое изменение к BIOS.

Итак участки найдены - ищу первую команду с которой неплохо бы стартануть свой код.
Я для этого дела выбрал
00003148: push 000
0000314A: pop es
и изменил это (прямо в hiew ) на
00003148: call 0000055B0 (E86524 если кому не ясно как высчитывается смещение для прыжка смотрите ссылки которые я давал в посте выше)
(соответственно перед выходом из моей процедуры я не забыл про код который я убрал тоесть перед самым последним ret будет конструкция
push 0
pop es)
У внимательных людей может возникнуть вопрос почмеу я сделал call не на начало свободного блока 00005590. (по моим расчётам мне необходимо было 239 байт. Поэтому я позволил себе быть слегка расточительным и мало лли что - но я предпочитаю потерять 4 пустых байта и быть немного уверенным что это не начало какой-то новой порождённой мной инструкции либо если есть необходимость выровнятькод по адресу кратному 4)
Итак первая команда по адресу 55B0

000055B0: cli (жёстко конечно выключать прерывания которые уже могли бы выполняться даже в BIOS но я предпочитаю быть уверенным что чтонибудь мне не поменяет регистры особенно ss sp )
000055B1: pusha (сохраняем все регистры)
000055B2: pushf (сохраняем регистр флагов)
Далее у меня весьма расточительная трата свободного места (мне нужны показания часов из BIOS)
Весь код и в особенности основную процедуру (работа c HDD) я приводить не буду заменяя её nop :) но пару кусочков кода могу привести :)
000055B3:
mov ax,09
out 070,al
in al,071 (это мы берём две последние цифры от года)
push al
nop (убрал я этот кусок кода дабы не актвизировать творчество отечественных умельцев в ненужном направлении :) )
nop
pop al
000055D6: call 000057E0 (E80702)
nop (6штук) :)
000055DF: call 000057E0 (E8FE01)
000055E2: popf
000055E3: popa
000055E4: push 000
000055E6: pop es
000055E8: retn

из процедуры 000057E0 (идут вызовы и возвраты в оставшиеся 3 свободных участка блока). Описывать я их здесь не стану, но в каком нибудь закрытом форуме думаю смог бы :)

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

Напоминаю - длина модуля runtime не поменялась.
Теперь вставка этого модуля в основной файл ROM BIOS.
По прежнему осторожно используем mmtool. Тут я потратл слегка времени пытаясь указать segment и offset с того места которое было расшифровано самим mmtool. Но тут меня постигали обломы ибо почему-то после Replace, у меня в mmtool менялись точки распаковки модуля в память. Солидно поднадобламавшись :) из-за глючности mmtool (хотя не спорю работу она свою делает) я один раз не указал ни сегмент ни смещение, и в общем всё прошло успешно модуль заменился и вся инфа о точках входа и прочее осталась прежней.

Далее я выбрал save ROM as. сохранил его. потом опять открыл с помощью mmtool пересмотрел есть ли изменения в точках входа в памяти, распаковал каждый модуль сравнил его с раннее распакованным вариантом. В общем не растекаясь мыслию скажу что изменения были только в модуле runtime.
Ну и конечно если теперь сравнить этот новый ROM BIOS и старый то изменений будет ну очень много с определённого адреса, что и понятно ибо модуль паковался.

Далее взял родной прошивальщик и прошил новым ROM.
Тестю уже 9 дней. Полёт нормальный.
Глюков пока не замечал.

С уважением Виктор.

P.S. Незнаю нужны ли кому-либо эти файлы (runtime к примеру), я давал ссылку в самом начале поста где этот ROM можно скачать. Ну я думаю mmtool и hiew найдться если поискать. На случай если уже не всилах найти необходимый инструмент (hiew mmtool ) отписывайте к админам форума. Если они разрешат я солью то с помощью чего экспериментировал.
Возможно я что-то не так делал, но все попытки помеять модуль runtime под DOS с помощью amibcp не увенчались успехом, в отличие от mmtool(под Windows).

Кто нибудь скажет есть ли версия amibcp под DOS или в крайний случай под Windows, которая позволяет заменять все модули. (amibcp 7.51.03 не дал мне заменить модуль runtime).

Плюс я заметил что репорт который выдаёт amibcp и mmtool различаются. Кто нибудь в курсе почему?

С уважением Виктор.

Плюс я заметил что репорт который выдаёт amibcp и mmtool различаются. Кто нибудь в курсе почему?


Все предельно просто - эти утилиты предназначены для работы с разными ядрами AMIBIOS.

Плюс я заметил что репорт который выдаёт amibcp и mmtool различаются. Кто нибудь в курсе почему?


Все предельно просто - эти утилиты предназначены для работы с разными ядрами AMIBIOS.



Посмотрел я файл ROM Bios () e030124s.rom) и нашёл там по смещению 00037DEA строку AMIBIOSC0700.

Есть ли в природе программа работающая(и заменяющая модули) под DOS с этим биос.

С уважением Виктор.