2011-08-20 7 views
6

काम नहीं करता है, बाहरी प्रक्रिया में आईएम हुकिंग फ़ंक्शन ऑफ़सेट के माध्यम से काम करता है। लेकिन मैं एक "debugLog (चार ...)" समारोह ने पाया है कि अभी भी बाइनरी में मौजूद हैं, लेकिन does not कोई मुद्रण करते हैं - - यही कारण है कि कार्यों अब तक hooking im के लिए अच्छी तरह से काम यह इस"रिक्त" फ़ंक्शन के लिए बाहरी प्रक्रिया में हुकूटर हुक

debugMessage proc near    ; 
      xor  eax, eax  ; Logical Exclusive OR 
      retn     ; Return Near from Procedure 
debugMessage endp 

तरह लग रहा है यह इस

push offset debugString ; "This is a debug message"... 
call debugMessage ; Call Procedure 

अब डिबग संदेश स्पष्ट रूप से अक्षम कर दिया गया है जैसे कहा जाता है, मैं के रूप में मैं बस पहले से ही इसी तरह के समारोह (चार ..) बाइनरी में में हुक करने में सक्षम था इस में हुक करना चाहता था।

typedef void (__stdcall* DebugLog)(const char*); 
DebugLog Real_DebugLog = (DebugLog)(0xCAFEBABE); 

extern "C" 
{ 
static void __stdcall Hook_DebugLog(const char*); 
} 

void __stdcall Hook_DebugLog(const char* text) { 
MessageBox(NULL, text, "MyDebugLog", MB_OK); 
return Real_DebugLog(text); 
} 

// in dll main attach.. 
DetourTransactionBegin(); 
DetourUpdateThread(GetCurrentThread()); 
DetourAttach(&(PVOID&)Real_DebugLog, (PVOID)Hook_DebugLog); 

एक समान दृष्टिकोण अन्य सभी कार्यों मैं अब तक इस बाइनरी में झुका है काम करता है:

इस कोड है। मैंने यह भी सुनिश्चित किया कि डीबग मैसेज को डीबगर के साथ भी बुलाया जाता है।

कोई विचार क्यों यह हुक बिल्कुल काम नहीं कर रहा है? शायद क्योंकि समारोह में विभिन्न तर्क हो सकते हैं? मैं पहले से ही कॉन्स चार * के साथ कोशिश की, ...)।

उत्तर

2

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

+0

धन्यवाद - क्या कोई और समाधान है? – Steve

+0

केवल अन्य तरीकों से – paulm

3

एक "डिटोर" के लिए काम करने के लिए न्यूनतम 5 बाइट की आवश्यकता होती है (x86) - debugMessage केवल 3 बाइट्स है।

+0

सभी कॉल साइटों को अलग करने के लिए विशिष्ट उत्तर के लिए धन्यवाद, क्या आप एक और समाधान जानते हैं? – Steve

+0

आप सॉफ्टवेयर या हार्डवेयर ब्रेकपॉइंट्स का उपयोग कर सकते हैं। Http://msdn.microsoft.com/en-us/library/ms679274(v=vs.85).aspx – Nop

+0

पर एक नज़र डालें हां, कम से कम सॉफ़्टवेयर ब्रेकपॉइंट्स मदद कर सकते हैं। आप उस कार्य के पहले बाइट के बजाय 0xcc (int 3) डाल सकते हैं जिसे आप हुक करना चाहते हैं, और एक जाल हैंडलर प्रदान करते हैं। वेक्टर अपवाद हैंडलिंग (वीईएच) नोर्डगार्ड का उल्लेख यहां मदद कर सकता है। – Eugene

संबंधित मुद्दे