
C++ DLL जो PE हेडर को पार्स करके और आयातित फ़ंक्शन पतों को लक्ष्य प्रक्रिया के भीतर एक कस्टम हुक पर पुनर्निर्देशित करके Import Address Table हुकिंग करता है।
हुकिंग एक तकनीक है जो उपयोगकर्ता को किसी प्रोग्राम के निष्पादन प्रवाह को पुनर्निर्देशित करने में सक्षम बनाती है। अधिकांश समय हम फ़ंक्शन हुकिंग का उपयोग करते हैं। हम या तो किसी फ़ंक्शन को प्रतिस्थापित करते हैं या उसे अपने स्वयं के फ़ंक्शन पर पुनर्निर्देशित करते हैं, यह बहुत उपयोगी है और इसके कई उपयोग हैं। हुकिंग के कई तरीके हैं, यहाँ हम IAT Hooking देख रहे हैं, इसका मतलब है Import Address Table। इसमें एक बड़ी तालिका में किसी फ़ंक्शन के पते को अपने स्वयं के पते से प्रतिस्थापित करना शामिल है जो रनटाइम पर भरी जाती है। जैसा कि मैंने पहले एक अन्य रेपो में कहा था, मैं अनुशंसा करता हूं कि आप इस कोड के IAT पार्सिंग भाग को समझने के लिए PE Format के बारे में अधिक पढ़ें। यहाँ एक बुनियादी आरेख है कि IAT Hooking कैसे काम करती है। इस उदाहरण में, दुर्भावनापूर्ण कोड निष्पादित होने के बाद मूल फ़ंक्शन को कॉल किया जा रहा है। इस उदाहरण में हम मूल फ़ंक्शन के बजाय बस एक अन्य फ़ंक्शन को कॉल करेंगे। उस तकनीक का लाभ यह है कि इसमें किसी फ़ंक्शन के शरीर को संशोधित करने की आवश्यकता नहीं होती है, जैसा कि नियमित डिटोर्स .text पैच हुक के विपरीत होता है जिसमें jmp रखने के लिए फ़ंक्शन की शुरुआत में निर्देशों को बदलना पड़ता है।
यह वास्तव में सुनने में जितना आसान लगता है उससे कहीं अधिक सरल है, हम चीजों को आसान बनाने के लिए आंतरिक रूप से आगे बढ़ेंगे जिसका मतलब है कि यह रेपो एक DLL में कंपाइल होगा जिसे लक्ष्य प्रक्रिया में इंजेक्ट किया जा सकता है, मेरे LoadLibraryA या Manual Mapping इंजेक्टर्स का उपयोग करके लक्ष्य प्रक्रिया में इंजेक्ट करने के लिए।
पहले हम Import Descriptor का पता लगाने के लिए लक्ष्य प्रक्रिया के PE Headers को पार्स करते हैं जैसे :
process_base + nt_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
फिर हम प्रत्येक आयातित मॉड्यूल के माध्यम से लूप कर सकते हैं, इस मॉड्यूल में प्रत्येक फ़ंक्शन के माध्यम से लूप कर सकते हैं (नेस्टेड लूप का कारण) और उस फ़ंक्शन का पता ढूंढ सकते हैं जो रनटाइम पर भरा गया है। इस उदाहरण में हम TranslateMessage को हुक करेंगे जिसका उपयोग Windows GUI पर इवेंट्स को प्रोसेस करने के लिए करता है। तो एक बार जब हमें उस फ़ंक्शन का पता मिल जाता है, तो हम इसे अपने स्वयं के फ़ंक्शन के पते से प्रतिस्थापित कर देते हैं जिसे हमने पहले परिभाषित किया था और जो रिमोट प्रक्रिया के संदर्भ में मौजूद है क्योंकि हम आंतरिक हैं। उस स्थान पर लिखने की अनुमति सुनिश्चित करने के लिए VirtualProtect का उपयोग करना न भूलें।
VirtualProtect(&firstThunk->u1.Function, sizeof(uint64_t), PAGE_READWRITE, &old_protection);
firstThunk->u1.Function = (uint64_t)hookfunction;
जैसा कि आप देख सकते हैं, जब notepad TranslateMessage को कॉल करता है (लगभग हर समय) तो यह हमारे हुक फ़ंक्शन को चलाएगा जो अंत में एक मैसेज बॉक्स प्रदर्शित करता है !
image