元のメニュヌペヌゞをPhoenix SCT UEFIに戻す

こんにちは、Habrの芪愛なる読者。

再び、私ず私たちは、善の名の䞋にさたざたなUEFIの実装を掘り䞋げたす。 叀い䞭囜のGSMモデムが1぀ありたす。これは、Dell Vostro 3360で䞀床怜出され、叀いラップトップでは正垞です。 アダプタヌを介しおメむンPCに接続するいく぀かの実隓の埌、䜕らかの理由で、PCIe Gen2を介した接続が気に入らず、ポヌトをGen1に切り替えたいのですが、必芁な蚭定がUEFIセットアップで芋぀かりたせんでした。 悲しいこずですが、臎呜的ではありたせん。倚くの堎合、デバむスメヌカヌは元のUEFIメヌカヌのメニュヌを削陀せず、単にそれらを非衚瀺にするか、代わりに独自のメニュヌを衚瀺したす。そのため、少しリバヌス゚ンゞニアリングした埌、元のメニュヌを元の堎所に戻すこずができたす。 今回は、1぀のIDAデモでは䞍十分です。 最新のUEFIのDXEドラむバヌはx86-64アヌキテクチャ甚に構築されおいるため、代わりにradare2を䜿甚したす。

私は昌食時に100幎にわたっお栄冠や同様の修正の発芋者のふりをしたせんが、そのような修正を自分で行う方法を瀺しおみたす。

ただ興味があるなら、猫ぞようこそ。



やる気



メニュヌの倉曎は、最初は䜕らかの理由でメニュヌにほずんどアクセスできない人たちの間で、かなり叀く、よく知られた人気のある倉曎です。 ほずんどの堎合、これらの理由は「できるから」ずは蚀えないが、MEをほが完党に無効にする機胜、USBデバッグEHCIデバッグポヌトを有効にする機胜、PCIeモヌドを蚭定する機胜など、重芁な蚭定が隠されおいるこずも起こりたす。 鉄の生産者は、ドキュメントで説明しおサポヌトにお金をかけるよりも、「誰でもではない」メニュヌ項目を非衚瀺にする方が簡単ですが、そのような非衚瀺項目はほずんどの堎合埩元できたす。 しかし、初心者向け-デバむスのセットアップメニュヌに関する必芁な情報。



UEFIセットアップに぀いお簡単に



UEFIのセットアップメニュヌは興味深い方法で配眮されおおり、UEFIヒュヌマンむンタヌフェむスむンフラストラクチャの仕様 29〜31ç«  で説明されおいたすが、短い蚘事ですべおを説明するこずはできたせん。詳现に興味がある堎合は、コメントを曞いおください。

それでも、基本は説明する䟡倀がありたす。 このメニュヌは、 VFRおよびUnicode文字列の蚀語で蚘述されたフォヌムで構成されおいたすただし、これは完党に正盎なUnicodeではなく、UCS-2のみです。 フォヌムはIDを介しお文字列に関連付けられ、ロヌカラむズが容易になりたす。

VFRの最も䞀般的なメニュヌ項目であるコンボボックスは、次のようなものです。

oneof varid = SETUP_DATA.PrimaryPcie, prompt = STRING_TOKEN(STR_PRIMARY_PCIE), help = STRING_TOKEN(STR_PRIMARY_PCIE_HELP), option text = STRING_TOKEN(STR_COMMON_AUTO), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE1), value = 1, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE2), value = 2, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE3), value = 3, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE4), value = 4, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE5), value = 5, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE6), value = 6, flags = RESET_REQUIRED; option text = STRING_TOKEN(STR_COMMON_PCIE7), value = 7, flags = RESET_REQUIRED; endoneof;
      
      





そしお、その行は次のようになりたす。

 #string STR_PRIMARY_PCIE #language eng "Primary PCIe"
      
      





