हिडन इंसाइड यूईएफआई BIOS सेटिंग्स तक पहुंचें

हेलो हब्र!

मेरी कंपनी के निर्देशों में से एक वर्चुअलाइजेशन के क्षेत्र में तकनीकी समाधानों की बिक्री है। ड्यूटी पर, हमें पायलट प्रोजेक्ट करना होगा या टेस्ट स्टैंड की व्यवस्था करनी होगी। हाल ही में, Citrix ने XenClient XT नामक एक नया उत्पाद जारी किया है, जो अनिवार्य रूप से एक प्रथम-स्तरीय क्लाइंट हाइपरवाइज़र है, अर्थात यह शुद्ध हार्डवेयर पर काम करता है। क्लाइंट हाइपरविजर का मुख्य विचार अपने स्वयं के लैपटॉप पर वर्चुअल मशीन बनाना है। यह कहां और कैसे लागू होता है - छोड़ना।

सभी आधुनिक इंटेल और एएमडी प्रोसेसर हार्डवेयर वर्चुअलाइजेशन तकनीक का समर्थन करते हैं।
और इसलिए, मेरे निपटान में एक H77 चिपसेट और एक इंटेल कोर i7-3820QM प्रोसेसर वाला एक लैपटॉप था। निर्माता से विनिर्देशों के अनुसार, मेरे प्रोसेसर ने इंटेल वर्चुअलाइजेशन टेक्नोलॉजी (वीटी-एक्स) और इंटेल वर्चुअलाइजेशन टेक्नोलॉजी फॉर डायरेक्टेड आई / ओ (वीटी-डी) प्रौद्योगिकियों का समर्थन किया। यदि पहला लगभग सभी नए लैपटॉप पर उपलब्ध है, तो दूसरी तकनीक केवल शीर्ष मॉडल पर ही मिलती है। लेकिन यह कई फायदे प्रदान करता है, जैसे कि आभासी पर्यावरण के लिए GDU का प्रत्यक्ष अग्रेषण, इसलिए क्लाइंट मशीन को पूर्ण 3 डी समर्थन मिलता है। लेकिन आइए इस लेख के विषय के अलावा अन्य तकनीकों पर ध्यान न दें।

मेरे BIOS में, VT-x को सक्षम करना संभव था, लेकिन शुरू में VT-d प्रौद्योगिकी नियंत्रण प्रदान नहीं किया गया था।

कुंठित भावनाओं में, मैं इंटरनेट पर विभिन्न संसाधनों के लिए भटकने लगा और दो बहुत ही दिलचस्प संसाधनों के साथ आया: mydigitallife और bios-mods

यह पता चला कि अधिकांश BIOS सेटिंग्स औसत उपयोगकर्ता से छिपी हुई हैं। कारण स्पष्ट है - उपयोगकर्ताओं को लोहे को प्रारंभिक करने के लिए सेटिंग्स के साथ छेड़छाड़ न करें, ताकि हाथों में "ईंटों" के साथ जिज्ञासु "दाढ़ी वाले" विषयों की सेवा से सेवा केंद्रों पर कतारें न बनाएं।

प्रौद्योगिकी के साथ शुरुआती परिचित ने मुझे कुछ भ्रम में डाल दिया। उपयोगिताओं का एक गुच्छा मेरे लिए अपरिचित, नई शर्तें, अतुलनीय व्याख्याएं ... मैंने पीड़ित नहीं होने का फैसला किया और दोनों संसाधनों पर लिखा कि मैं किसी ऐसे व्यक्ति को भुगतान करने के लिए तैयार था जो मुझे मुझसे छिपाए गए मेनू को खोलने में मदद करेगा। ऐसा करने के लिए, कोडांतरक कोड में तल्लीन करना, कई चेक निकालना, पैच किए गए BIOS को फ्लैश करना आवश्यक था, और आपके पास अपने BIOS का एक पूर्ण मेनू है।

इसलिए मैंने एक सप्ताह इंतजार किया, और कोई भी कमाई नहीं करना चाहता था ... अच्छी तरह से, या नहीं कर सकता।

अपने आप को एक साथ खींचते हुए, मैंने यह पता लगाने का फैसला किया कि यह BIOS कैसे काम करता है और पैच को खुद बनाता है। दो हफ्ते बाद, और रूसी IXBT समुदाय की मदद से , मैंने अपने टेस्ट लैपटॉप के बायोस के लिए अपना पहला पैच लिखा। अपनी उँगलियों को पार करके और साँस की सांस के साथ मैंने अपना लैपटॉप फ्लैश किया ...

क्या आपको याद है कि जर्जर वर्षों में हम मदरबोर्ड के लिए नए BIOS के साथ हमारी सिस्टम इकाइयों को फ्लैश कर रहे थे? फिर शिलालेख स्क्रीन पर चमक गया, वे कहते हैं कि फर्मवेयर के अंत तक किसी भी स्थिति में कंप्यूटर बंद न करें? ऐसे मामले थे जब, एक अजीब संयोग से, यह उस क्षण था जब बिजली बंद हो गई थी ... परिणामस्वरूप, उन्हें एक बड़ा, गैर-कार्यात्मक बॉक्स मिला। आगे क्या किया गया - कहानी चुप है।

मेरा लैपटॉप चालू नहीं हुआ। बैटरी के साथ पावर आउटेज उससे डरते नहीं हैं। लेकिन यहां मैंने कुछ गलत किया। मानसिक विकार कोई सीमा नहीं जानता था। मेरे महान आनंद के लिए, यह पता चला कि BIOS में एक रिकवरी फ़ंक्शन है और सरल कुंजी संयोजनों और पूर्व-तैयार फ्लैश ड्राइव के माध्यम से, लैपटॉप को पुनर्जीवित किया जा सकता है।

मैं दूसरे तरीके से गया: मैंने उन स्थानों को पैच किया, जो BIOS की कार्यक्षमता को प्रभावित नहीं कर सकते, या लोगो को प्रतिस्थापित कर सकते हैं। मैं फिर से भड़की और फिर से एक ईंट मिली। इस मामले में अनुभवी व्यापारियों के साथ सोचने और परामर्श करने के बाद, हम इस निष्कर्ष पर पहुंचे कि आधुनिक यूईएफआई बायोस की फर्मवेयर छवि के चेकसम के लिए एक माध्यमिक जांच है। पहला चेक तब होता है जब आप फ्लैश करने की कोशिश करते हैं, और दूसरा जब BIOS शुरू होता है। अगर पहले मामले में मैंने फ्लैशर को भी पैच किया, ताकि यह चेकसम को चेक न करे, तो मैं दूसरे चेक को पार नहीं कर सकता, क्योंकि यह हार्डवेयर में ही वायर होता है।

फिलहाल, हमारे पास निम्नलिखित हैं: आप EFI BIOS को पैच कर सकते हैं और UEFI नहीं कर सकते। मेरा, ज़ाहिर है, दूसरा मामला है। फिर से, इंटरनेट पर एक लंबी खोज और मैं सोनी वायो लैपटॉप, ईएफआई के रास्ते पर इंसिडेएच 2 ओ पर लेख सक्षम करें वीटी पर आता हूं
विधि का सार सरल है: आप एक विशेष बूटलोडर का उपयोग करके ईएफआई मोड में बूट करते हैं और वीएसएस मेमोरी तक पहुंच प्राप्त करते हैं, जहां आपके BIOS सेटिंग्स संग्रहीत हैं। मैंने परीक्षण किया कि यह मेरे लैपटॉप पर काम करता है, उत्कृष्ट आईडीए डिस्सेम्बलर को फिर से खोल दिया, नवीनतम विनिर्देशों को डाउनलोड किया , और पूरी तरह से सशस्त्र, मेरे BIOS को टटोलना शुरू कर दिया।

