2011-09-02 19 views
8

के साथ पंजीकरण करने के लिए कर्नेल के साथ संवाद कैसे करें, हालांकि मैंने बहुत कुछ खोजा है, लेकिन यह अभी भी अस्पष्ट है कि वास्तव में "हुक" क्या है। उदाहरण के लिए, मैं wiki answers पर इस पोस्ट को पढ़ें:"हुक" क्या है और मैं जावा में एक कैसे लिख सकता हूं? और उपयोगकर्ता द्वारा दबाए गए कुंजी/ओएस

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

मैंने यह post भी पढ़ा, लेकिन मुझे अभी भी समझ में नहीं आता कि "हुक" वास्तव में क्या है। क्या कोई व्यक्ति कृपया व्याख्यान शब्दों में व्याख्या कर सकता है, "हुक" क्या है? कुछ लोग "हुक" क्यों लिखते हैं? साथ ही, जावा में "हुक" लिखना संभव है?

नोट:

मैं जावा में एक keylogger लिखना चाहते थे और मेरे दोस्त में से एक ने कहा कि यदि आप एक "हुक" लिखने के लिए सी मैं जावा में पूरी keylogger नहीं लिख सकता होगा (केवल विंडोज़ पर संचालित किया जाएगा)?

संपादित

कृपया keylogger w.r.t एक जवाब दे। हुकिंग का उपयोग करके मेरे आवेदन पर दबाए गए कुंजी के बारे में जानकारी देने के लिए मैं kernel से कैसे पूछ सकता हूं? या मैं जेएनआई का उपयोग कर ओएस के साथ अपना आवेदन कैसे पंजीकृत कर सकता हूं? मैं चाहता हूं कि मेरा एप्लिकेशन उपयोगकर्ता द्वारा दबाए गए कुंजियों को रिकॉर्ड करे।

+1

मुझे लगता है कि आपके मित्र का कहना है कि आपको मूल विधि का उपयोग करने की आवश्यकता होगी। आप सी में मूल विधि लिख सकते हैं और इसे जावा नेटिव इंटरफेस (जेएनआई) का उपयोग कर जावा से कॉल कर सकते हैं। – toto2

+0

@ toto2 और कहा कि देशी विधि क्या करेंगे? – saplingPro

+0

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

उत्तर

2

मैं कम से कम दो अलग अवधारणाओं के साथ शब्द हुक संबद्ध कर देते:

एक) पर्यवेक्षक पैटर्न, जहां एक वर्ग आप एक श्रोता कि कुछ घटनाओं पर सूचित किया जाएगा जोड़ सकते हैं। आप इसे पूरे स्विंग, सर्वलेट एपीआई और कई तृतीय पक्ष ढांचे में पा सकते हैं।

बी) टेम्पलेट विधि पैटर्न। एक अमूर्त वर्ग परिभाषित करता है कि किस क्रम में किन तरीकों को बुलाया जाता है, और कार्यान्वयन वर्ग इन विधियों को ओवरराइड कर सकता है। इसके उदाहरण नहीं हैं आम है, लेकिन आप उन्हें हर बार एक बार देखते हैं।

1

इसके लिए अन्य नाम प्रतिनिधि या कॉलबैक हो सकते हैं।