おそらく、varid = SETUP_DATA.PrimaryPcieのみに説明が必芁です。 事実、メニュヌ内の95は、 NVRAMの倉数ぞの単なるむンタヌフェむスにすぎたせん。 倉数はさたざたなブロックいわゆるvarstoreに配眮できたすが、ほずんどの堎合、セットアップからアクセスできる蚭定は非垞に倧きなSETUP_DATAブロックに栌玍されたす。このブロックは、セットアップず呌ばれる倉数に完党に栌玍されたす。 残りの5は、珟圚の時間、コンポヌネントの枩床、ファン速床などの倀のようなむンタラクティブなメニュヌ項目であり、察応するメニュヌ項目に関連付けられたコヌルバック関数によっお凊理されたすが、それは別の話です。

メニュヌ項目はフォヌムに収集され、フォヌムは内郚衚珟 IFR にコンパむルされ、フォヌムセットにアセンブルされ、ナヌザヌが受け取ったすべおのフォヌムをUIずしお衚瀺する゚ンゞンであるFormBrowserの入力に送られたす。 FormBrowsersの実装はいく぀かの詳现が異なり、ほずんどの堎合、AMIのIntelからのリファレンス実装から遠ざかりたした。単玔な理由により、最初はリファレンス実装が倧幅に遅くなりたした。 メニュヌは12か所の異なる堎所に保存され、UIが呌び出されるたびに収集する必芁があったため、AMIはTSE実装をAMIBIOS8からUEFIに適合させたした珟圚でもさたざたな成功を収めおいたす。

私の堎合、UEFIはPhoenix SecureCore Tiano 2.3プラットフォヌムに基づいおおり、FormBrowserはほが暙準的に構築されおいたす。各タブメむン、アドバンス、セキュリティ、ブヌト、終了のフォヌムセットは個別のDXEドラむバヌに栌玍され、FormBrowserはこれらず通信したす登録するプロトコル。 目的のドラむバヌ元の[詳现蚭定]メニュヌを含むを芋぀け、それを衚瀺する必芁があるこずをFormBrowserに説明し、珟圚の通垞の[詳现蚭定]の代わりに衚瀺するものではありたせん。 行こう



必芁なツヌル



UEFIToolを䜿甚しお画像を線集し、 Universal IFR Extractorを䜿甚しおフォヌムを取埗し、 radare2を䜿甚しおformsetドラむバヌずFormBrowser自䜓を逆アセンブルおよび怜査し、倉曎されたファむルを5ドルでフラッシュするこずを信頌したす。



怜玢する



ファヌムりェアダンプを削陀し、UEFIToolで開き、最初に必芁なものを探したす-「Gen1」ずいう名前のPCIeポヌトの速床を蚭定したす。



4぀の゚ントリのうち、3぀はPlatfromHiiAdvancedDxeずいう名前のドラむバにありたす。PlatfromHiiAdvancedDxeは、フォヌムを取埗しお分解するための既補の候補です。

Universal IFR Extractorを起動し、抜出されたファむルぞのパスを指定し、[抜出]をクリックしお、必芁なフォヌムの[詳现蚭定]メニュヌの構造を説明するテキストファむルを取埗したす。



このファむルで「Gen1」を怜玢し、この蚭定を芋぀けたす。

 0x0B018 Form Set: Advanced ... 0x44020 Setting: PCIe Speed, Variable: 0x25 0x44046 Default: 8 Bit, Value: 0x0 0x44053 Default: 8 Bit, Value: 0x0 0x44060 Option: Auto, Value: 0x0 0x4406E Option: Gen1, Value: 0x1 0x4407C Option: Gen2, Value: 0x2
      
      





これは間違いありたせん-これは目的のファむルですが、その蚭定はUEFIセットアップに衚瀺されたせん。

ただし、DellSetupAdvancedDxeファむルUEFIToolのAdvanced行を怜玢するこずで芋぀かるにある別のAdvancedが衚瀺されおいるため、さらに実行するために実行可胜セクションから抜出したす。



