Модули 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 уважением Виктор.
AMI = LZINT
Phoenix = LZSS/LZARI/LZINT
>теперь мой комментарий к тексту - короче, в EDX находится нечто вроде CPUIDа, если не он сам...
аз есьмь... (в плане - что-то типа "в натуре" - по старославянски)
п.с. без знания всей "карты памяти" и принципов работы ами вставить код не получится. Обходной путь - использование "юзерромовских" модулей (запудривание мозга биосу прикидываясь крайне полезным PCI-девайсом).
а также LZHUF и LZINTUNF ...
Угу, именно... :roll:
>> хм... метод неточный.
Согласен что неточный. Моё окончательное решение было работать с mmtool(Windows) оттуда я модуль необходимый вытащил, изменил его потом всунул обратно потом для контроля проверил все остальные вытащенные (запустив опять mmtol c изменённой версией BIOS)
За информацию спасибо - её я и искал. Что вышло из моих экспериментов напишу ниже.
С уважением Виктор.
У меня создаётся впечатление, что мы друг друга не поняли. Меня интересовала информация о регистрах на момент включения питания, а не на момент передачи управления на MBR(или любой другой загрузчик который начинает выполянться после отработки BIOS)
С уважением Виктор.
Вставить код мне удалось, именно туда куда и нужно было. Об этом опишу ниже.
С уважением Виктор.
Запускаю 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 ) отписывайте к админам форума. Если они разрешат я солью то с помощью чего экспериментировал.
Кто нибудь скажет есть ли версия amibcp под DOS или в крайний случай под Windows, которая позволяет заменять все модули. (amibcp 7.51.03 не дал мне заменить модуль runtime).
Плюс я заметил что репорт который выдаёт amibcp и mmtool различаются. Кто нибудь в курсе почему?
С уважением Виктор.
Все предельно просто - эти утилиты предназначены для работы с разными ядрами AMIBIOS.
Посмотрел я файл ROM Bios () e030124s.rom) и нашёл там по смещению 00037DEA строку AMIBIOSC0700.
Есть ли в природе программа работающая(и заменяющая модули) под DOS с этим биос.
С уважением Виктор.