दो सप्ताह के काम का एक सफल परिणाम एक थकाऊ मेनू था
इसका एक छोटा सा हिस्सा
╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ FormSet: 'Main' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Form Name: 'Main' [ ID: '0x0001' ]│ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ┌- Grayout IF: | Question [ ID: '0x08' ] == 0x02 | Question [ ID: '0x07' ] == 0x01 | AND expression └- END IF Grayout; Time: 'System Time' [ QuestionId: '0x01', VarStore: '0xffff', Help: '<Enter> selects field.' ] Default value: '00:00:00', Type: 0x05 Date: 'System Date' [ QuestionId: '0x02', VarStore: '0xffff', Help: '<Enter> selects field.' ] Default value: '2010/05/01', Type: 0x06 ┌- Grayout IF: | EQ == TRUE | Text: 'Notebook Model' Default: '[Not Detected]' Help: ' ' | Text: 'Product Number' Default: '[Not Detected]' Help: ' ' | Text: 'System Board ID' Default: '[Not Detected]' Help: ' ' | Text: 'Born On Date' Default: '[Not Detected]' Help: ' ' | Text: 'Processor Type' Default: '[Not Detected]' Help: ' ' | ┌- Suppress IF: | | Question [ ID: '0x06' ] == 0x00 | | Text: 'Processor Speed' Default: '[Not Detected]' Help: ' ' | └- END IF Suppress; | Text: 'Total Memory' Default: '[Not Detected]' Help: ' ' | Text: 'BIOS Version' Default: 'Fake Data' Help: ' ' | Text: 'BIOS Vendor' Default: 'Insyde' Help: ' ' | Text: 'Serial Number' Default: '[Not Detected]' Help: ' ' | Text: 'UUID Number' Default: '[Not Detected]' Help: ' ' | Text: 'Product configuration ID' Default: '[Not Detected]' Help: ' ' | Text: 'System Board CT Number' Default: 'C AAAA RR SS WW XXX' Help: ' ' | Text: 'Factory installed OS' Default: '[Not Detected]' Help: ' ' | ┌- Suppress IF: | | Question [ ID: '0x05' ] == 0x00 | | Text: 'Primary Battery SN' Default: 'N/A' Help: ' ' | └- END IF Suppress; | ┌- Suppress IF: | | Question [ ID: '0x04' ] == 0x00 | | Text: 'Secondary Battery SN' Default: '' Help: ' ' | └- END IF Suppress; | | | ┌- Suppress IF: | | EQ == TRUE | | | | | └- END IF Suppress; └- END IF Grayout; Reference: 'System Log' [ FormID: '0x0540', QuestionId: '0x03', VarStore: '0xffff' ] ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Form Name: 'System Log' [ ID: '0x0540' ]│ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ Subtitle: 'System Log' Action: ' ' [ QuestionId: '0xfffe', VarStore: '0xffff', Help: View the system diagnostic failure results. ] Text: 'Result:' Default: 'Time:' Help: 'View the system diagnostic failure results.' ┌- Grayout IF: | EQ == TRUE | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' | Text: ' ' Default: '- No Data -' Help: 'View the system diagnostic failure results.' └- END IF Grayout; Text: ' ' Default: ' ' Help: 'View the system diagnostic failure results.' ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ FormSet: 'Security' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Form Name: 'Security' [ ID: '0x0001' ]│ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ Password: Administrator Password [ VarStore: '0x9d', Help: 'Administrator Password controls access to the setup utility.'] Password: Power-On Password [ VarStore: '0xa1', Help: 'Power-On Password controls access to the system at boot.'] ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ FormSet: 'Main' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Form Name: 'Main' [ ID: '0x0001' ]│ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'InsydeH2O Version' Default: 'Fake Data' Help: ' ' ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'System Memory Speed' Default: '[Not Detected]' Help: ' ' ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; ┌- Grayout IF: | VALUE = 1 | VALUE = 1 | EQUAL expression └- END IF Grayout; Text: 'Total Memory' Default: '[Not Detected]' Help: ' ' ┌- Grayout IF: | Question [ ID: '0x05' ] == 0x02 | Question [ ID: '0x04' ] == 0x01 | AND expression └- END IF Grayout; Time: 'System Time' [ QuestionId: '0x01', VarStore: '0xffff', Help: 'This is the help for the hour, minute, second field. Valid range is from 0 to 23, 0 to 59, 0 to 59. INCREASE/REDUCE : +/-.' ] Default value: '00:00:00', Type: 0x05 Date: 'System Date' [ QuestionId: '0x02', VarStore: '0xffff', Help: 'This is the help for the month field, day field, year field. Valid range is from 1 to 12, 1 to 31, 2000 to 2099. (Error checking will be done against month/day/year combinations that are not supported.) INCREASE/REDUCE : +/-.' ] Default value: '2011/05/01', Type: 0x06 Action: 'About this Software' [ QuestionId: '0x1059', VarStore: '0xffff', Help: ] ┌- Suppress IF: | LIST [ ID: '0x04' ] in ('0x00','0x01') | Select option: 'Debug Reclaim' [ VarStore: '0x1d7', QuestionId: '0x03', Help: ' '] | Option: 'Enabled' [ Value: '1' Default: 'false' Type: 'int8' ] | Option: 'Disabled' [ Value: '0' Default: 'true' Type: 'int8' ] └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ┌- Suppress IF: | EQ == TRUE | └- END IF Suppress; ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗ ║ FormSet: 'Advanced' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╟────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╢ ║ VarStore Id: '0x1234', Size: '900', Name: 'SystemConfig' GUID: a04a27f4-df00-4d42-b552-39511302113d ║ ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝ ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │ Form Name: 'Advanced' [ ID: '0x0001' ]│ └────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ Reference: 'Boot Configuration' [ FormID: '0x0021', QuestionId: '0x01', VarStore: '0xffff' ] Reference: 'Peripheral Configuration' [ FormID: '0x0022', QuestionId: '0x02', VarStore: '0xffff' ] Reference: 'IDE Configuration' [ FormID: '0x0023', QuestionId: '0x03', VarStore: '0xffff' ] Reference: 'Thermal Configuration' [ FormID: '0x0024', QuestionId: '0x04', VarStore: '0xffff' ] Reference: 'Video Configuration' [ FormID: '0x0025', QuestionId: '0x05', VarStore: '0xffff' ] Reference: 'USB Configuration' [ FormID: '0x0026', QuestionId: '0x06', VarStore: '0xffff' ] Reference: 'Chipset Configuration' [ FormID: '0x0027', QuestionId: '0x07', VarStore: '0xffff' ] Reference: 'ACPI Table/Features Control' [ FormID: '0x0028', QuestionId: '0x08', VarStore: '0xffff' ] Reference: 'PCI Express Configuration' [ FormID: '0x0030', QuestionId: '0x09', VarStore: '0xffff' ] Reference: 'Intel(R) Anti-Theft Technology Support' [ FormID: '0x0038', QuestionId: '0x0a', VarStore: '0xffff' ] Reference: 'Extended ICC' [ FormID: '0x1cc0', QuestionId: '0x0b', VarStore: '0xffff' ] Reference: 'DPTF Configuration' [ FormID: '0x3610', QuestionId: '0x0c', VarStore: '0xffff' ] Reference: 'Intel(R) Smart Connect Technology Configuration' [ FormID: '0x1e00', QuestionId: '0x0d', VarStore: '0xffff' ] 


