Добавить код или работа с модулями 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 уважением Виктор.

Забыл.

Возможно кто-то знает, как добавлять код в модуля, которые amibcp изменять не даёт.

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

P.S. Сорри за кривой репорт (перед постом смотрел - было всё Ok )

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

Виктор X
Можно разработать PCI AddOn ROM. Т.е. если, скажем, есть сетевуха без бутрома, то можно сделать такой модуль, что он якобы будет этим самым Бутромом и при вшитии в БИОС будет получать управление.
Минус такого метода - необходимо наличие карточки в компе, в противном случае "бутром" не получит управления.
Можете прочитать про данную методику (и не только) на сайте Pinczakko

Репорт подправил. Для таких случаев полезно использовать код [code]

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

Спасибо. Я в курсе предложенной ссылки. Помниться мне всё что было там описано, описано применительно к Award'am(пример как минимум), а меня интересует специфика работы с модулями AMI. А код написать и вставить я уже сумею.

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

Root

Спасибо за то что подправили репорт. За ссылку тоже спасибо. Добавлять возможность загрузки с сетевой мне не нужно(я сделал себе роутер из старого P 166 но изменял я не прошивку материнки а прошивку SCSI контроллера, потому что не было у меня сетевой с ROM чипом а биос материнки из-за добавлений настолько вырос что вставить туда что-либо без изменения алгоритма паковки не было возможности)

Всё что я понаходил за время изучения биосов в основном касалось AWARD'ов. Я надеюсь кого нибудь есть и документация на AMI касательно модулей.

Cудя по Вашему ответу, мои нужды не были поняты.
Уточняю:
> Я искал место куда могу вставить свой кусок кода. Для моих нужд самым приемлимым вариантом будет вставка кода как раз перед передачей управления на MBR(0000:7C00).

Я выбрал это место исходя из простых соображений. Если на этом этапе BIOS считывает сектора с HDD в память (почему-то не сразу передавая туда управление) то и я могу сделать тоже перед этим вызовом int 13h который считывет MBR в 0000:7C00.
amibcp править этот модуль не даёт. Ну и ладно. Я сделаю свой модуль. Но мои опасения насчёт того, что мои считывания HDD в память могут испортить уже имеющиеся в ней данные. (Я не знаю какие модуля какие области используют и не знаю порядка выполнения модулей на текущий момент) Скажем так я не знаю повлияет ли моя работа на прежнее фукционирование модулей. К примеру я тоже захотел использовать область 0000:7C00 для своих нужд и это могло бы привести к непредсказуемым результататм загрузки если runtime отрабатывается перед запуском моего модуля считав туда MBR(и ожидая выполнения всех остальных модулей чтобы потом передать управление на 0000:7C00 ибо он не сразу передаёт туда выполнение) , который я наверняка затру своими данными. Поэтому для меня порядок работы модулей критичен и критичны области памяти ими используемые.

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

Решил я воспользоваться для работы с модулями программой mmtool (Windows). Программа периодически сбоит, однако если не перемещаться по меню а сразу делать необходимые действия то можно добиться необходимых результатов. В моём случае я запустил прогу выбрал replace модулю runtime, и изменения прошли успешно(в отличие от amibcp которая не даёт это делать). Потом я решил проверить не испортила ли эта не стабильная программа сам ROM файл. Для проверки распаковывал каждый модуль под DOS с помощью amibcp и проверял с уже распаковваными эталонными вариантами. Как результат изменения были только в модуле runtime которыя я собственно и менял.
Поэтому вопрос о алгоритме паковки модулей стал для меня менее насущным(это не значит что меня он не интересует, но как я понял у многих необходимость трассировать вручную биос для выковыривания и описания алгоритмов вызывает полный и тотальный обломс:) )

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

P.S. Кто нибудь отзовитесь у кого есть таблица или любая информация о регистре edx который инициализируется при включении питания. Меня интересуют значения этого регистра в зависимости от модели процессора.

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

Не знаю, как насчет при включении, но при передаче управления BIOS'ом на загруженный boot(MBR) - в dl - номер диска.

А кому счас легко...

savely_s писал(-а):
Не знаю, как насчет при включении, но при передаче управления BIOS'ом на загруженный boot(MBR) - в dl - номер диска.

Да, да так и есть если загрузка идёт с винта
перед вызовом int 13h в ah=02( считывание),al=количество считываемых секторов dh=side , cx для сектора и цилиндра(младшие 6 байт для секора оставшиеся 2 байта уходят как старшие для цилиндра в ch), dl=80h(если загрузка с первого винта) 81h второго и т д. es:bx место куда считываем.

Но я не про это спрашивал:)
К примеру опишу несколько первых команд в биосе который я упоминал выше
итак первая команда по адресу F000:FFF0 в памяти, если посмотреть e030123s.rom с помощью hiew.exe это будет адрес 3FFF0 (если кому не ясно смотрите geocities.com/mamanzip/Articles/Award_Bios_RE/Award_Bios_RE_guide.html пункт 8.1.4)


итак имеем первую инструкцию
EACDFF00F0 jmp 0F000:0FFCD
смотрим далее тем же hiew адрес в файле 3FFCD имеем
E932C0 jmp 3C002 (это адресация в hiew) имеем
cli
cld
mov ax,cs
mov ss,ax
mov ebp,edx
nop
mov sp,0C012
jmp 3C715
(если не понятно куда передаётся управление читайте ссылку приведённую выше)
не знаю кого на сколько таких jmp'ов хватит но в конце концов обнаружиться инструкция по сравнению dx с каким либо числовым значением (не так чтобы это сильно мешало дальнейшему трассированию но хотелось бы знать какое значение dx в зависимости от модели процессора)
Пробегала через мои глаза какая-то англоязычная тех документация и в моей памяти смутно зацепилось что при инициализации ...... читайте пункт 8.1.4 вышеприведённой ссылки, ... бла бла бла и регистр edx получает значение модели ппроцессора(цитирую не дословно)

Просьба к тем кто кто знает как оно на самом деле объяснить что будет в регистре edx при включении питания.

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

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

Цитата:
перед вызовом 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

А кому счас легко...

Аватар пользователя 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
+----------+----------+----------+---------------------------------------------------------------

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

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

А теперь мой комментарий к тексту - короче, в EDX находится нечто вроде CPUIDа, если не он сам...
Да, и про сжатие - в Фениксах используется LZARI, в Авардах - LHA. В АМИ вроде тоже LZARI, хотя не уверен...
MmM, blood
я же просил сделать моноширинный русский и англицкий одинакового размера evil

Аццкий ромбовод {:€
Я пока не волшебник - я только учусь! :-P

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

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые 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.

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

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