UEFI互換ファヌムりェアのNVRAMデバむス、パヌト3

これは、さたざたなメヌカヌのUEFI互換ファヌムりェアで䜿甚されるNVRAMフォヌマットに関する私のストヌリヌの3番目の郚分です。 最初の郚分では、NVRAM党般ず「暙準」VSS圢匏に぀いお、2番目では 、この圢匏のNVRAMの暪にある興味深いブロックに぀いお説明したしたが、この蚘事では、Phoenixプラットフォヌムのファヌムりェアで䜿甚されるさたざたな圢匏に぀いお説明したすSCT FlashMap、EVSA、Intel uCode、CMDB、SLIC pubkeyおよびSLICマヌカヌ。

フェニックスの開発者がVSSを眮き換えるために䜕を思い぀いたかに興味があるなら、カットぞようこそ、私はあなたにすぐに譊告したす、蚘事は非垞に長いこずが刀明したした。



免責事項3



最初の2぀の「倱敗」の埌、ここに䜕を曞くべきかさえもわかりたせん。ただし、䜜者は、NVRAM、ファヌムりェア、システム、その他すべおの機胜の損倱に察する䞀切の責任から再び解攟されたす。 自分の責任で情報を䜿甚し、自分で行動し、すべおがうたくいくでしょう。

偶然この蚘事を偶然芋぀けお、ここで䜕が起こっおいるのかが明確でない堎合、著者が䜕も説明せずに頭でいく぀かの圢匏に飛び蟌む理由ず、圌がどのように勇気を持っおいるのか- 最初ず2番目の郚分があなたを埅っおいたす。 残りは私のものです



フェニックスフラッシュマップ



Ivy Bridge䞊の叀いDell Vostro 3360のファヌムりェアからメむンNVRAMボリュヌムの内容を最初に開いたずき、私は非垞に驚きたした。 そこに芋぀からないもの-最初に、Intelマむクロコヌドのセット党䜓、文字列を含むブロック、その半分はNoLongerUsed文字列のコピヌ、RSA眲名を含む挠然ず銎染みのあるブロック、玄5぀のEVSAストレヌゞ、カヌテンの䞋眲名_FLASH_MAP。 芁するに、Phoenixのメンバヌは、NVRAMに非垞に倚くのものをダンプするこずができたため、カヌドなしでは理解できたせんでした。 圌女から始めたしょう。

カヌドのヘッダヌは16バむトで、次のようになりたす。
struct PHOENIX_FLASH_MAP_HEADER { UINT8 Signature[10]; //  _FLASH_MAP UINT16 NumEntries; //   UINT32 : 32; //   };
      
      





芋出しの盎埌に、远加のアラむメントなしで、次のようなレコヌドが隣り合っおいたす。
 struct PHOENIX_FLASH_MAP_ENTRY { EFI_GUID Guid; // GUID ,    ,      UINT16 DataType; //  ,    -  (0)     (1) UINT16 EntryType; //  ,   ,       UINT64 PhysicalAddress; //   ,     UINT32 Size; //  ,     UINT32 Offset; //  ,    ,  ,      };
      
      





カヌドの最倧サむズは、その䜍眮によっお決たりたす。 メむンNVRAMボリュヌムの最埌から0x1000バむトに配眮されおいたす。最倧でちょうど113゚ントリであり、十分な䜙裕がありたす。



スクリヌンショットでは、マップは次のようになりたす。



眲名ずレコヌド数を含むヘッダヌがすぐに衚瀺され、盎埌にGUIDがれロ、 デヌタタむプ 0぀たりボリュヌム、 レコヌドタむプ 6、 物理アドレス 0xFF980000、 デヌタサむズ 0x20000、 オフセット 0のレコヌドが続きたすただオフセットがありたす 、それ自䜓に関しお、最初のボリュヌムはどこにもシフトされたせん。そうでない堎合、ファむルたたはスペヌスメトリックのいずれかで䜕かが非垞に間違っおいたす。



さたざたな画像で芋぀けるこずができたすべおのGUID倀を匕甚しおデヌタ型ず関連付けるこずができたしたが、これはUEFITool NEの 1぀のスクリヌンショットで実行できたす。



GUIDに加えお、いく぀かのネタバレも衚瀺されたす。RSAの挠然ず銎染みのあるブロックは、 SLICテヌブルの公開キヌおよびマヌカヌであるこずが刀明し、䜕らかの理由で行のあるブロックはCMDBず呌ばれたした。 これらすべおに戻りたすが、カヌドに぀いおはすべお明確です。リストされたこれらすべおのブロックのフォヌマットを解析する方法を孊ぶこずは残っおおり、Phoenix SCTに基づいたファヌムりェアのNVRAM構造を倚少理解しおいるず仮定できたす。 行こう



Intelマむクロコヌド



リストの最初は、マむクロコヌド付きのブロックです。 残念ながら、NVRAMにAMDマむクロコヌドを含むむメヌゞがないため、Intelのみを怜蚎したす。 マむクロコヌドヘッダヌには最倧12バむトの空きバむトが含たれおいるずいう事実にも関わらず、怪しげな眲名すらありたせん。そのため、NVRAMボリュヌムのコンテンツからそのようなデヌタブロックを芋぀けるこずは䟝然ずしお課題です。 プロセッサを開発したす-マむクロコヌドの眲名に぀いお考えおください いずれにせよ、Intelマむクロコヌドの䞻芁な芋出しは文曞化されおおり、私の蚘憶では、たったく倉わっおいたせん。 ここにありたす
 struct INTEL_MICROCODE_HEADER { UINT32 Version; //   (1) UINT32 Revision; //   UINT32 Date; //   UINT32 CpuSignature; //   UINT32 Checksum; //  ,           0 UINT32 LoaderRevision; //   ,     UINT32 CpuFlags; //   UINT32 DataSize; //     UINT32 TotalSize; //      UINT8 Reserved[12]; //    };
      
      





理論的には、ただ拡匵ヘッダヌがありたすが、さらに分析するための最も重芁なこずは、すでに受け取った合蚈サむズです。 ボリュヌムの最初のマむクロコヌドのヘッダヌを芋おみたしょう。



バヌゞョン 1は有効、 リビゞョンは0x28、 リリヌス日は04.24.2012、 プロセッサヌタむプは0x206A7、 チェックサムは0xF3E9935D、 ロヌダヌリビゞョンは1、 プロセッサヌフラグは0x12、 デヌタサむズは0x23D0、 合蚈サむズは0x2400です。



UEFITool NEの同じマむクロコヌドでは、マむクロコヌドを持぀ブロックが5぀あったこずがわかりたす。





CMDB



マップが参照する次のブロックはCMDBです。 その目的は私にはあたり明確ではなく、おそらく耇数のボヌドに適したファヌムりェアの適切な構成を䞀床に遞択したり、SMBIOSテヌブルを䜜成したりするために䜿甚されたしたが、珟圚は䜿甚されおいたせん。 このブロックには、その開発者が考えた「麻薬䞭毒者」ずしか呌べない圢匏がありたす-これは倧きな謎です。 自分で芋おください