मैंने सफलतापूर्वक वीएसएस मेमोरी तक पहुंच के साथ बूटलोडर में बूट किया, जिन चर की मुझे आवश्यकता थी, उन्हें पंजीकृत किया और जो मेरे काम के साथ गायब या बाधित था उसे चालू या बंद कर दिया।

खैर, अब आपके साथ यह कैसे करना है।

टूलकिट तैयारी


1. आपको इस मंच से फीनिक्सटूल डाउनलोड करने की आवश्यकता है, जहां वर्तमान संस्करण लगातार बाहर रखा गया है। आपको फर्मवेयर फ़ाइल को इसके घटकों में विघटित करने की आवश्यकता होगी।
2. आपको पर्ल की जरूरत है। यदि आपके पास एक UNIX सिस्टम है, तो सब कुछ सरल है, यदि नहीं, तो Windows के लिए ActivePerl या Cygwin
3. आपको अपने निर्माता से नवीनतम BIOS की आवश्यकता है।
4. कोई भी अभिलेखागार।

फर्मवेयर छवि प्राप्त करना


। अभिलेखागार के साथ अपने फ़र्मवेयर की exe फ़ाइल खोलें, एक्सटेंशन बिन या fd के साथ फ़ाइल ढूंढें और इसे आपके लिए सुविधाजनक स्थान पर अनज़िप करें। एक अलग फ़ोल्डर में बेहतर।
। फीनिक्सटूल लॉन्च करें और फ़र्मवेयर फ़ाइल खोलने का प्रयास करें।
। यदि आप इस तरह से एक विंडो खोलने की कोशिश करते हैं

फिर सबसे अधिक संभावना है कि निर्माता से आपकी छवि एन्क्रिप्ट की गई है। डिक्रिप्ट विधि का अभी तक आविष्कार नहीं हुआ है, लेकिन यह केवल समय की बात है। यदि यह आपका मामला है, तो अगले चरण पर जाएं, यदि नहीं, तो छोड़ें और चरण 8 पर जाएं
। फर्मवेयर को आपके लिए सुविधाजनक फ़ोल्डर में अनज़िप करें और अपने BIOS को नवीनतम संस्करण में अपडेट करना शुरू करें।
। आपके लैपटॉप के रिबूट होने के बाद, इस फ़ोल्डर में वापस जाएं और वहां platform.ini फ़ाइल ढूंढें
। पाठ संपादक के साथ खोलें और निम्नलिखित परिवर्तन करें:
 [BackupROM] Flag=1 FilePath=c: FileName=0183AF24.BIN 
यह आपको अपने BIOS को फिर से फ्लैश करने की अनुमति देगा, लेकिन वर्तमान BIOS की एक बैकअप प्रतिलिपि बनाई जाएगी।
।। रिबूट करने के बाद, फीनिक्सटूल का उपयोग करके परिणामी बैकअप खोलें
।। कुछ सेकंड में आपको इसके समान एक विंडो देखनी चाहिए:

। अब आप विंडो को बंद कर सकते हैं।
१० । उस फ़ोल्डर में जहां आपकी छवि थी, DUMP फ़ोल्डर दिखाई देगा, और इसमें कई फाइलें हैं। हम रुचि रखते हैं जिसमें FE3542FE शुरू होता है और इसका सबसे बड़ा आकार है:

