हुकिंग

कंप्यूटर प्रोग्रामिंग में, हुकिंग शब्द मॉड्यूलर प्रोग्रामिंग के बीच पारित फ़ंक्शन कॉल या संदेश देना या घटना (कंप्यूटिंग)  को इंटरसेप्ट करके ऑपरेटिंग सिस्टम, अनुप्रयोग प्रक्रिया सामग्री या अन्य सॉफ़्टवेयर घटकों के व्यवहार को बदलने या बढ़ाने के लिए उपयोग की जाने वाली तकनीकों की एक श्रृंखला को शामिल करता है। कोड जो ऐसे इंटरसेप्टेड फ़ंक्शन कॉल, ईवेंट या संदेशों को संभालता है उसे हुक कहा जाता है।

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

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

तरीके
आमतौर पर हुक तब डाले जाते हैं जब सॉफ़्टवेयर पहले से ही चल रहा हो, लेकिन हुकिंग एक ऐसी रणनीति है जिसे एप्लिकेशन शुरू होने से पहले भी नियोजित किया जा सकता है। इन दोनों तकनीकों का नीचे विस्तार से वर्णन किया गया है।

स्रोत संशोधन
किसी एप्लिकेशन के चलने से पहले, रिवर्स इंजीनियरिंग की तकनीकों के माध्यम से निष्पादन योग्य या पुस्तकालय (कंप्यूटिंग)  के स्रोत को संशोधित करके हुकिंग प्राप्त की जा सकती है। इसका उपयोग आमतौर पर फ़ंक्शन कॉल को मॉनिटर करने या उन्हें पूरी तरह से बदलने के लिए इंटरसेप्ट करने के लिए किया जाता है।

उदाहरण के लिए, एक disassembler का उपयोग करके, मॉड्यूलर प्रोग्रामिंग के भीतर एक फ़ंक्शन (कंप्यूटर विज्ञान) का प्रवेश बिंदु पाया जा सकता है। इसके बाद इसे किसी अन्य लाइब्रेरी मॉड्यूल को गतिशील रूप से लोड करने के लिए बदला जा सकता है और फिर उस लोड की गई लाइब्रेरी के भीतर वांछित तरीकों को निष्पादित किया जा सकता है। यदि लागू हो, तो एक अन्य संबंधित दृष्टिकोण जिसके द्वारा हुकिंग प्राप्त की जा सकती है वह निष्पादन योग्य की पोर्टेबल निष्पादन योग्य#आयात तालिका को बदलकर है। इस तालिका को किसी भी अतिरिक्त लाइब्रेरी मॉड्यूल को लोड करने के लिए संशोधित किया जा सकता है और साथ ही यह भी बदला जा सकता है कि जब एप्लिकेशन द्वारा किसी फ़ंक्शन को कॉल किया जाता है तो कौन सा बाहरी कोड लागू होता है।

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

रनटाइम संशोधन
ऑपरेटिंग सिस्टम और सॉफ़्टवेयर रन टाइम (प्रोग्राम जीवनचक्र चरण) पर आसानी से इवेंट हुक डालने के साधन प्रदान कर सकते हैं। यह उपलब्ध है बशर्ते कि हुक डालने की प्रक्रिया (कंप्यूटिंग) को ऐसा करने के लिए पर्याप्त अनुमति दी गई हो। उदाहरण के लिए, माइक्रोसॉफ्ट विंडोज़, उपयोगकर्ताओं को हुक डालने की अनुमति देता है जिसका उपयोग सिस्टम इवेंट (कंप्यूटिंग) और संवाद बकस,  स्क्रॉल बार  और मेनू (कंप्यूटिंग) के साथ-साथ अन्य आइटमों के लिए एप्लिकेशन इवेंट को संसाधित या संशोधित करने के लिए किया जा सकता है। यह हुक को कीबोर्ड (कंप्यूटिंग) और माउस (कंप्यूटिंग) इवेंट को सम्मिलित करने, हटाने, संसाधित करने या संशोधित करने की भी अनुमति देता है। लिनक्स एक और उदाहरण प्रदान करता है जहां  नेटफ़िल्टर  के माध्यम से कर्नेल (ऑपरेटिंग सिस्टम) के भीतर नेटवर्क घटनाओं को संसाधित करने के लिए हुक का उपयोग समान तरीके से किया जा सकता है।