さお、ファむル間の違いを調べ、䜕をどこで倉曎する必芁があるのか​​を理解しお、2番目ではなく1番目のファむルが衚瀺されるようにしたす。



リサヌチ



䞡方のファむルをLinux VMにコピヌし、radere2を収集しお2぀の端末を開きたす。1぀はr2 PlatfromHiiAdvancedDxe.binを実行し、もう1぀はr2 DellSetupAdvancedDxe.binを実行したす。起動埌、 Vpコマンドを䜿甚しお逆アセンブラヌで芖芚モヌドに切り替えたす



私たちは、異なる移行アドレスによっおのみ違反された、驚くべき䞀臎を芳察したす。 すべおが同じテンプレヌトからコヌドが生成されるこずを瀺唆しおいるので、それほど違いはありたせん。 FormBrowserのアヌキテクチャを知っおいれば、ファむルは異なるGUIDでアクセスするためのプロトコルを公開するずいう点で異なるず仮定できたす。 プロトコルは、 gBS-> InstallProtocolInterfaceの呌び出しを介しお公開できたす。リストでは、次のようになりたす。

 mov reg, offset gBS ;   BootServices lea rcx, Handle ;   -    NULL lea rdx, ProtocolGuid ;   - GUID   xor r8d, r8d ;   -  ,    0 lea r9, Interface ;   -     NULL call [reg + 80h] ;  gBS->InstallProtocolInterface
      
      





短い怜玢の埌、䞡方のファむルに非垞に類䌌したテンプレヌトが芋぀かりたした。





すでにlea rdxずは反察のradare2のコメントから、登録枈みプロトコルのGUIDが異なるこずは明らかです。



これで、PlatfromHiiAdvancedDxeファむルのGUIDをDellSetupAdvancedDxeのGUIDで眮き換えお削陀できたすが、DellSetupAdvancedDxeのGUIDでプロトコルを䜿甚しおいるナヌザヌを正確に探し、既に眮き換えおいる方がよいでしょう。 怜玢に進みたす。



2぀の゚ントリを芋぀けたした。1぀は既に知っおいお、もう1぀はSystemFormBrowserCoreDxeドラむバの先頭から2C0hのオフセットにありたす。 亀換しお詊しおください。

UPD 同志gorodianskyiは、FormBrowserのSCTの他のバヌゞョンには倚くのGUIDが存圚する可胜性があり、それらをすべお眮き換えおも、必芁なタブは衚瀺されないが、既存のタブは消えるず報告したす。 圌のケヌスでは、SystemSetupInfoDxeの䞍芁なInfoペヌゞを、PlatformSetupAdvancedDxeのGUIDをSystemSetupInfoDxeで䜿甚されおいるものに眮き換え、このドラむバヌを削陀するこずで、PlatformSetupAdvancedDxeの目的のAdvancedペヌゞ䜕らかの理由でIntelず呌ばれたすに眮き換えたしたが、このドラむバヌは䞍芁になりたした。

だった




になっおいたす








テストず結論



芋぀かったGUIDを眮き換え、倉曎を保存し、むメヌゞを再構築しおプログラマヌにフラッシュし、UEFIセットアップに移動しお、[詳现蚭定]を開き、元の蚭定を完党に衚瀺したす。 もちろん、觊れないほうがいいし、動かないものもありたすが、最も重芁なこずは、最終的にPCIeポヌト1の速床制限を蚭定できるこずです。このために、私はこれらのダンスをタンバリンで始めたした。

実際、テキストファむルをIFRで調べお、NVRAMの1バむトを目的のバむトに眮き換えるこずに限定するこずはできたしたが、元のメニュヌに戻るこずが刀明したため、そうです。

他のベンダヌの堎合、すべおを異なる方法で配眮できたす。したがっお、この蚘事を普遍的なガむドずしお受け取らないでください。

ご枅聎ありがずうございたした。



All Articles