Все микрокоды имеют размер 2048 байт, из которых 48 байт представляют заголовок файла, а оставшиеся 2000 байт – непосредственно обновляемый микрокод.
Это не верно! Из IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide раздел 9.11 MICROCODE UPDATE FACILITIES:
поле DataSize -
Цитата:
Specifies the size of the encrypted data in bytes, and must be a multiple of DWORDs. If this value is 00000000H, then the microcode update encrypted data is 2000 bytes (or 500 DWORDs).
На практике следующее, если DataSize = 0, то размер блока с микрокодом 2000 bytes, в противном случае = DataSize.
А ещё интересный момент заключается в том, что за блоком микрокода встречаются нули, о чем свидетельствует разница TotalSize - DataSize (обычно 400h, в моём случае ещё 8 нулей в конце модуля). Кстати у меня AMI BIOS от P5Q3.
Модуль этот для AMI можно получить при помощи MMTool, ID = 11 - P6 Micro Code.
Мой скрипт для IDA, для структурирования:
marinovsoft,
Это не верно! Из IA-32 Intel® Architecture Software Developer’s Manual Volume 3: System Programming Guide раздел 9.11 MICROCODE UPDATE FACILITIES:
поле DataSize -
На практике следующее, если DataSize = 0, то размер блока с микрокодом 2000 bytes, в противном случае = DataSize.
А ещё интересный момент заключается в том, что за блоком микрокода встречаются нули, о чем свидетельствует разница TotalSize - DataSize (обычно 400h, в моём случае ещё 8 нулей в конце модуля).
Кстати у меня AMI BIOS от P5Q3.
Модуль этот для AMI можно получить при помощи MMTool, ID = 11 - P6 Micro Code.
Мой скрипт для IDA, для структурирования:
#include <idc.idc> /* Анализ 11 модуля Microcode Update */ static main(void) { auto index, lSegEnd, idStruct, offDataSize, offTotalSize, DataSize, TotalSize, USize; lSegEnd = SegEnd(100) - 1; MakeUnknown(0, lSegEnd, 0); MakeUnknown(0, lSegEnd, 1); MakeUnknown(0, lSegEnd, 2); index = 0; CheckStructure(); idStruct = GetStrucIdByName("microcodeHeader"); offDataSize = GetMemberOffset(idStruct, "DataSize"); offTotalSize = GetMemberOffset(idStruct, "TotalSize"); while(index < lSegEnd) { if (Dword(index) == 0) { MakeArray(index, 1024); index = index + 1024; } MakeStructEx(index, -1, "microcodeHeader"); DataSize = long(Dword(index + offDataSize)); TotalSize = long(Dword(index + offTotalSize)); Message("> index=0x%04X | DSize=%d | TSize=%d | \n", index, DataSize, TotalSize); MakeQword(index + 48); if (DataSize == 0) DataSize = 2000; MakeArray(index + 48, DataSize / 8); index = ItemEnd(index + 48); } return; } //Добавляем структуру для дальнейшего использования static CheckStructure() { if (GetStrucIdByName("microcodeHeader") == BADADDR) { auto sMicrocodeHeader; AddStrucEx(BADADDR, "microcodeHeader", 0); //BADADDR = -1 добавить структуру в конец списка структур. sMicrocodeHeader = GetStrucIdByName("microcodeHeader"); AddStrucMember(sMicrocodeHeader, "HeaderVer", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "UpdRev", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "Date", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "ProcSign", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "CRC", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "LoaderRev", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "ProcFlags", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "DataSize", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "TotalSize", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "Reserved0", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "Reserved1", -1, FF_DWRD, -1, 4); AddStrucMember(sMicrocodeHeader, "Reserved2", -1, FF_DWRD, -1, 4); } }Если есть замечания с удовольствием выслушаю.