जब ऐसी कार्यक्षमता प्रदान नहीं की जाती है, तो हुकिंग का एक विशेष रूप एक प्रक्रिया द्वारा किए गए लाइब्रेरी फ़ंक्शन कॉल को इंटरसेप्ट करने का काम करता है। फ़ंक्शन हुकिंग को एक इंजेक्टेड कोड पर जाने के लिए लक्ष्य फ़ंक्शन के पहले कुछ कोड निर्देशों को बदलकर कार्यान्वित किया जाता है। वैकल्पिक रूप से साझा लाइब्रेरी अवधारणा का उपयोग करने वाले सिस्टम पर, इंटरप्ट वेक्टर तालिका या निष्पादन योग्य#आयात तालिका को मेमोरी में संशोधित किया जा सकता है। अनिवार्य रूप से ये युक्तियाँ स्रोत संशोधन के समान विचारों को नियोजित करती हैं, लेकिन इसके बजाय किसी प्रक्रिया के पहले से चलने के बाद उसकी मेमोरी में स्थित निर्देशों और संरचनाओं को बदल देती हैं।

वर्चुअल विधि टेबल हुकिंग
जब भी कोई क्लास किसी वर्चुअल फ़ंक्शन (या मेथड) को परिभाषित/इनहेरिट करता है, तो कंपाइलर क्लास में एक छिपा हुआ सदस्य वेरिएबल जोड़ते हैं जो आभासी विधि तालिका  (वीएमटी या वीटेबल) की ओर इशारा करता है। अधिकांश कंपाइलर कक्षा के प्रत्येक उदाहरण के पहले 4 बाइट्स पर छिपे हुए वीएमटी पॉइंटर को रखते हैं। वीएमटी मूल रूप से सभी आभासी कार्यों के लिए संदर्भ (कंप्यूटर विज्ञान) की एक श्रृंखला है जिसे कक्षा के उदाहरण कॉल कर सकते हैं। रनटाइम पर ये पॉइंटर्स सही फ़ंक्शंस को इंगित करने के लिए सेट किए जाते हैं, क्योंकि संकलन समय पर, यह अभी तक ज्ञात नहीं है कि क्या बेस फ़ंक्शन को कॉल किया जाना है या यदि किसी व्युत्पन्न वर्ग से फ़ंक्शन का ओवरराइड संस्करण कॉल किया जाना है (जिससे अनुमति मिलती है) बहुरूपता (कंप्यूटर विज्ञान) के लिए)। इसलिए, वर्चुअल फ़ंक्शंस को किसी भी वीएमटी के भीतर पॉइंटर्स को प्रतिस्थापित करके हुक किया जा सकता है जो वे दिखाई देते हैं। नीचे दिया गया कोड Microsoft Windows में C++ में लिखे गए एक विशिष्ट VMT हुक का एक उदाहरण दिखाता है।

यह ध्यान रखना महत्वपूर्ण है कि सभी वर्चुअल फ़ंक्शंस क्लास सदस्य फ़ंक्शंस होने चाहिए, और सभी (गैर स्थैतिक) क्लास सदस्य फ़ंक्शंस को __thiscall सम्मलेन बुलाना  के साथ कॉल किया जाता है (जब तक कि सदस्य फ़ंक्शन तर्कों की एक चर संख्या नहीं लेता है, जिस स्थिति में इसे कहा जाता है) __cdecl के साथ)। __thiscall कॉलिंग कन्वेंशन ECX रजिस्टर (x86 आर्किटेक्चर पर) के माध्यम से कॉलिंग क्लास इंस्टेंस (आमतौर पर इस पॉइंटर के रूप में संदर्भित) के लिए एक पॉइंटर पास करता है। इसलिए, एक हुक फ़ंक्शन के लिए पारित किए गए इस पॉइंटर को ठीक से इंटरसेप्ट करने और इसे एक तर्क के रूप में लेने के लिए, इसे ECX रजिस्टर में देखना होगा। उपरोक्त उदाहरण में, यह __fastcall कॉलिंग कन्वेंशन का उपयोग करने के लिए हुक फ़ंक्शन (hkVirtualFn1) को सेट करके किया जाता है, जो हुक फ़ंक्शन को उसके एक तर्क के लिए ECX रजिस्टर में देखने का कारण बनता है।

