Добавить код или работа с модулями AMI Bios

Модули 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.


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

И тут у меня возникает несколько вопросов:
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 уважением Виктор.

Аватар пользователя apple_rom

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

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

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

> Phoenix = LZSS/LZARI/LZINT

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

Аватар пользователя ivp

Игорь Турусов писал(-а):
> Phoenix = LZSS/LZARI/LZINT

а также LZHUF и LZINTUNF ...
Угу, именно... roll

- Ситчик веселенький есть?..
- Приезжайте, обхохочетесь!..

Root писал(-а):
Цитата:
Для проверки распаковывал каждый модуль под 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. Коды идентификации процессоров

+----------+----------+----------+---------------------------------------------------------------
|Тип       |Семейство |Модель    | Процессор
|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
+----------+----------+----------+---------------------------------------------------------------

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

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

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

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

Нет, к 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)

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

apple_rom писал(-а):
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 различаются. Кто нибудь в курсе почему?

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

Виктор X писал(-а):

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

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

Игорь Турусов писал(-а):
Виктор X писал(-а):

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

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

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

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

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

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей