हाल ही में मुझे अपने लैपटॉप लेनोवो x230 में मानक एसी का एक नया वाईफाई कार्ड डालने की आवश्यकता थी, जिसमें वलान कार्ड के लिए एक श्वेतसूची है। नीचे मैं श्वेतसूची को अक्षम करने पर अपने शोध का वर्णन करूंगा।

पहले हमें अपने BIOS के डंप को मर्ज करने की आवश्यकता है, आप
एफपीटी उपयोगिता का उपयोग करके ऐसा कर सकते हैं
fpt -d bios.rom -BIOS
अगला, हमें
फीनिक्सटूल 2.52 उपयोगिता की आवश्यकता है। हम इसे शुरू करते हैं, हमारे bios.rom का चयन करते हैं और तब तक प्रतीक्षा करते हैं जब तक यह इसे अनपैक नहीं करता है, तब निर्माता क्षेत्र में लेनोवो का चयन करें और उन्नत बटन पर क्लिक करें, वहां हम "अन्य मॉड्यूल को संशोधित करने के लिए उपयोगकर्ता को अनुमति दें" और "नो एसएलआईसी" पर क्लिक करें।

विंडो खुलने पर "संपन्न" और "गो" पर क्लिक करें

कुछ भी नहीं दबाएं और DUMP फ़ोल्डर में जाएं, जहां हमारा BIOS अनपैक्ड है। अगला, आपको श्वेतसूची के लिए ज़िम्मेदार फ़ाइल ढूंढनी होगी। हम केवल त्रुटि पाठ (UTF-16 एन्कोडिंग में) की तलाश कर रहे हैं जो तब प्रदर्शित किया जाता है जब मॉड्यूल श्वेतसूची से नहीं डाला जाता है "1802: अनधिकृत नेटवर्क कार्ड प्लग किया गया है"

हम पाते हैं कि फ़ाइल 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM श्वेतसूची के लिए BIOS मॉड्यूल है।
इसके बाद, इसे आईडीए में लोड करें, कोड को देखें और हमारी लाइन "1802: अनधिकृत नेटवर्क कार्ड" के लिए देखें

इस लाइन को Sub_A0C प्रक्रिया में एक्सेस किया जा रहा है। यानी प्रक्रिया Sub_A0C माना जाता है कि त्रुटि को प्रदर्शित करने में लगी हुई है, जहां से इसे बुलाया जा रहा है (प्रक्रिया के नाम पर क्लिक करें और कीबोर्ड पर X कुंजी दबाएं) देखें

हम देखते हैं कि यह प्रक्रिया Sub_B20 है। हम इस प्रक्रिया में जाते हैं और कोड के योजनाबद्ध प्रतिनिधित्व पर जाने के लिए स्पेसबार को दबाते हैं।

हम देखते हैं कि प्रक्रिया Sub_A0C को लेबल Loc_BDD पर कोड ब्लॉक से बुलाया जाता है। इसके अलावा इस लेबल आदि के लिए सशर्त संक्रमण का पता लगाना संभव है। लेकिन मैंने फैसला किया, इस प्रक्रिया के कोड को बेहतर ढंग से समझने के लिए, प्रक्रिया की शुरुआत से कोड के माध्यम से जाना।
तो, पहली सशर्त शाखा शून्य के लिए edx रजिस्टर की जांच करती है
test edx, edx jz Loc_C6E
क्योंकि ऊपर दिए गए edx रजिस्टर को इस प्रक्रिया में कहीं भी इनिशियलाइज़ नहीं किया गया है, यह स्पष्ट है कि इसे Sub_B20 प्रक्रिया को कॉल करने से पहले एक मान निर्दिष्ट किया जाना चाहिए। इसे कोड में देखा जा सकता है।

और

मुझे समझ में नहीं आ रहा है कि edx रजिस्टर में मूल्य का क्या मतलब है, तो चलो दोनों शाखा शाखाओं के माध्यम से चलते हैं।
आइए Loc_C6E पर सही सदी की शुरुआत करें

ईआरएक्स में, डेटा पता qword_270 डाला जाता है, qword_270 पर डबल-क्लिक करके हम इस रिकॉर्ड को देखने जाते हैं, फिर हेक्स व्यू-ए टैब पर जाते हैं। यह हमारा श्वेतसूची है, यह पता 270h से 3FFh तक जाता है। प्रारूप के साथ सब कुछ सरल है, प्रत्येक 16-बाइट प्रविष्टि (प्रत्येक 32 बिट के 4 शब्द) एक डिवाइस से मेल खाती है: पहला शब्द एक ध्वज है जो मान 0, 1, 5 या 6 लेता है, दूसरा शब्द एक सिस्टम आईडी है, तीसरा एक सबसिस्टम है आईडी, चौथा 0 या 1. के मान के साथ एक और ध्वज है। मेरा मानना है कि पहला ध्वज डिवाइस के प्रकार को निर्धारित करता है: 0 - वाईफ़ाई कार्ड, 1 - मॉडेम, 5 - ?, 6 - सूची का अंत।

कोड पर वापस आते हैं। ईगल की तुलना छह से करें, और हमारे साथ छह श्वेतसूची का अंत है, अर्थात। यदि श्वेतसूची खाली है, तो सीधे Loc_BDD पर जाएं, जो यहां एक त्रुटि का कारण बनता है। यह स्थिति हमारे लिए दिलचस्प नहीं है, क्योंकि श्वेतसूची खाली नहीं है, और शर्त पूरी नहीं हुई है। इसके बाद, rdx रजिस्टर में qword_270 पता डालें, ईआरएक्स (वाइटेलिस्ट में पहला रिकॉर्ड झंडा) को शून्य पर चेक करें, अगर झंडा गैर-शून्य है, तो हम त्रुटि के लिए आगे बढ़ते हैं। यह शर्त हमें भी रूचि नहीं देती है। एक ही स्थिति एक श्वेतसूची ट्रैवर्सल चक्र की शुरुआत है।
आगे की टीमें
movzx ecx, word ptr [r8+rdx+6] movzx eax, word ptr [r8+rdx+4] shl ecx, 10h or ecx, eax
हमने वाइटेलिस्ट से एक्स्ट रजिस्टर में सिस्टम आईडी डाल दिया। यहाँ r8 रजिस्टर चक्र में एक वृद्धि के रूप में कार्य करता है, शुरू में यह शून्य के बराबर है।
अगला, ईएक्सएक्स (वाइटेलिस्ट से सिस्टम आईडी) और रेदी रजिस्टर में पते पर स्मृति में मूल्य की तुलना करें।
cmp [rdi], ecx
यह अनुमान लगाना आसान है कि आरडीआई रजिस्टर में हमारे पास हमारे सम्मिलित वाईफाई कार्ड का पहचानकर्ता है, और प्रक्रिया की शुरुआत में हम आरडीआई रजिस्टर में आर 8 डालते हैं, अर्थात्। Sub_B20 प्रक्रिया एक पैरामीटर के रूप में रजिस्टर r8 का उपयोग करती है, जहां हमारे कार्ड के पहचानकर्ता के साथ मेमोरी सेल का पता होना चाहिए।
यदि पहचानकर्ता मेल नहीं खाता है, तो Loc_CBA पर जाएं, वहां हम वृद्धिशील रजिस्टर r8 को 10h तक बढ़ाते हैं (इसके लिए, हमें रजिस्टर r13w में अग्रिम रूप से एक होना चाहिए)
loc_CBA: add r9w, r13w movzx r8d, r9w shl r8, 4
और जाँचें कि क्या हम श्वेतसूची के अंत में हैं
mov eax, [r8+rdx] cmp eax, 6 jz loc_BDD
यदि अंत में, तो हम चक्र से बाहर निकलते हैं और एक त्रुटि देते हैं; यदि अंत में नहीं है, तो हम चक्र की शुरुआत में जाते हैं।
यह स्पष्ट है कि वाइलीस्ट को बायपास करने के लिए, हमें सिस्टम आईडी की तुलना करते समय सशर्त संक्रमण को हटाने की आवश्यकता है, अर्थात।
jnz short loc_CBA
को
jmp $+2
।
इसके अलावा, यदि सिस्टम आईडी मेल खाता है, तो सबसिस्टम आईडी की तुलना करने के लिए समान कोड है
movzx ecx, word ptr [r8+rdx+0Ah] movzx eax, word ptr [r8+rdx+8] shl ecx, 10h or ecx, eax cmp [rdi+4], ecx jz short loc_CD5
यदि सबसिस्टम आईडी मेल नहीं खाता है, तो हम आगे पहचानकर्ताओं के माध्यम से लूप करते हैं। यहाँ हमें बिना शर्त
jz short loc_CD5
से
jz short loc_CD5
को सशर्त संक्रमण को ठीक करने की भी आवश्यकता है।
आगे कोड के साथ, त्रुटि के लिए अधिक कूदता नहीं है, लेकिन एक दिलचस्प कोड है जो श्वेतसूची प्रविष्टि में दूसरे ध्वज की जांच करता है, जिसके बारे में मैंने पहले लिखा था, इसकी तुलना r13d रजिस्टर से की जाती है, और यदि यह मेल खाता है, तो कोड का एक अतिरिक्त टुकड़ा निष्पादित होता है। इस कोड को समझना मुश्किल हो जाता है, श्वेतसूची का विश्लेषण करके, आप देख सकते हैं कि यह ध्वज केवल इंटेल कार्ड पर है।
इसलिए, हमने दाईं शाखा का पता लगा लिया है, अब बाईं शाखा से गुजरते हैं। वहां, श्वेतसूची के साथ काम करने का कोड Loc_C18 लेबल से शुरू होता है। इसी प्रकार, यह देखने के लिए जाँच करता है कि क्या श्वेतसूची खाली है:
loc_C18: mov eax, dword ptr cs:qword_270 xor r9w, r9w cmp eax, 6 jz short loc_BDD
अगला, eax (पहला ध्वज) और r13d की तुलना की जाती है (मैं यह पता नहीं लगाता कि r13d में कौन सा पैरामीटर निहित है, प्रक्रिया की शुरुआत में मूल्य पते [rbx + 1] पर डाल दिया जाता है), फिर इस शर्त की पूर्ति के आधार पर, हम सीधे सत्यापन कोड पर पहुँचते हैं। सिस्टम आईडी, या एक दिलचस्प तुलना करते हैं
cmp eax, 5 jnz short loc_C54
हम 5 में से श्वेत सूची प्रविष्टि में पहले ध्वज की जांच करते हैं, यदि शर्त पूरी हो जाती है, तो इस श्वेतसूची प्रविष्टि को छोड़ दें (अर्थात वाईफाई कार्ड को अनदेखा करें) और सत्यापन चक्र के माध्यम से आगे बढ़ें।
यह समझने के लिए कि यह दिलचस्प झंडा क्या है, आपको यह समझने की जरूरत है कि सबबाइन 20 प्रक्रिया को क्या पारित किया गया है। यदि आपको याद है, कोड की दाहिनी शाखा में, यदि यह ध्वज शून्य से अलग था, तो एक असमर्थित कार्ड के बारे में एक त्रुटि जारी की गई थी। यानी फ्लैग 5 के साथ कार्ड को लोड करने के लिए, Sub_B20 प्रक्रिया को कॉल करने के लिए निम्नलिखित शर्तें पूरी होनी चाहिए: edx रजिस्टर नॉनजरो होना चाहिए, और r13d रजिस्टर पांच नहीं होना चाहिए (
cmp eax, r13d
, और
cmp eax, r13d
में हमारे पास पाँच के बराबर हमारा झंडा है)। केवल एक अनुमान लगा सकता है कि इस तरह के झंडे के साथ एक कार्ड लॉन्च करने के लिए, एक श्वेतसूची में खोजने के अलावा, कुछ अन्य शर्त की आवश्यकता होती है। मेरे लिए विश्लेषण को आगे ले जाना कठिन था, इसलिए यह पता लगाना संभव नहीं था कि यह स्थिति क्या थी।
आगे कोड के साथ, हम, सही शाखा के समान, लूप में सिस्टम आईडी की जांच करते हैं
loc_C3B: movzx ecx, word ptr [r8+rdx+6] movzx eax, word ptr [r8+rdx+4] shl ecx, 10h or ecx, eax cmp [rdi], ecx jz loc_DF3
यहां हमें बिना शर्त
jmp loc_DF3
साथ सशर्त कूद
jz loc_DF3
को बदलने की भी आवश्यकता है।
दिलचस्प बात यह है कि बाईं शाखा में कोई सबसिस्टम आईडी जाँच नहीं है, अर्थात्। सिर्फ एक सिस्टम आईडी मैच। ऊपर से, हम मान सकते हैं कि सही शाखा एक वाईफ़ाई कार्ड की जांच है, और बाईं ओर एक मॉडेम चेक है। और edx रजिस्टर में, जब फ़ंक्शन को बुलाया जाता है, तो डिवाइस का प्रकार समाहित होता है: 0 - वाईफ़ाई, 1 - मॉडेम। लेकिन यहाँ एक गलतफहमी भी है, क्योंकि कुंडल 0087: ध्वज 5 के साथ 8086 wifi + विमाक्स है, एक मॉडेम नहीं है, और edx में यह एक से अधिक हो सकता है, क्योंकि r13d को edx से घटाया जाता है और फिर चार की तुलना में:
sub edx, r13d jz short loc_B4F cmp edx, 4 jz short loc_B4F
दरअसल, यह विश्लेषण पूरा हो सकता है। हमें पैच के लिए सही स्थान मिले।
हम आदेशों को opcodes में अनुवाद करते हैं और हेक्स संपादक में प्रतिस्थापन करते हैं, परिणामस्वरूप हमें निम्नलिखित पैच मिलते हैं:
C4E: 0F84->90E9 (jz to jmp) CA3: 16->00 (jnz loc_CBA to jnz $+2) CB8: 74->EB (jnz to jmp)
हम पैच फाइल को 79E0EDD7-9D1D-4F41-AE1A-F896169E5216_2207.ROM से बचाते हैं और फीनिक्सटूल विंडो में ओके बटन पर क्लिक करते हैं।
फीनिक्सटूल एक नया BIOS बनाएगा जिसे bios_SLIC.rom कहा जाएगा।
यह छोटे के लिए मामला रहता है, एक नया BIOS फ्लैश करना आवश्यक है। लेनोवो लैपटॉप में, मेरे x230 सहित, परिवर्तित बायोस को प्रोग्रामेटिक रूप से फ्लैश नहीं किया जा सकता है, इसलिए हम इसे एक प्रोग्रामर के साथ सीवे करते हैं। दुर्भाग्य से, मैंने प्रोग्रामर के माध्यम से फर्मवेयर प्रक्रिया का फोटो नहीं बनाया। ExpressCard कनेक्टर के आगे MX25L3206E चिप में स्थित है। यह चिप 25 वीं श्रृंखला का एक नियमित एसपीआई ईप्रोम है, एक साधारण प्रोग्रामर जिसके लिए 300 रूबल की लागत है।
बस इतना ही, नए wifi कार्ड के काम का आनंद लें।
प्रयुक्त सामग्री bios-mods.com फोरम से
www.bios-mods.com/forum/Thread-TUTORIAL-Lenovo-X230-Tablet-BIOS-Whitelist-Removal-Hardware-Flashwww.bios-mods.com/forum/Thread-REQUEST-Whitelist-wifi-removal-for-T430-got-hardware-flash-programmer?page=4