यह भी ध्यान दें कि, उपरोक्त उदाहरण में, हुक फ़ंक्शन (hkVirtualFn1) स्वयं एक सदस्य फ़ंक्शन नहीं है, इसलिए यह __thiscall कॉलिंग कन्वेंशन का उपयोग नहीं कर सकता है। इसके बजाय __fastcall का उपयोग करना होगा क्योंकि यह एकमात्र अन्य कॉलिंग कन्वेंशन है जो किसी तर्क के लिए ECX रजिस्टर को देखता है।

सी# कीबोर्ड इवेंट हुक
निम्नलिखित उदाहरण .NET Framework|Microsoft .NET Framework का उपयोग करके Microsoft Windows में कीबोर्ड ईवेंट से जुड़ जाएगा।

एपीआई/फ़ंक्शन हुकिंग/इंटरसेप्शन जेएमपी अनुदेश उर्फ ​​स्प्लिसिंग का उपयोग करके
निम्नलिखित स्रोत कोड एक एपीआई/फ़ंक्शन हुकिंग विधि का एक उदाहरण है जो एक गंतव्य सबरूटीन के पहले छह बाइट्स को जेएमपी (x86 निर्देश) निर्देश के साथ एक नए फ़ंक्शन में ओवरराइट करके हुक करता है। कोड को डायनामिक-लिंक लाइब्रेरी फ़ाइल में संकलित किया जाता है और फिर DLL इंजेक्शन की किसी भी विधि का उपयोग करके लक्ष्य प्रक्रिया में लोड किया जाता है। मूल फ़ंक्शन के बैकअप का उपयोग करके पहले छह बाइट्स को फिर से पुनर्स्थापित किया जा सकता है ताकि कॉल बाधित न हो। इस उदाहरण में Win32 API फ़ंक्शन MessageBoxW जुड़ा हुआ है।

नेटफ़िल्टर हुक
यह उदाहरण दिखाता है कि नेटफिल्टर का उपयोग करके लिनक्स कर्नेल में संगणक संजाल  ट्रैफ़िक को बदलने के लिए हुकिंग का उपयोग कैसे करें।

आंतरिक आईएटी हुकिंग
निम्नलिखित कोड दर्शाता है कि किसी अन्य मॉड्यूल से आयातित फ़ंक्शंस को कैसे हुक किया जाए। इसका उपयोग कॉलिंग प्रक्रिया से भिन्न प्रक्रिया में फ़ंक्शन को हुक करने के लिए किया जा सकता है। इसके लिए कोड को डायनामिक-लिंक लाइब्रेरी फ़ाइल में संकलित किया जाना चाहिए और फिर DLL इंजेक्शन की किसी भी विधि का उपयोग करके लक्ष्य प्रक्रिया में लोड किया जाना चाहिए। इस पद्धति का लाभ यह है कि यह एंटीवायरस सॉफ्टवेयर और/या धोखा विरोधी सॉफ्टवेयर द्वारा कम पता लगाया जा सकता है, कोई इसे बाहरी हुक में बना सकता है जो किसी भी दुर्भावनापूर्ण कॉल का उपयोग नहीं करता है। पोर्टेबल निष्पादन योग्य हेडर में आयात पता तालिका (आईएटी) शामिल है, जिसे नीचे स्रोत में दिखाए अनुसार हेरफेर किया जा सकता है। नीचे दिया गया स्रोत Microsoft Windows के अंतर्गत चलता है।

यह भी देखें

 * कॉलबैक (कंप्यूटर विज्ञान)
 * प्रतिनिधिमंडल (प्रोग्रामिंग)
 * समाप्ति-और-निवासी कार्यक्रम
 * उपयोगकर्ता निकास
 * WinAPIOverride32

संदर्भ

 *  [2012-06-29: Link appears to be dead]
 *  [2012-06-29: Link appears to be dead]
 *  [2012-06-29: Link appears to be dead]