११ । अब मेरे का सोर्स कोड डाउनलोड करें
पार्सर
 #!/usr/bin/perl # # Copyright (c) 2013 Nurlan Mukhanov (aka Falseclock) <nurike@gmail.com> # # Please inform me if you found error/mistakes or enhance this script. # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. $| = 1; use strict; use warnings; use utf8; use Encode; use Data::Dumper; use vars qw($ROM $ROM_SIZE $IFR_PACKAGE_SIG @EFI_HII_PACKAGES %EFI_HII_PACKAGE_TYPE %LANGUAGES @EFI_HII_PACKAGE_FORMS %EFI $DEFAULT_LANGUAGE @STRINGS @TABS %TYPES); ################### !!! IMPORTANT !!! ################### $IFR_PACKAGE_SIG = '$IFRPKG!'; ######################################################### $DEFAULT_LANGUAGE = 'en-US'; my $file = $ARGV[0] || "Setup.rom"; &SPECIFICATION_LOAD(); #---------------------------- MAIN PROGRAMM ----------------------------# open($ROM, "<$file ") or die "ERROR : Cannot open $file.\n"; { binmode $ROM; undef $/; $ROM_SIZE = -s $file; } #-------------------------------------------------------------------- # 1. Search IFR virtual package my $header_offset = &IFR_PACKAGE_SIG(); print STDERR "IFR_PACKAGE_SIG not found!\nExiting programm...\n" and exit 1 if (!$header_offset); #-------------------------------------------------------------------- # 2. Search EFI_HII_PACKAGE_HEADERs @EFI_HII_PACKAGES = &EFI_HII_PACKAGES($header_offset); #print Dumper(\@EFI_HII_PACKAGES); #=head #-------------------------------------------------------------------- # 3. Parse EFI_HII_PACKAGE_STRINGS #print "Parsing language tables..\n"; %LANGUAGES = &EFI_HII_PACKAGE_STRINGS(); #printf "\tFound %d languages: %s\n", scalar keys %LANGUAGES, join ', ', sort keys %LANGUAGES; @STRINGS = @{$LANGUAGES{$DEFAULT_LANGUAGE}->{'strings'}}; #print Dumper(\@STRINGS); #print Dumper(\%LANGUAGES); =head # 3.1. Check languages length my %length; $length{$_} = scalar @{$LANGUAGES{$_}->{'strings'}} foreach (keys %LANGUAGES); my $warn = 0; foreach (keys %length) { next if $_ eq 'en-US'; if ($length{$_} != $length{'en-US'}) { if (!$warn) { printf STDERR "\tWARNING: languages array length is different, must be %d elements:\n", $length{'en-US'}; $warn = 1; } printf "\t\t%s: (%d)\n", $_, $length{$_} - $length{'en-US'}; } } =cut #-------------------------------------------------------------------- # 4. FORM packages parsing @EFI_HII_PACKAGE_FORMS = &EFI_HII_PACKAGE_FORMS(); close($ROM); #-----------------------------------------------------------------------# #-----------------------------------------------------------------------# sub str2hex { return unpack ("H*", shift); } sub dec2bin { return unpack("B32", pack("N", shift)); } sub bin2dec { return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } sub oplength { my $data = shift; my $length = unpack("C", $data); return bin2dec(substr &dec2bin($length), -7); } sub EFI_IFR { my $data = shift; my $length = length($data); my @opcodes; #printf "length: %d, hex: %s\n", length($data), join (' ', unpack("(H2)*",substr($data,0,10))); my $i = 0; while ($i < $length) { my %op; # Reading OPCODE $op{'opcode'} = unpack("C", substr($data,$i,1)); $i++; # Reading length $op{'length'} = oplength(substr($data,$i,1)); $i++; # Reading payload $op{'payload'} = substr($data,$i,$op{'length'}-2); $i += $op{'length'} -2; # Setting indent #$op{'indent'} = $INDENTS{$op{'opcode'}}; push @opcodes, \%op; # printf "Opcode: %02X, Length: %d\n",$op{'opcode'} , $op{'length'}; # my $www = <STDIN>; } return \@opcodes; } sub EFI_HII_PACKAGE_FORMS { my @forms = (); foreach (@EFI_HII_PACKAGES) { my %pkg = %{$_}; my %form; if ($_->{type} == 0x02) { # printf "EFI_HII_PACKAGE_FORMS offset int : %d, hex: (0x%08x)\n",$pkg{'int_offset'},$pkg{'int_offset'}; # Skeep first 4 bytes of FULLL_PACKAGE_LENGTH my $FORM_PACKAGE_LENGTH = unpack('I', (data($pkg{int_offset} + 4, 3).pack("H",0)) ); my $FORM_PACKAGE_TYPE = unpack('C', (data($pkg{int_offset} + 7, 1)) ); $form{'length'} = $FORM_PACKAGE_LENGTH; $form{'type'} = $FORM_PACKAGE_TYPE; #printf " Form length: %s, type: %s\n", $FORM_PACKAGE_LENGTH, $FORM_PACKAGE_TYPE; my $op_offset = $pkg{int_offset} + 8; my $op_length = ($FORM_PACKAGE_LENGTH - 4); $form{'opcodes'} = &EFI_IFR(data($op_offset,$op_length)); $form{'package'} = $_; push @forms, \%form; } } &EFI_IFR_FORM_SET(\@forms); #print Dumper(\@forms); return @forms; } sub EFI_IFR_FORM_SET { my $forms = shift; my @forms = @{$forms}; #print Dumper(\@forms); foreach my $form (@forms) { my %form = %{$form}; my @ops = @{$form{'opcodes'}}; foreach (@ops) { my %op = %{$_}; &EFI_IFR_PRINT(\%op,\%{$form{'package'}}); } print "\n"; } } sub fguid { my $guid = shift; my ($a, $b, $c, $d, $e); $a = unpack("H*",scalar reverse(substr($guid,0,4))); $b = unpack("H*",scalar reverse(substr($guid,4,2))); $c = unpack("H*",scalar reverse(substr($guid,6,2))); $d = unpack("H*",substr($guid,8,2)); $e = unpack("H*",substr($guid,10,6)); return sprintf("%s-%s-%s-%s-%s",$a,$b,$c,$d,$e); } sub EFI_HII_PACKAGE_STRINGS { my %pkg; foreach (@EFI_HII_PACKAGES) { %pkg = %{$_} and last if ($_->{type} == 0x04); } my $reader= 4; # current reading offset my %languages; while ($reader < $pkg{size}) # read until we in package { my $LANG_PACKAGE_LENGTH = unpack('I', (data($pkg{int_offset} + $reader, 3).pack("H",0)) ); my $LANG_PACKAGE_OFFSET = $pkg{int_offset} + $reader; #print $LANG_PACKAGE_LENGTH,"\n"; if ($LANG_PACKAGE_LENGTH) { $reader += (3 + 1 + 42); my $LANG_PACKAGE_NAME = (data($pkg{int_offset} + $reader, 5)); # skip 00 - end of header $languages{$LANG_PACKAGE_NAME} = {'offset' => $LANG_PACKAGE_OFFSET, 'length' => $LANG_PACKAGE_LENGTH, 'name' => $LANG_PACKAGE_NAME }; } $reader += $LANG_PACKAGE_LENGTH - (3 + 1 + 42); } foreach (keys %languages) { my %lang = %{$languages{$_}}; #print "Reading language from offset: ".$lang{'offset'}."\n"; #print "Language name is: ".$lang{'name'}."\n"; my $table = data($lang{'offset'}+46+6, $lang{'length'} - 46 - 6); my @table = unpack('(H2)*',$table); #         #        ,    my @strings; my $position=0; my $word = undef; my $eof = 0; my $last = undef; my $skip = 0; my $word_start = 0; push @strings, undef; # MEMEORY OFFSET CAN NOT BE 0 my %EFI_HII_STRING_BLOCK = map { $_ => 1 } ('10', '11', '12', '13', '15', '16', '17', '22', '30', '31', '32', '40'); for (my $l=0; $l < $#table; $l++) { my $byte = $table[$l]; if ( exists($EFI_HII_STRING_BLOCK{$byte}) && !$word && $last ne '14') { print STDERR "Unexpected EFI_HII_STRING_BLOCK -> BlockType = $byte found!\n"; printf STDERR "String offset: %d (0x%08x)\n", $lang{'offset'} + $l, $lang{'offset'} + $l; exit 1; } $last = $byte and $word_start = 1 and next if ($byte eq '14'); # EFI_HII_SIBT_STRING_UCS2 if ($byte eq '21' && !$word && !$word_start ) # EFI_HII_SIBT_SKIP2 { #print "SKEEP FOUND\n"; $skip = hex($table[$l+1]); # number of skips $l += 2; # pass reading @table for next 2 bytes while ($skip) { push @strings, "EFI_HII_SIBT_SKIP2-$skip"; $skip--; } next; } if ($byte eq '20' && !$word && !$word_start ) # EFI_HII_SIBT_DUPLICATE { push @strings, $strings[$#strings]; $l += 3; next; } # If word end if ($byte eq '00' && $table[$l+1] eq '00') { #print $word."\n"; push @strings, $word; $word = undef; $word_start = 0; $l++; next; } $word .= decode('utf-16le',pack("H*",$byte).pack("H*",$table[$l+1])); $l++; } $languages{$_}->{'strings'} = \@strings; } return %languages; #print Dumper(\%languages); } sub EFI_HII_PACKAGES { my $offset = shift; $offset += 8; my @address = (); while (1) { my $data = data($offset,8); my $hex = unpack("H*",$data); last if $hex !~ /^[ABCDEF0-9]{10}000000$/i; if ($hex =~ /^[ABCDEF0-9]{6}8001000000$/i) { push @address, substr ((join '', (reverse ($hex =~ m/../g))), 10); #my $address = substr ((join '', (reverse ($hex =~ m/../g))), 10); #printf "$address - %s\n", hex($address); } $offset += 8; } my @pkg = (); foreach (@address) { my %pkg; $pkg{int_offset} = hex($_); $pkg{hex_offset} = $_; $pkg{size} = unpack("I*",data(hex($_),4)); $pkg{type} = unpack("C", data( hex($_)+7 , 1 )); $pkg{type_name} = $EFI_HII_PACKAGE_TYPE{$pkg{type}}->{name}; $pkg{type_text} = $EFI_HII_PACKAGE_TYPE{$pkg{type}}->{text}; push @pkg, \%pkg; } return @pkg; } sub IFR_PACKAGE_SIG { my $i = 0; my $offset = 0; my $seek = undef; my @sig = split //, $IFR_PACKAGE_SIG; while ($i <= $ROM_SIZE) { my $byte = data($i,1); #last unless $byte; # If we found start of header if ($byte eq '$') { $offset = $i; # Store current offset $seek = $byte; # Store begining of the signature $i++; next; } if ($offset) # just to save CPU time { if (scalar grep $byte eq $_, @sig) { $seek .= $byte if ($IFR_PACKAGE_SIG =~ $seek.$byte ); last if ($IFR_PACKAGE_SIG eq $seek ); } else { $offset = 0; $seek = undef; } } $i++; } #printf "\nIFR_PACKAGE_SIG found at offset: %d (0x%08x)\n", ($offset, $offset) if $offset; return $offset; } sub data { my $offset = shift; my $length = shift; my $data; seek $ROM, $offset, 0; sysread $ROM, $data, $length; return $data; }; sub TabSpace { # Pushing push @TABS, shift; return ' ' x (scalar @TABS - 1); } sub TabClose { my $length = scalar @TABS; my $return = ""; if ($length) { my $opcode = pop @TABS; if ($opcode == $EFI{EFI_IFR_GRAY_OUT_IF_OP}) { $return = sprintf "\xE2\x94\x94- END IF Grayout;\n"; } elsif ($opcode == $EFI{EFI_IFR_SUPPRESS_IF_OP}) { $return = sprintf "\xE2\x94\x94- END IF Suppress;\n"; } else { $return = "What the fuck?"; } } return $return; } sub EFI_IFR_PRINT { my $op = shift; my $package = shift; my $TabSpace = ''; my %op = %{$op}; my %package = %{$package}; if ($op{'opcode'} != $EFI{EFI_IFR_FORM_SET_OP} and scalar @TABS) { if ($op{'opcode'} == $EFI{EFI_IFR_SUPPRESS_IF_OP} or $op{'opcode'} == $EFI{EFI_IFR_GRAY_OUT_IF_OP}) { $TabSpace = sprintf "|"; } elsif ( $op{'opcode'} == $EFI{EFI_IFR_END_OP} ) { $TabSpace = sprintf "%s",'| ' x (scalar @TABS - 1 ); } else { $TabSpace = sprintf "%s",'| ' x (scalar @TABS); } print $TabSpace; } if ($op{'opcode'} == $EFI{EFI_IFR_FORM_SET_OP}) { # 0x0E my $Guid = substr($op{'payload'},0,16); my $FormSetTitle = unpack("S2",substr($op{'payload'},16,2)); my $Help = unpack("S2",substr($op{'payload'},18,2)); my $Flags = substr($op{'payload'},20,2); my $ClassGuid = substr($op{'payload'},22,16); printf "\n\xE2\x95\x94%s\xE2\x95\x97\n","\xE2\x95\x90"x116; printf "\x{E2}\x{95}\x{91} FormSet: '%-62sGUID: %s \xE2\x95\x91\n", ($STRINGS[$FormSetTitle]."'", fguid($Guid)); printf "\x{e2}\x{95}\x{9f}%s\x{e2}\x{95}\x{a2}\n","\x{e2}\x{94}\x{80}"x116; if ($STRINGS[$Help] and $STRINGS[$Help] ne ' ') { printf " \\Help text: '%s'\n", $STRINGS[$Help]; } } elsif ($op{'opcode'} == $EFI{EFI_IFR_GUID_OP}) { # 0x5F my $Guid = substr($op{'payload'},0,16); my $Data = unpack("H*", substr($op{'payload'},16)); #printf "\x{E2}\x{95}\x{91} Operation data: '%-55sGUID: %s \xE2\x95\x91\n", $Data, &fguid($Guid); } elsif ($op{'opcode'} == $EFI{EFI_IFR_DEFAULTSTORE_OP}) { # 0x5C my $DefaultId = unpack("S2", substr($op{'payload'},2,2)); my $DefaultName = unpack("S2", substr($op{'payload'},2,2)); #printf "EFI_IFR_DEFAULTSTORE_OP, length: %d, DefaultId: %s, DefaultName: %s \n",length($op{'payload'}),$DefaultId,$DefaultName ; } elsif ($op{'opcode'} == $EFI{EFI_IFR_VARSTORE_OP}) { # 0x24 # typedef struct _EFI_IFR_VARSTORE { # EFI_IFR_OP_HEADER Header; # EFI_GUID Guid; # EFI_VARSTORE_ID VarStoreId; # UINT16 Size; # UINT8 Name[1]; # } EFI_IFR_VARSTORE; #printf "EFI_IFR_VARSTORE_OP, length: %d \n",length($op{'payload'}); my $Guid = substr($op{'payload'},0,16); my $VarStoreId = unpack("S2", substr($op{'payload'},16,2)); my $Size = unpack("S2", substr($op{'payload'},18,2)); my $Name = substr($op{'payload'},20,12); printf "\x{E2}\x{95}\x{91} VarStore Id: '0x%x', Size: '%s', Name: '%s' GUID: %s \x{E2}\x{95}\x{91}\n", $VarStoreId, $Size, $Name, &fguid($Guid); printf "\xE2\x95\x9A%s\xE2\x95\x9D\n","\xE2\x95\x90"x116; } elsif ($op{'opcode'} == $EFI{EFI_IFR_FORM_OP}) { # 0x01 my $FormId = unpack("S2",substr($op{'payload'},0,2)); my $FormTitle = unpack("S2",substr($op{'payload'},2,2)); printf "\x{e2}\x{94}\x{8c}%s\x{e2}\x{94}\x{90}\n","\x{e2}\x{94}\x{80}"x116; printf "\x{e2}\x{94}\x{82} Form Name: '%-86s [ ID: '0x%04x' ]\x{e2}\x{94}\x{82}\n", ($STRINGS[$FormTitle]."'", $FormId); printf "\x{e2}\x{94}\x{94}%s\x{e2}\x{94}\x{98}\n","\x{e2}\x{94}\x{80}"x116; } elsif ($op{'opcode'} == $EFI{EFI_IFR_GRAY_OUT_IF_OP}) { # 0x19 printf "%s\x{E2}\x{94}\x{8C}- Grayout IF:\n",TabSpace($op{'opcode'}); } elsif ($op{'opcode'} == $EFI{EFI_IFR_SUPPRESS_IF_OP}) { # 0x0A printf "%s\xE2\x94\x8C- Suppress IF:\n",TabSpace($op{'opcode'}); } elsif ($op{'opcode'} == $EFI{EFI_IFR_END_OP}) { # 0x29 printf "%s",&TabClose($op{'opcode'}); } elsif ($op{'opcode'} == $EFI{EFI_IFR_EQ_ID_VAL_OP}) { # 0x12 my $QuestionId = unpack("S2",substr($op{'payload'},0,2)); my $Value = unpack("S2",substr($op{'payload'},2,2)); printf "Question [ ID: '0x%02x' ] == 0x%02x\n", $QuestionId, $Value,; } elsif ($op{'opcode'} == $EFI{EFI_IFR_AND_OP}) { # 0x15 printf "AND expression\n"; } elsif ($op{'opcode'} == $EFI{EFI_IFR_SUBTITLE_OP}) { # 0x02 my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); printf "Subtitle: '%s'\n", ($STRINGS[$Prompt]) if defined $STRINGS[$Prompt] and $STRINGS[$Prompt] ne ' '; } elsif ($op{'opcode'} == $EFI{EFI_IFR_DEFAULT_OP}) { # 0x5B my $DefaultId = unpack("S2",substr($op{'payload'},0,2)); my $Type = unpack("C",substr($op{'payload'},2,1)); my $value; if ($Type == 0) { $value = unpack("C",substr($op{'payload'},3,1)); } elsif ($Type == 1) { $value = unpack("S2",substr($op{'payload'},3,2)); } elsif ($Type == 2) { $value = unpack("S2",substr($op{'payload'},3,2)); } elsif ($Type == 5) { $value = sprintf("%02d",unpack("C",substr($op{'payload'},3,1))).':'.sprintf("%02d",unpack("C",substr($op{'payload'},4,1))).':'.sprintf("%02d",unpack("C",substr($op{'payload'},5,1))); } elsif ($Type == 6) { $value = unpack("S2",substr($op{'payload'},3,2)).'/'.sprintf("%02d",unpack("C",substr($op{'payload'},5,1))).'/'.sprintf("%02d",unpack("C",substr($op{'payload'},6,1))); } else { $value = unpack("S*",substr($op{'payload'},3,4)); } printf " Default value: '%s', Type: 0x%02x\n",$value, $Type; } elsif ($op{'opcode'} == $EFI{EFI_IFR_TRUE_OP}) { # 0x46 printf "EQ == TRUE\n"; } elsif ($op{'opcode'} == $EFI{EFI_IFR_TEXT_OP}) { # 0x03 my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $TextTwo = unpack("S2",substr($op{'payload'},4,2)); my $t2 = ""; $t2 = $STRINGS[$TextTwo] if (defined $STRINGS[$TextTwo]); printf "Text: '%-32.32sDefault: '%-32.32sHelp: '%s'\n", $STRINGS[$Prompt]."'", $t2."'", $STRINGS[$Help]; } elsif ($op{'opcode'} == $EFI{EFI_IFR_UINT64_OP}) { # 0x45 my $Value = $op{'payload'}; printf "VALUE = %s\n", unpack("S*",$Value); } elsif ($op{'opcode'} == $EFI{EFI_IFR_EQUAL_OP}) { # 0x2F printf "EQUAL expression\n"; } elsif ($op{'opcode'} == $EFI{EFI_IFR_EQ_ID_LIST_OP}) { # 0x14 my $QuestionId = unpack("S2", substr($op{'payload'},0,2)); my $ListLength = unpack("S2", substr($op{'payload'},2,2)); my @ValueList = unpack("(S4)*", substr($op{'payload'},4)); @ValueList = map {sprintf "'0x%02x'", $_ } @ValueList; printf "LIST [ ID: '0x%02x' ] in (%s)\n",$QuestionId, join ",", @ValueList; } elsif ($op{'opcode'} == $EFI{EFI_IFR_OR_OP}) { # 0x16 printf "OR expression\n"; } elsif ($op{'opcode'} == $EFI{EFI_IFR_NOT_OP}) { # 0x17 printf "NOT expression \n"; } elsif ($op{'opcode'} == $EFI{EFI_IFR_TIME_OP}) {# 0x1b my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $QuestionId = unpack("S2",substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2",substr($op{'payload'},8,2)); #my $VarName = unpack("S2",substr($op{'payload'},8,1)); #my $VarOffset = unpack("S2",substr($op{'payload'},9,1)); #my $Flags = unpack("S2",substr($op{'payload'},9,1)); printf "Time: '%s' [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: '%s' ]\n", $STRINGS[$Prompt],$QuestionId,$VarStoreId,$STRINGS[$Help] ; } elsif ($op{'opcode'} == $EFI{EFI_IFR_DATE_OP}) {# 0x1A my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $QuestionId = unpack("S2",substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2",substr($op{'payload'},8,2)); #my $VarName = unpack("S2",substr($op{'payload'},8,1)); #my $VarOffset = unpack("S2",substr($op{'payload'},9,1)); #my $Flags = unpack("S2",substr($op{'payload'},9,1)); printf "Date: '%s' [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: '%s' ]\n", $STRINGS[$Prompt],$QuestionId,$VarStoreId,$STRINGS[$Help] ; } elsif ($op{'opcode'} == $EFI{EFI_IFR_NUMERIC_OP}) {# 0x07 my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $QuestionId = unpack("S2",substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2",substr($op{'payload'},8,2)); #my $VarStoreInfo = unpack("C",substr($op{'payload'},10,1)); my $Type = unpack("C",substr($op{'payload'},11,1)); my $MinValue = unpack("C",substr($op{'payload'},12,1)); my $MaxValue = unpack("C",substr($op{'payload'},13,1)); my $Step = unpack("C",substr($op{'payload'},14,1)); printf "Number question: Prompt: %s, Help: %s\n",($STRINGS[$Prompt], $STRINGS[$Help]) if $Prompt; printf "%s \x{E2}\x{94}\x{94}- [ QuestionId: '0x%02x', VarStore: '0x%02x' , Type: '%02x', MinValue: '%d', MaxValue: '%d', Step: '%d' ]\n",($TabSpace,$QuestionId, $VarStoreId, $Type,$MinValue, $MaxValue, $Step) if $Prompt;; } elsif ($op{'opcode'} == $EFI{EFI_IFR_REF_OP}) {# 0x0F my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $QuestionId = unpack("S2",substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2",substr($op{'payload'},8,2)); my $FormId = unpack("S2>*!",substr($op{'payload'},11,4)); printf "Reference: '%s' [ FormID: '0x%04x', QuestionId: '0x%02x', VarStore: '0x%02x' ]\n", $STRINGS[$Prompt], $FormId, $QuestionId, $VarStoreId; } elsif ($op{'opcode'} == $EFI{EFI_IFR_ACTION_OP}) {# 0x0C my $Prompt = unpack("S2",substr($op{'payload'},0,2)); my $Help = unpack("S2",substr($op{'payload'},2,2)); my $QuestionId = unpack("S2",substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2",substr($op{'payload'},8,2)); #my $VarStoreInfo = unpack("C",substr($op{'payload'},8,1)); printf "Action: '%-32.32s [ QuestionId: '0x%02x', VarStore: '0x%02x', Help: %s ] \n", ($STRINGS[$Prompt]."'", $QuestionId,$VarStoreId, $STRINGS[$Help]); #printf "%s \x{E2}\x{94}\x{94}- \n", ($TabSpace if $STRINGS[$Prompt]; } elsif ($op{'opcode'} == $EFI{EFI_IFR_PASSWORD_OP}) {# 0x08 my $Prompt = unpack("S2", substr($op{'payload'},0,2)); my $Help = unpack("S2", substr($op{'payload'},2,2)); my $VarStoreId = unpack("S2", substr($op{'payload'},8,2)); printf "Password: %-32.32s [ VarStore: '0x%02x', Help: '%s']\n", ($STRINGS[$Prompt], $VarStoreId, $STRINGS[$Help]); } elsif ($op{'opcode'} == $EFI{EFI_IFR_ONE_OF_OP}) { # 0x05 my $Prompt = unpack("S2", substr($op{'payload'},0,2)); my $Help = unpack("S2", substr($op{'payload'},2,2)); my $QuestionId = unpack("S2", substr($op{'payload'},4,2)); my $VarStoreId = unpack("S2", substr($op{'payload'},8,2)); # my $VarOffset = unpack("S2", substr($op{'payload'},4,2)); printf "Select option: '%-32.32s[ VarStore: '0x%02x', QuestionId: '0x%02x', Help: '%s']\n", ($STRINGS[$Prompt]."'", $VarStoreId, $QuestionId, (defined $STRINGS[$Help] ? $STRINGS[$Help] : '' )); } elsif ($op{'opcode'} == $EFI{EFI_IFR_ONE_OF_OPTION_OP}) { # 0x09 my $Option = unpack("S2", substr($op{'payload'},0,2)); my $Flags = str2hex(substr($op{'payload'},2,1)); my $Type = unpack("C", substr($op{'payload'},3,1)); my $Value = unpack("C*", substr($op{'payload'},4,8)); # oid, value, flags, key = struct.unpack("<HHBH", self.payload) # print ts+"Option '%s' = 0x%x Flags 0x%x Key 0x%x"%(s[oid], value, flags, key) printf " Option: '%-37.37s[ Value: '%s' Default: '%-6s Type: '%-6.6s ]\n", ($STRINGS[$Option]."'", $Value, ($Flags eq '10' ? 'true' : 'false')."'", $TYPES{$Type}."'"); } else { printf "--> UNKNOWN OPCODE: %02X, length: %d\n", $op{'opcode'}, $op{'length'}; exit 1; } } sub SPECIFICATION_LOAD { $EFI{EFI_IFR_FORM_OP} = 0x01; $EFI{EFI_IFR_SUBTITLE_OP} = 0x02; $EFI{EFI_IFR_TEXT_OP} = 0x03; $EFI{EFI_IFR_IMAGE_OP} = 0x04; $EFI{EFI_IFR_ONE_OF_OP} = 0x05; $EFI{EFI_IFR_CHECKBOX_OP} = 0x06; $EFI{EFI_IFR_NUMERIC_OP} = 0x07; $EFI{EFI_IFR_PASSWORD_OP} = 0x08; $EFI{EFI_IFR_ONE_OF_OPTION_OP} = 0x09; $EFI{EFI_IFR_SUPPRESS_IF_OP} = 0x0A; $EFI{EFI_IFR_LOCKED_OP} = 0x0B; $EFI{EFI_IFR_ACTION_OP} = 0x0C; $EFI{EFI_IFR_RESET_BUTTON_OP} = 0x0D; $EFI{EFI_IFR_FORM_SET_OP} = 0x0E; $EFI{EFI_IFR_REF_OP} = 0x0F; $EFI{EFI_IFR_NO_SUBMIT_IF_OP} = 0x10; $EFI{EFI_IFR_INCONSISTENT_IF_OP} = 0x11; $EFI{EFI_IFR_EQ_ID_VAL_OP} = 0x12; $EFI{EFI_IFR_EQ_ID_ID_OP} = 0x13; $EFI{EFI_IFR_EQ_ID_LIST_OP} = 0x14; $EFI{EFI_IFR_AND_OP} = 0x15; $EFI{EFI_IFR_OR_OP} = 0x16; $EFI{EFI_IFR_NOT_OP} = 0x17; $EFI{EFI_IFR_RULE_OP} = 0x18; $EFI{EFI_IFR_GRAY_OUT_IF_OP} = 0x19; $EFI{EFI_IFR_DATE_OP} = 0x1A; $EFI{EFI_IFR_TIME_OP} = 0x1B; $EFI{EFI_IFR_STRING_OP} = 0x1C; $EFI{EFI_IFR_REFRESH_OP} = 0x1D; $EFI{EFI_IFR_DISABLE_IF_OP} = 0x1E; $EFI{EFI_IFR_ANIMATION_OP} = 0x1F; $EFI{EFI_IFR_TO_LOWER_OP} = 0x20; $EFI{EFI_IFR_TO_UPPER_OP} = 0x21; $EFI{EFI_IFR_MAP_OP} = 0x22; $EFI{EFI_IFR_ORDERED_LIST_OP} = 0x23; $EFI{EFI_IFR_VARSTORE_OP} = 0x24; $EFI{EFI_IFR_VARSTORE_NAME_VALUE_OP} = 0x25; $EFI{EFI_IFR_VARSTORE_EFI_OP} = 0x26; $EFI{EFI_IFR_VARSTORE_DEVICE_OP} = 0x27; $EFI{EFI_IFR_VERSION_OP} = 0x28; $EFI{EFI_IFR_END_OP} = 0x29; $EFI{EFI_IFR_MATCH_OP} = 0x2A; $EFI{EFI_IFR_GET_OP} = 0x2B; $EFI{EFI_IFR_SET_OP} = 0x2C; $EFI{EFI_IFR_READ_OP} = 0x2D; $EFI{EFI_IFR_WRITE_OP} = 0x2E; $EFI{EFI_IFR_EQUAL_OP} = 0x2F; $EFI{EFI_IFR_NOT_EQUAL_OP} = 0x30; $EFI{EFI_IFR_GREATER_THAN_OP} = 0x31; $EFI{EFI_IFR_GREATER_EQUAL_OP} = 0x32; $EFI{EFI_IFR_LESS_THAN_OP} = 0x33; $EFI{EFI_IFR_LESS_EQUAL_OP} = 0x34; $EFI{EFI_IFR_BITWISE_AND_OP} = 0x35; $EFI{EFI_IFR_BITWISE_OR_OP} = 0x36; $EFI{EFI_IFR_BITWISE_NOT_OP} = 0x37; $EFI{EFI_IFR_SHIFT_LEFT_OP} = 0x38; $EFI{EFI_IFR_SHIFT_RIGHT_OP} = 0x39; $EFI{EFI_IFR_ADD_OP} = 0x3A; $EFI{EFI_IFR_SUBTRACT_OP} = 0x3B; $EFI{EFI_IFR_MULTIPLY_OP} = 0x3C; $EFI{EFI_IFR_DIVIDE_OP} = 0x3D; $EFI{EFI_IFR_MODULO_OP} = 0x3E; $EFI{EFI_IFR_RULE_REF_OP} = 0x3F; $EFI{EFI_IFR_QUESTION_REF1_OP} = 0x40; $EFI{EFI_IFR_QUESTION_REF2_OP} = 0x41; $EFI{EFI_IFR_UINT8_OP} = 0x42; $EFI{EFI_IFR_UINT16_OP} = 0x43; $EFI{EFI_IFR_UINT32_OP} = 0x44; $EFI{EFI_IFR_UINT64_OP} = 0x45; $EFI{EFI_IFR_TRUE_OP} = 0x46; $EFI{EFI_IFR_FALSE_OP} = 0x47; $EFI{EFI_IFR_TO_UINT_OP} = 0x48; $EFI{EFI_IFR_TO_STRING_OP} = 0x49; $EFI{EFI_IFR_TO_BOOLEAN_OP} = 0x4A; $EFI{EFI_IFR_MID_OP} = 0x4B; $EFI{EFI_IFR_FIND_OP} = 0x4C; $EFI{EFI_IFR_TOKEN_OP} = 0x4D; $EFI{EFI_IFR_STRING_REF1_OP} = 0x4E; $EFI{EFI_IFR_STRING_REF2_OP} = 0x4F; $EFI{EFI_IFR_CONDITIONAL_OP} = 0x50; $EFI{EFI_IFR_QUESTION_REF3_OP} = 0x51; $EFI{EFI_IFR_ZERO_OP} = 0x52; $EFI{EFI_IFR_ONE_OP} = 0x53; $EFI{EFI_IFR_ONES_OP} = 0x54; $EFI{EFI_IFR_UNDEFINED_OP} = 0x55; $EFI{EFI_IFR_LENGTH_OP} = 0x56; $EFI{EFI_IFR_DUP_OP} = 0x57; $EFI{EFI_IFR_THIS_OP} = 0x58; $EFI{EFI_IFR_SPAN_OP} = 0x59; $EFI{EFI_IFR_VALUE_OP} = 0x5A; $EFI{EFI_IFR_DEFAULT_OP} = 0x5B; $EFI{EFI_IFR_DEFAULTSTORE_OP} = 0x5C; $EFI{EFI_IFR_FORM_MAP_OP} = 0x5D; $EFI{EFI_IFR_CATENATE_OP} = 0x5E; $EFI{EFI_IFR_GUID_OP} = 0x5F; $EFI{EFI_IFR_SECURITY_OP} = 0x60; %EFI_HII_PACKAGE_TYPE = ( 0x00 => { name => 'EFI_HII_PACKAGE_TYPE_ALL' , text => 'Pseudo-package type' }, 0x01 => { name => 'EFI_HII_PACKAGE_TYPE_GUID' , text => 'Package type where the format of the data is specified using a GUID immediately following the package header' }, 0x02 => { name => 'EFI_HII_PACKAGE_FORMS' , text => 'Forms package' }, 0x04 => { name => 'EFI_HII_PACKAGE_STRINGS' , text => 'Strings package' }, 0x05 => { name => 'EFI_HII_PACKAGE_FONTS' , text => 'Fonts package' }, 0x06 => { name => 'EFI_HII_PACKAGE_IMAGES' , text => 'Images package' }, 0x07 => { name => 'EFI_HII_PACKAGE_SIMPLE_FONTS' , text => 'Simplified (8x19, 16x19) Fonts package' }, 0x08 => { name => 'EFI_HII_PACKAGE_DEVICE_PATH' , text => 'Binary-encoded device path' }, 0x09 => { name => 'EFI_HII_PACKAGE_KEYBOARD_LAYOUT' , text => 'Used to mark the end of a package list' }, 0x0A => { name => 'EFI_HII_PACKAGE_ANIMATIONS' , text => 'Animations package' }, 0xDF => { name => 'EFI_HII_PACKAGE_END' , text => 'Package types reserved for use by platform firmware implementations' }, 0xE0 => { name => 'EFI_HII_PACKAGE_TYPE_SYSTEM_BEGIN' , text => 'Package types reserved for use by platform firmware implementations' }, ); %TYPES = ( 0x00 => 'int8', 0x01 => 'int16', 0x02 => 'int32', 0x03 => 'int64', 0x04 => 'bool', 0x05 => 'time', 0x06 => 'date', 0x07 => 'string', 0x08 => 'other', ); } 

