Модули AMI Bios
Хочу добавить совй код как модуль либо код в уже существующий модуль AMI BIOS.
Мат. Плата EliteGroup Via-P6 P4VVM2 (FC-478) Bios Date 01/24/03
e030123s.rom
(ecs.com.tw/ECSWeb/Downloads/ProductsDetail_Download.aspx?CategoryID=1&...(3.1)&MenuID=35&LanID=6)
Для просмотра содержимого биоса пользуюсь программой amibcp.exe 7.51.03 (554336Byte)
Я искал место куда могу вставить свой кусок кода. Для моих нужд самым приемлимым вариантом будет вставка кода как раз перед передачей управления на MBR(0000:7C00). Распаковав каждый модуль (c помощью amibcp) и порывшись я нашёл что считывание MBR происходит в модуле runtime.
И тут у меня возникает несколько вопросов:
0) Какой порядок исполнения модулей в AMI Bios.
1) может ли мой код повлиять/испортить выполнение BIOS(учитывая что я пользуюсь 4kb буфеом в памяти и могу ли я вообще использовать память на момент исполнения моего кода)
как мне стоить добавить этот модуль в файл прошивки (с помощью amibcp)
как dynamic либо с фиксированным адресом ка например у runtime.
Какой указывать адрес в случае выбора фиксированного участка загрузки чтобы выполнение моего кода не повлияло на работу других модулей.
2) Нужно ли придерживаться определённой структуры для написания своих модулей для ami (имя заголовок CRC и т д )
ну и часть репорта(amibcp) может кому что-нибуудь подскажет что делать в этом случае
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)
P.S. Попутно собираю базу прошивок AMI , Phoenix и ASUS(преимущественно ноутбуков) для выковыривания оттуда заводских паролей(если таковые имеются).
C уважением Виктор.
Award = LZH
AMI = LZINT
Phoenix = LZSS/LZARI/LZINT
>теперь мой комментарий к тексту - короче, в EDX находится нечто вроде CPUIDа, если не он сам...
аз есьмь... (в плане - что-то типа "в натуре" - по старославянски)
п.с. без знания всей "карты памяти" и принципов работы ами вставить код не получится. Обходной путь - использование "юзерромовских" модулей (запудривание мозга биосу прикидываясь крайне полезным PCI-девайсом).
> Phoenix = LZSS/LZARI/LZINT
а также LZHUF и LZINTUNF ...
а также LZHUF и LZINTUNF ...![roll](http://bios.rom.by/img/smiles/icon_rolleyes.gif)
Угу, именно...
- Ситчик веселенький есть?..
- Приезжайте, обхохочетесь!..
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. Коды идентификации процессоров
>> хм... метод неточный.
Согласен что неточный. Моё окончательное решение было работать с mmtool(Windows) оттуда я модуль необходимый вытащил, изменил его потом всунул обратно потом для контроля проверил все остальные вытащенные (запустив опять mmtol c изменённой версией BIOS)
За информацию спасибо - её я и искал. Что вышло из моих экспериментов напишу ниже.
С уважением Виктор.
Нет, к int 13h отношения не имеет (разве что нумерация та же). Когда начинается выполнение Boot-сектора (переходом из BIOS по 7С00) - dl номер диска. А насчет EDX - а смысл? Даже если там по PW-ON и есть что-то полезное, то шанс им попользоваться невелик. К тому времени, пока до тебя дойдет управление - там уже ничего не будет, скорее всего.
Поиск рулит, кстати. Яндекс, запрос "состояние процессора после включения питания", первая же ссылка
lib.rin.ru/cgi-bin/load/docs.pl?open=112400.txt&view=104698
У меня создаётся впечатление, что мы друг друга не поняли. Меня интересовала информация о регистрах на момент включения питания, а не на момент передачи управления на MBR(или любой другой загрузчик который начинает выполянться после отработки BIOS)
С уважением Виктор.
>теперь мой комментарий к тексту - короче, в 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 )
но пару кусочков кода могу привести ![:)](http://bios.rom.by/img/smiles/icon_smile.gif)
)![:)](http://bios.rom.by/img/smiles/icon_smile.gif)
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 свободных участка блока). Описывать я их здесь не стану, но в каком нибудь закрытом форуме думаю смог бы![:)](http://bios.rom.by/img/smiles/icon_smile.gif)
Далее бегло проверил свой код, протрейсив его вручную. код мой не сильно сложен, беглого просмотра передач управления процедурам, возврат из них, циклы(с флагами), плюс стек(зашёл вышел) вполне было достаточно.
Напоминаю - длина модуля runtime не поменялась.
из-за глючности mmtool (хотя не спорю работу она свою делает) я один раз не указал ни сегмент ни смещение, и в общем всё прошло успешно модуль заменился и вся инфа о точках входа и прочее осталась прежней.
Теперь вставка этого модуля в основной файл ROM BIOS.
По прежнему осторожно используем mmtool. Тут я потратл слегка времени пытаясь указать segment и offset с того места которое было расшифровано самим mmtool. Но тут меня постигали обломы ибо почему-то после Replace, у меня в 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 различаются. Кто нибудь в курсе почему?
С уважением Виктор.
Все предельно просто - эти утилиты предназначены для работы с разными ядрами AMIBIOS.
Все предельно просто - эти утилиты предназначены для работы с разными ядрами AMIBIOS.
Посмотрел я файл ROM Bios () e030124s.rom) и нашёл там по смещению 00037DEA строку AMIBIOSC0700.
Есть ли в природе программа работающая(и заменяющая модули) под DOS с этим биос.
С уважением Виктор.
Отправить комментарий