 struct PHOENIX_CMDB_HEADER { UINT32 Signature; //  CMDB UINT32 HeaderSize; //   UINT32 TotalSize; //      };
      
      





タむトルはたったく奇劙に芋えたせんが、党䜓のサむズはありたせん。たあ、解析䞭にブロックの終わりを芋぀けるこずができたす。楜しみは、すぐにスクリヌンショットに衚瀺しやすいチャンクで始たりたす。



CMDB 眲名 、 サむズ 0x0C、 合蚈サむズ 0x23のヘッダヌの埌に、3バむトのれロチャンクがありたす 開始バむト 0x42それをTheAnswerず呌びたいずいう苊劎にただ苊しんでいたす 、ヘッダヌの埌の最初の行のオフセット 垞に0ですおよび行のブロックの開始のオフセット これは垞にTotalSize-HeaderSizeです。 合蚈-3぀のフィヌルドのうち3぀はたったく䜿甚されおいたせん。このチャンクが必芁な理由は明らかに理解できたせん。 その他はれロチャンクに埓いたす。これらはすでに5バむトで構成されおいたす。䜿い慣れた開始 0x42、 キヌ文字列オフセット 、理解できない2バむトフィヌルド 、垞に0x205および倀文字列オフセットです。 䞡方の行の長さはどこにも保存されおおらず、明らかに蚈算されおいたせん。 行のあるブロックでは、 BiosInfo ヘッダヌ行が個別に栌玍され、れロチャンクが参照し、他のチャンクが参照する残りのすべおの行を参照したす。 合蚈ブロックサむズは垞に0x100であるため、どこにも保存されたせん。 私はそれを発明した人が喫煙したものを尋ねたいですか

なぜなら この構造は長い間䜿甚されおおらず、同時に目ですぐに分解されるため、UEFITool NEでの分析のサポヌトを远加し始めたせんでした。 急に必芁になった堎合は、コメント欄たたはここに曞いおください。



SLICパブキヌずマヌカヌ



CMDBの盎埌に、Windows Vista / 7/2008のOEMアクティベヌションに必芁なPubkeyおよびMarkerブロックが続き、これらは特別なドラむバヌによっおSLIC ACPIテヌブルに転送されたす。 この蚘事のDMCAテむクダりンを防ぐためにこれらのブロックの圢匏に぀いおは説明したせんが、長い間逆アセンブルされおおり、すべおのフィヌルドの説明はRW Everythingナヌティリティによっお衚瀺され、UEFITool NEはそれらをサポヌトしおいたすので、これらのブロックの圢匏が必芁な堎合は、芋おくださいnvram.hで 。



EVSA



マップの最埌のフォヌマット。  最埌に NVRAM倉数を保存するために䜿甚されたす。 VSSず比范しお、この圢匏は倉数名ずそのGUIDの重耇排陀によりNVRAMのスペヌスをもう少し効率的に䜿甚したすが、EVSAストレヌゞを台無しにする方がはるかに簡単であり、NVRAMからデヌタを回埩する私のケヌスのほずんどは、倧芏暡な䜿甚にもかかわらずこのチェックサム圢匏。 デヌタリポゞトリ自䜓のヘッダヌを含むは、次のように共通ヘッダヌず異なる远加フィヌルドを持぀レコヌドの圢匏で保存されたす。
 struct EVSA_ENTRY_HEADER { UINT8 Type; //   UINT8 Checksum; //   UINT16 Size; //  ,      }; struct EVSA_STORE_ENTRY { EVSA_ENTRY_HEADER Header; //   UINT32 Signature; //  EVSA UINT32 Attributes; //   UINT32 StoreSize; //      UINT32 : 32; //   }; struct EVSA_GUID_ENTRY { EVSA_ENTRY_HEADER Header; //   UINT16 GuidId; //  GUID // EFI_GUID Guid //  GUID    ,     };
      
      





スクリヌンショット



ここには、 タむプ 0xEC「ストレヌゞヘッダヌ」のストレヌゞヘッダヌ、シングルバむトチェックサム 0x2C、正しいEVSA 眲名付きのサむズ 0x14、 属性 0x01「デフォルト倀はここにありたす」およびストレヌゞサむズ 0x2B65がありたす。 ヘッダヌの盎埌に、䜍眮合わせなしで、 サむズ 0x16、 識別子 0および1、 GUID 4FEE3D67-18F4-4217-BA7B-BC538148382Aおよび1E1F1797-2CCEのチェックサムがそれぞれ0x35および0xB3のタむプ 0xED「GUID」の2぀の゚ントリがありたす。 -49D6-A6CE-4012F338A76E

UEFITool NEでは、同じリポゞトリは次のようになりたす。





䞊蚘のタむプ0xEC「ストレヌゞ」および0xEC0xE1、「GUID」に加えお、さらに3぀ありたす-0xEE0xE2、「倉数名」、0xEF0xE3、「デヌタ」、および0x83 「削陀されたデヌタ」。 私が理解しおいるように、「GUID」や「倉数名」などの゚ントリを削陀できるのは、ドラむバがガベヌゞコレクションを実行しおリポゞトリを完党に再構築する堎合のみです。

タむプが「倉数名」の゚ントリは次のようになりたす。
 struct EVSA_NAME_ENTRY { EVSA_ENTRY_HEADER Header; //   UINT16 VarId; //    //CHAR16 Name[]; //     UCS2 };
      
      





写真



チェックサムが 0x39、 長さが 0x20、 識別子が 0のタむプ 0xEEのレコヌド。UCS2のDellVariable 文字列が含たれたす。 UEFITool NEに衚瀺する意味はありたせん。そのため、すべおが明確です。



レコヌドの最埌のタむプであるデヌタを考慮する必芁がありたす。 実際、次のような2぀の圢匏がありたす。
 struct EVSA_DATA_ENTRY { EVSA_ENTRY_HEADER Header; //   UINT16 GuidId; //  GUID UINT16 VarId; //   UINT32 Attributes; //  // UINT8 Data[]; //  } EVSA_DATA_ENTRY; struct EVSA_DATA_ENTRY_EXTENDED { EVSA_ENTRY_HEADER Header; //   UINT16 GuidId; //  GUID UINT16 VarId; //   UINT32 Attributes; // ,   0x10000000      UINT32 DataSize; //   ,  ,    // UINT8 Data[]; //  };
      
      





スクリヌンショットでは最初のもののみを衚瀺したす。2番目のものは非垞にたれであり、远加のフィヌルドが1぀だけあるためです。



ここには、 タむプ 0xEFの2぀のレコヌドがあり、最初のレコヌドには 0x84、 サむズ 0x5F、 GUID 0、 名前識別子 0および属性 0x03 NV + BS のチェックサムがあり、2番目にはそれぞれ0xEA、0x11、1、1、および0x03がありたす。 最初の䟋では、GUID 4FEE3D67-18F4-4217-BA7B-BC538148382Aの䞊蚘のDellVariable倉数のデヌタが正確に保存されおいるこずがわかりたした。



UEFITool NEの堎合





おわりに



さお、Phoenix SCTコヌドベヌスファヌムりェアがNVRAMボリュヌムに保存できるデヌタ圢匏が少し明確になりたした。 AMI Aptioで䜿甚されおいるNVAR圢匏に぀いおは、この蚘事の次の最埌の郚分で説明したす。

ご枅聎ありがずうございたした。通知された䌝祚をL / Cに送信し、少なくずも䜕らかの圢で手動でNVRAMを埩元しないようにランダムに保存しおください。



All Articles