2009-06-11 19 views
6

लेखन यह खिड़कियों के तहत एक प्रोग्राम है जो एक दूरस्थ प्रक्रिया धागा एक पूर्वनिर्धारित पता पहुँचने पर (है कि सूत्र में बंद निष्पादन) को तोड़ने के लिए कारण होगा लिखने के लिए संभव है?एक बहुत ही बुनियादी डिबगर

मैं Windows डीबग एपीआई के साथ प्रयोग किया गया है, लेकिन यह बहुत ही सीमित है, जब यह breakpoints स्थापित करने की बात आती है लगता है। DebugBreakProcess फ़ंक्शन आशाजनक लग रहा था, लेकिन मुझे इस API कॉल का उपयोग करने के तरीके पर कोई उदाहरण नहीं मिल रहा है।

उत्तर

12

आप पता करने के लिए (86, 0xCC की एक opcode पर) WriteProcessMemory उपयोग करने के लिए एक ब्रेकपाइंट लिखने के लिए की जरूरत है। x86 पर, जब डीबगेज कोड में उस बिंदु को हिट करता है तो 0xCC एक int 3 अपवाद उत्पन्न करेगा। यह आपके डीबगर द्वारा लिया गया है WaitForDebugEvent EXCEPTION_DEBUG_EVENT सेट के साथ एक DEBUG_EVENT लौटाएगा।

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

DebugBreakProcess एक प्रक्रिया आप डीबग कर रहे हैं के दूरदराज के एक ब्रेक उत्पन्न करने के लिए प्रयोग किया जाता है - यह कोड में एक मनमाना बिंदु पर तोड़ने के लिए नहीं किया जा सकता।

+0

तो मैं कुछ ऐसा कर सकता था: 1. पूर्व निर्धारित पते (पीए) पर वर्तमान सेशन पढ़ें और इसे स्टोर करें 2. एक 3 एक्स अपवाद उत्पन्न करने के लिए op को 0xCC और NOPS के साथ बदलें (क्या int 3 अपवाद स्वचालित रूप से होगा निष्पादन रोक?) 3. पकड़ने EXCEPTION_DEBUG_EVENT 4. मैं धागे के निष्पादन सही ढंग से बंद कर दिया है, लेकिन मैं कोड का हिस्सा बदल दिया है और अवांछित परिणाम प्राप्त हो जाएगा। मैं पीए में संग्रहीत ओपी को फिर से लिखने की कोशिश कर सकता था लेकिन क्या यह पहले से ही बहुत देर हो चुकी नहीं है? क्या मैं मैन्युअल रूप से ओपी को मैन्युअल रूप से निकालने के लिए रिमोट थ्रेड को मजबूर कर सकता हूं? – ldog

+1

पैच के लिए बहुत देर हो जाएगी - लक्ष्य आईपी नहीं बदला है और जारी रखने से डीब्यूजी अपवाद को फिर से जारी कर देगा यदि आपने कोड नहीं बदला है। – Michael

+0

मुझे पैचिंग में समस्याएं आ रही हैं। मैं तोड़ बिंदु निर्धारित कर सकते हैं और मैं ब्रेकप्वाइंट अपवाद पकड़ कर सकते हैं लेकिन वापस मूल opcode मैं पहुँच voilation अपवाद प्राप्त जिसका अर्थ है कि कार्यक्रम ठीक से कोड exectue नहीं है लिखने के लिए जब मैं WriteProcessMemory की कोशिश करो। मैं WriteProcessMemory के बाद फ्लशइनस्ट्रक्शन कैश करता हूं लेकिन यह मदद नहीं करता है। – ldog

1

माइकल सही है - अगर आप संलग्न होने के बाद डीबगर में मनमाने ढंग से प्रक्रिया में तोड़ना चाहते हैं (यानी यदि उपयोगकर्ता अचानक "प्रक्रिया में तोड़" देता है), मानक तरीका बनाना है एक रिमोट थ्रेड जिसका नियमित रूप से int3 जारी करता है।

+0

DebugBreakProcess रिमोट थ्रेड बनाने के लिए प्रतीत होता है जो टूटता है। – Michael

+0

ओह हाँ, फिर इसका उपयोग करें - CreateRemoteThread का उपयोग करके सही रूप से काफी मुश्किल है। –

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