हुकिंग

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

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

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

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

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

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

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

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

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

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

सी# कीबोर्ड इवेंट हुक
निम्न उदाहरण माइक्रोसॉफ्ट नेट फ्रेमवर्क का उपयोग करके माइक्रोसॉफ़्ट विंडोज़ में कीबोर्ड ईवेंट को प्रदर्शित करता है।

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

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

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

यह भी देखें

 * कॉलबैक (कंप्यूटर विज्ञान)
 * डेलीगेशन (प्रोग्रामिंग)
 * टर्मिनेट स्टेरेजिडेंट प्रोग्राम
 * यूसर एग्जिट प्रोग्राम
 * विंडोज़ एपीआई ओवरराइड 32

संदर्भ

 *  [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 हुकिंग और डायनामिक-लिंक लाइब्रेरी इंजेक्शन लाइब्रेरी है।
 * 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 आर्किटेक्चर के लिए विभिन्न एपीआई हुकिंग विधियों पर लेख।