१२ । इसे अपने कंप्यूटर पर सहेजें, जहाँ आपके पास चरण 10 से फ़ाइल है और इसे एक नाम दें जो आपके लिए सुविधाजनक है, उदाहरण के लिए uefumpump.pl
१३ । कंसोल मोड पर जाएं और कमांड perl uefidump.pl FE3542FE-C1D3-4EF8-657C-8048606FF670_2_514.ROM> uefidump.log दें
१४ । अंत में, आपको uefidump.log फ़ाइल में अपने BIOS मेनू का एक डंप मिलेगा।

बूट डिस्केट तैयार करना

। हम एक फ्लैश ड्राइव लेते हैं, आकार महत्वपूर्ण नहीं है।
। इसे FAT32 में प्रारूपित करें
। निर्देशिका संरचना EFI \ Boot बनाएँ
BOOTX64.EFI डाउनलोड करें
। बूट फ़ोल्डर में रखो
। हम BIOS में रिबूट करते हैं, विरासत को सक्षम करते हैं और सुरक्षित बूट को अक्षम करते हैं।
।। हम USB फ्लैश ड्राइव के माध्यम से बचत करते हैं और बूट करते हैं।
।। लोड करने के बाद आपको एक ब्लैक स्क्रीन पर पीला टेक्स्ट देखना चाहिए
 > Welcome to GRUB! > > Entering rescue mode... > error: file not found > grub rescue > 