जावा में इसका एक उदाहरण माउसलिस्टर (http://download.oracle.com/javase/tutorial/uiswing/events/mouselistener.html) है। MouseListenermouseClicked(MouseEvent e) जैसी विधियों के साथ एक इंटरफ़ेस है। उपयोगकर्ता से माउस क्रियाओं का जवाब देने के लिए, आप MouseListener लागू करेंगे और जब उपयोगकर्ता क्लिक करेगा, तो जावा स्विंग लाइब्रेरी आपके श्रोता वर्ग को कॉल करेगी (इसे addMouseListener पर कॉल करके इसे पंजीकृत करने के बाद।- कि बाहरी वस्तु संदर्भ पारित है और यह बाहरी वस्तु पहले क्रियान्वित किया जा रहा है

public void hookableMethod(HookObject hook, String param) { 
String innerParam = param; 
if(hook != null) { 
innerParam = hook.someHookMethod(innerParam); 
} 

//rest of the code is working with inner param 
} 

इस oversimplified उदाहरण में hookableMethod बाहरी संस्था यह हुक करने के लिए एक तरीका प्रदान करता:

1

यहाँ एक सरल उदाहरण है । इसलिए यदि आपको कुछ प्रकार की प्रसंस्करण की आवश्यकता है जो मूल कार्यान्वयन का हिस्सा नहीं है तो आप मूल स्रोत को पैच करके संदर्भ को पार करके इसे आसानी से कर सकते हैं।

5

Hooking - Wikipedia से,

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

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

Runtime.addShutdownHook(new Thread(){ 
    @Override 
    public void run(){ 
     // do something before application terminates 
    } 
}); 
1

keylogger के लिए के रूप में: हाँ आप जावा में इसमें से अधिकांश में लिख सकते हैं, लेकिन एक छोटा सा हिस्सा है क्योंकि एक वैश्विक हुक एक DLL/धागा/जो कुछ भी हो जाता है के साथ उदाहरण के लिए एक JNI मॉड्यूल में जाना होगा "इंजेक्शन" अन्य प्रक्रियाओं में ... चूंकि सभी प्रक्रिया एक जेवीएम होस्ट नहीं करते हैं। यह जावा में काम नहीं करेगा ... इस प्रकार आपको अपने कीलॉगर के उस हिस्से के लिए डीएलएल लिखने के लिए जेएनआई और कुछ सी का उपयोग करने की आवश्यकता है ...

संपादित करें - टिप्पणी के अनुसार:

This article का वर्णन में गहराई से वैश्विक हुक करना क्या है और क्या मतलब है आदि इंजेक्शन लगाने के द्वारा ...

+0

@ याहिया '" वैश्विक हुक एक DLL/धागा/हो जाता है जो कुछ भी "इंजेक्शन" अन्य प्रक्रियाओं में .. "' आप और अधिक स्पष्ट है कि बनाने के लिए और अपने जवाब – saplingPro

+0

@grassPro में भाग शामिल कर सकते हैं - मेरी संपादित में लिंक को खुश ... – Yahia

1

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

यह केवल पर्यवेक्षक पैटर्न का एक अनुप्रयोग है।

एक काल्पनिक उदाहरण:

class MyKBHandler implements ISomeKeyboardListener { 
     public void onKeyDown(<params containing key info here>){ 
      //Your code here, doing something with the params. 
     } 
    } 

    MyKBHandler handler = new MyKBHandler(); 
    <someOSLibrary>.register(handler); 

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

चेक इस लिंक:

http://msdn.microsoft.com/en-us/library/ms632589%28VS.85%29.aspx

+0

और मैं कर्नेल से कैसे बात कर सकता हूं? – saplingPro

+0

कर्नेल से बात करें? आपको नहीं करना है बस ओएस के साथ पंजीकरण करें और यह आपके हैंडलर को प्रत्येक कुंजी स्ट्रोक पर कॉल करेगा। यह पेज http://en.wikipedia.org/wiki/Hooking में आप सी # keylogger का एक उदाहरण है, वहाँ खुला स्रोत कोड के बहुत सारे सब नेट पर भी हैं। –

+0

@ मिस्टर स्मिथ मैं JNI का उपयोग कर अपने आवेदन पंजीकृत करना चाहते हैं। यानी मैं ऐसा करने के लिए जावा और मूल कोड विशेष रूप से सी का उपयोग करना चाहता हूं। यह सवाल है। अब मैं ओएस के साथ कैसे पंजीकरण कर सकता हूं ताकि यह मेरे हैंडलर को प्रत्येक कुंजी स्ट्रोक पर कॉल कर सके। – saplingPro

1

निम्न स्तर डिवाइस घटनाओं मूल कोड (JNI, JNA, आदि) चल रहा है और अत्यधिक प्रणाली पर निर्भर है की जरूरत है कैप्चरिंग। लिनक्स पर आपको शायद कर्नेल के साथ संवाद करने की आवश्यकता नहीं होगी, शायद एक्स 11 सेवर के साथ।

0

सबसे पहले आप एक प्रबंधक वर्ग को परिभाषित करने के लिए है, ऐसा ही कुछ है:

package foo.bar 

public class SomeHookManager { 
    public static void initialize (...) { 
     // <pre-initialization-routing> 
     _native_init_(); 
     // <post-initialization-routing> 
    } 

    public static void registerCallback (IHookCallback callback) 
    { /* save this callback */ } 

    // this method will be invoked in your C code. 
    protected static void invokeCallback() { /* invoke the saved callback */ } 

    // this is a native method, the native modifier tells the compiler this method 
    // is implemented in C, and linked at runtime. 
    protected native static void _native_init_(); 
} 

फिर javah का उपयोग एक सी हैडर उत्पन्न करने के लिए, परिणाम की तरह कुछ (मैं वास्तव में इस कोड को संकलित नहीं किया है, इसलिए इस काल्पनिक) है:

/* 
* Class:  Win32 
* Method: _native_init_ 
* Signature:()V 
*/ 
JNIEXPORT void JNICALL Java_foo_bar_Win32_native_init_ 
    (JNIEnv * env, jobject obj); 

एक सी परियोजना बनाएँ, इस फ़ाइल में शामिल हैं और इस पद्धति को लागू। जब वास्तविक हुक शुरू हो सुनिश्चित करें, अपने सी कोड में invokeCallback फोन:

jclass cls = (*env)->GetObjectClass(env, obj); 
jmethodID mId = (*env)->GetStaticMethodID(env, cls, "invokeCallback", "()V"); 
if (mId == 0) { /* error handling */ } 
(*env)->CallStaticVoidMethod(env, cls, mId); 

DLL फ़ाइल में सी परियोजना संकलित करें, hookimpl_win32.dll कहते हैं, और dynamicly कहीं लिंक अपने जावा कोड में:

static { 
    System.loadLibrary("hookimpl_win32"); // no need of .dll or .so in Unix alike OS's 
} 

सुनिश्चित करें कि डीएल आपके जार के साथ एक ही फ़ोल्डर में है। या वीएम तर्क में -Djava.library.path=/path/to/your/dlls निर्दिष्ट करें।

कैसे आप हर कुंजी स्ट्रोक प्रवेश कर सकते हैं के रूप में, ओएस आम तौर पर कुछ एपीआई आप महत्वपूर्ण घटना रोकना के लिए प्रदान करते हैं। विंडोज सिस्टम के लिए, आप वैश्विक कुंजी संदेशों को अवरुद्ध करके इसे प्राप्त कर सकते हैं। मेरे पास अन्य प्रणालियों पर कोई अनुभव नहीं है। वैसे भी, आप उचित इंटरप्ट्स सेट कर सकते हैं, जो शांत निम्न स्तर है। आप हमेशा अपने उत्तर को Google पर भेज सकते हैं। :)