2012-04-10 11 views
15

निम्न असेंबली कोड एक एंटी-डिबगिंग उपकरण क्यों है?यह कोड मुझे डीबगर का पता लगाने में सक्षम क्यों करता है?

l1: 
call l3 
l2: 
;some code 
l3: 
mov al, 0c3h 
mov edi, offset l3 
or ecx, -1 
rep stosb 

मुझे पता है कि C3hRETN है और मुझे पता है कि stobsedi में ऑफसेट और यह rep की वजह से ecx समय के लिए किया जाता है के अनुसार opcode के रूप में al में मूल्य लिखता है।

मुझे यह भी पता है कि stobs और stosw चलाए जाएंगे यदि वे इंटेल आर्किटेक्चर पर उनके मूल प्रारूप के रूप में पूर्व-प्राप्त किए गए थे।

यदि हम डिबग किए गए मोड में प्रोग्राम चलाते हैं तो प्री-फ़ेच अप्रासंगिक है और एल 2 लेबल चलाएगा (क्योंकि यह सिंगल-चरण है) अन्यथा यदि कोई डीबगर नहीं है तो यह l1 और l3 am के बीच पिंग-पोंग होगा। सही?

+1

क्या यह अभी भी इस बात पर निर्भर नहीं करेगा कि यह एकल चरण पर सेट है या नहीं? क्योंकि मैं ईमानदारी से नहीं देख सकता कि क्यों अन्यथा इस पर डीबगर ठोकर खाएगा। एकल चरण में नियम कुछ हद तक अलग हैं। – 0xC0000022L

+0

http://stackoverflow.com/questions/12633599/anti-debug-using-prefetch-queue-doesnt-work-with-my-cpu – 0x90

उत्तर

13

जब प्रोग्राम डीबग किया जाता है (यानी एक चरण) prefetch कतार प्रत्येक चरण (जब बाधा होती है) पर फिसल जाती है। हालांकि, जब सामान्य रूप से निष्पादित किया जाता है तो rep stosb नहीं होगा। rep movs और rep stosb को छोड़कर स्व-संशोधित कोड का समर्थन करने के लिए, कैश किए गए क्षेत्र में स्मृति लिखने के दौरान भी पुराने प्रोसेसर इसे फ्लश नहीं करते थे। (IIRC यह अंततः i7 प्रोसेसर में तय हुई थी।)

क्यों अगर वहाँ एक डिबगर (एकल चरण) कोड सही ढंग से निष्पादित करेंगे और जब rep stosbretl2 ने ले ली है निष्पादित किया जाएगा है यही कारण है कि। जब कोई डीबगर rep stosb जारी रहेगा, तब से ecx सबसे बड़ा संभव है क्योंकि अंत में यह लिखना नहीं चाहिए और यह एक अपवाद होगा।

यह एंटी-डिबगिंग तकनीक this paper में वर्णित है।

+1

लिंक के लिए धन्यवाद! –

+2

सभी सड़कों पीटर फेरी के लिए नेतृत्व ... – Leigh

2

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

तो मुझे लगता है क्या साथ डिबगर होता एल 1 कॉल L3, जो प्रतिनिधि stosb के बाद एक वापसी संग्रहीत करता है, और बदले में लंबे समय एकल स्टेपिंग में डिबगर द्वारा प्रेरित देरी की becaued निष्पादित हो जाता है, cachecline L3 containng लिए मजबूर बदले जाने के बाद रीफ्रेश किया जाना है।

डीबगर के बिना, मुझे लगता है कि स्टॉब्स निष्पादित होने के बाद निर्देश (दिखाया नहीं गया)। यदि यह "कोई डीबगर नहीं" पर कूद था तो कूद की सफलता से पता चलता है कि कोई एकल-चरण डीबगर का उपयोग नहीं किया जा रहा था।

यदि मुझे यह कोड किसी एप्लिकेशन में मिला, तो मैं इसे चलाने से इनकार कर दूंगा।

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