। BIOS सेटिंग्स को संशोधित करने के लिए सब कुछ तैयार है।

पैरामीटर्स बदलें

परिवर्तनों के लिए, VarStore और Value फ़ील्ड का उपयोग किया जाता है। दशमलव में लॉग में मान, बदलते समय, आपको एक हेक्साडेसिमल मान निर्दिष्ट करना होगा।

। मान लें कि आपको IDE से AHCI तक ड्राइव मोड को बदलना होगा। हैकिंटोश के लिए किसी को इसकी आवश्यकता है, और किसी ने एक ठोस-राज्य हार्ड ड्राइव खरीदा है, लेकिन लैपटॉप इसे नहीं देखता है। हम विषय के लिए लॉग फ़ाइल में देखते हैं और निम्नलिखित पंक्तियाँ पाते हैं:
 Select option: 'HDC Configure As' [ VarStore: '0x39', QuestionId: '0x1a', Help: 'Set Harddisk Controller Configure Type'] Option: 'IDE' [ Value: '0' Default: 'true' Type: 'int8' ] Option: 'AHCI' [ Value: '1' Default: 'false' Type: 'int8' ] Option: 'RAID' [ Value: '2' Default: 'false' Type: 'int8' ] 

आपके लिए सेटिंग बदलने के लिए, आपको सबसे पहले कमांड setup_var 0x39 देना होगा।
इस आदेश का परिणाम इस चर का वर्तमान मूल्य होगा। इसे बदलने और AHCI में डालने के लिए, आपको कमांड setup_var 0x39 0x1 । ध्यान दें कि यदि आपके पास विंडोज है, तो आपको इसे फिर से इंस्टॉल करना होगा, क्योंकि एक बार आईडीई पर विंडोज को कॉन्फ़िगर करने के बाद यह समझने में सक्षम नहीं होगा कि अब इसे एएचसीआई के साथ काम करने की आवश्यकता है। एक विकल्प के रूप में - रजिस्ट्री को संपादित करने के बाद सुरक्षित मोड में लोड करने के बाद, फिर आपको कुछ भी पुनर्स्थापित नहीं करना होगा।