खिड़कियाँ

 * आयात पता तालिका फ़ंक्शन हुकिंग पर जानकारी।
 * हुकिंग पर माइक्रोसॉफ्ट से जानकारी
 * x86 हुकिंग के संबंध में जानकारी और विभिन्न तकनीकें।
 * APISpy32 एक एप्लिकेशन है जिसका उपयोग Win32 API को हुक करने के लिए किया जाता है।
 * Detours माइक्रोसॉफ्ट रिसर्च द्वारा बनाई गई एक सामान्य प्रयोजन फ़ंक्शन हुकिंग लाइब्रेरी है जो C/C++ में काम करती है।
 * किसी अन्य प्रक्रिया में कोड डालने के तीन तरीके।
 * HookTool SDK (ACF SDK) एपीआई हुकिंग और कोड इंजेक्शन पर एक व्यापक अवलोकन प्रदान करता है। एक व्यावसायिक उत्पाद भी उपलब्ध है.
 * C++ और डेल्फ़ी के लिए एक व्यावसायिक x86 और x64 API हुकिंग और DLL इंजेक्शन लाइब्रेरी है।
 * EasyHook एक ओपन सोर्स हुकिंग इंजन है जो विंडोज़ में उपयोगकर्ता और कर्नेल भूमि दोनों में x86 और x64 का समर्थन करता है।
 * SpyStudio एप्लिकेशन ट्रेस SpyStudio एक एप्लिकेशन ट्रेसर है जो कॉल को हुक करता है, परिणामों को संरचित तरीके से प्रदर्शित करता है।
 * rohitab.com एपीआई मॉनिटर एक फ्रीवेयर एप्लिकेशन है जो 32-बिट और 64-बिट एप्लिकेशन और सेवाओं में 10,000+ विंडोज एपीआई और COM इंटरफेस को हुक और प्रदर्शित कर सकता है।
 * डेविएरे एपीआई हुक डेविएरे एक फ्रीवेयर इंटर-प्रोसेस हुक फ्रेमवर्क है जिसका उपयोग अन्य प्रक्रियाओं के एपीआई कॉल को इंटरसेप्ट करने और पूर्ण दिखाने के लिए किया जा सकता है। पैरामीटर जानकारी या एपीआई मॉनिटर बनाएं।
 * WinAPIOverride WinAPIOverride गैर व्यावसायिक उपयोग के लिए एक फ्रीवेयर है। यह Win32 API, COM, OLE, ActiveX, .NET को 32-बिट और 64-बिट प्रक्रियाओं में हुक कर सकता है। इसमें पोस्ट विश्लेषण टूल की निगरानी शामिल है।
 * urmem मेमोरी (हुक, पैच, पॉइंटर रैपर, सिग्नेचर स्कैनर आदि) के साथ काम करने के लिए C++11 क्रॉस-प्लेटफॉर्म लाइब्रेरी (x86)

लिनक्स

 * एक छात्र अनुसंधान परियोजना जो उपयोग करती है हुकिंग.
 * कार्यक्षमता जो सॉफ़्टवेयर के एक टुकड़े को किसी अन्य प्रक्रिया के निष्पादन को देखने और नियंत्रित करने की अनुमति देती है.
 * साझा लाइब्रेरी कॉल को हुक करने के लिए LD_PRELOAD का उपयोग।

Emacs

 * Emacs Hooks Emacs के अनुकूलन के लिए हुक एक महत्वपूर्ण तंत्र हैं। हुक एक लिस्प वैरिएबल है जिसमें कुछ अच्छी तरह से परिभाषित अवसरों पर बुलाए जाने वाले कार्यों की एक सूची होती है। (इसे हुक चलाना कहते हैं।)

ओएस एक्स और आईओएस

 * Cydia Substrate जेलब्रेक किए गए iOS उपकरणों के लिए एक ढांचा है जो डेवलपर्स को किसी अन्य ढांचे या एप्लिकेशन से जुड़ने की अनुमति देता है।
 * harpoon रनटाइम फ़ंक्शन हुकिंग के लिए एक OS

गहराई में एपीआई हुकिंग

 * x86 API Hooking Demystified x86 आर्किटेक्चर के लिए विभिन्न एपीआई हुकिंग विधियों पर लेख।

श्रेणी:प्रवाह नियंत्रित करें श्रेणी:डीएलएल इंजेक्शन श्रेणी:उदाहरण कोड वाले लेख