उदाहरण के लिए, आपको असतत वीडियो एडेप्टर को अक्षम करना होगा। इस आइटम के लिए निम्नलिखित लाइनें जिम्मेदार हैं:
 Select option: 'Special Features' [ VarStore: '0x1e6', QuestionId: '0x92', Help: 'Enable Switch Graphic Function'] Option: 'Disabled' [ Value: '0' Default: 'false' Type: 'int8' ] Option: 'Enabled' [ Value: '1' Default: 'true' Type: 'int8' ] 
कमांड setup_var 0x1e6 0x0असतत को निष्क्रिय कर देगा और केवल अंतर्निहित कार्य करेगा।

हम चाहते हैं कि न्यूक्लॉक चालू न हो
 Select option: 'Numlock' [ VarStore: '0x08', QuestionId: '0x10', Help: 'Selects Power-on state for Numlock'] Option: 'Off' [ Value: '0' Default: 'false' Type: 'int8' ] Option: 'On' [ Value: '1' Default: 'true' Type: 'int8' ] 
कमांड setup_var 0x08 0x0इसे बूट समय पर अक्षम कर देगा।

उपसंहार


यह मैनुअल जैसा है वैसा ही लिखा जाता है और जैसा कि मैं अभ्यास में करता हूं। मैं क्षतिग्रस्त मदरबोर्ड या खोई जानकारी के लिए जिम्मेदार नहीं हूं। वह सब जो हम कर सकते हैं - आप अपने जोखिम और जोखिम पर करते हैं।

यदि कुछ गलत हो गया है, तो वीएसएस मेमोरी को मिटाने के लिए पहली लाइफ बोय BIOS बैटरी को हटा सकता है। यदि यह मदद नहीं करता है, तो आपको अपने BIOS के लिए एक पुनर्प्राप्ति विधि देखने की आवश्यकता है। एचपी के मामले में, यहां निर्देश मिल सकते हैं । उसी जगह अन्य विक्रेताओं के लिए, लेकिन मैंने खोज नहीं की।

मेरा विषय, जहाँ मैं नहीं हूँ, कोई भी कष्ट यहाँ नहीं है । यह सब काम करता है यह साबित करने के लिए उपयोगकर्ताओं से आभार।

और अंत में, उन उपकरणों को बंद करने की कोशिश न करें जो आपके पास हैं या जो आपके पास नहीं है उसे चालू करें, अन्यथा उपकरण को शुरू करने में विफलता से पूर्ण दुर्घटना हो जाएगी और मदरबोर्ड को बहाल करने में असमर्थता होगी।

और आखिरी बात, मेरी आपको सलाह: BIOS को ओवरक्लॉकिंग और ट्यूनिंग के साथ प्रयोग करना शुरू करने से पहले, सुनिश्चित करें कि क्रैश के मामले में BIOS को पुनर्स्थापित करने का तरीका आपके लैपटॉप के लिए काम करता है। अब तक ऐसे मामले नहीं आए हैं, लेकिन आप कभी नहीं जानते।

Source: https://habr.com/ru/post/In182676/


All Articles