का "निकास" कैसे ढूंढें परीक्षण 32-bit x86
लिनक्स पर है।सी प्रोग्राम
तो मूल रूप से मैं असेंबली कोड में उपकरण निर्देशों को सम्मिलित करके निष्पादित मूल ब्लॉक की जानकारी लॉग करने का प्रयास कर रहा हूं।
मेरी रणनीति इस तरह है: एक ग्लोबल सरणी में निष्पादित मूल ब्लॉक की अनुक्रमणिका लिखें, और सरणी पूर्ण होने पर सरणी को डिस्क से डिस्क में फ्लश करें (16 एम)।
यहां मेरी समस्या है। उपकरण की बाइनरी के निष्पादन के दौरान मुझे डिस्क पर सरणी को फ्लश करने की आवश्यकता होती है, भले ही यह 16 एम सीमा तक न पहुंच जाए। हालांकि, मुझे नहीं पता कि assembly
प्रोग्राम से बाहर निकलने के लिए कहां खोजें। लक्ष्य विधानसभा कार्यक्रम से
grep exit
, और सहीcall exit
अनुदेश से पहले स्मृति फ्लश:मैं इस कोशिश की। लेकिन कुछ डीबगिंग अनुभव के अनुसार, लक्ष्य सी प्रोग्राम,
md5sum
बाइनरी कहता है, जब यह निष्पादन समाप्त होता है तोexit
पर कॉल नहीं करता है।main
फ़ंक्शन के अंत में स्मृति को फ्लश करें। हालांकि, असेंबली कोड में, मुझे नहीं पता किmain
फ़ंक्शन का सटीक अंत कहां है। मैं एक रूढ़िवादी दृष्टिकोण कर सकता हूं, कह सकता हूं, सभीret
निर्देश की तलाश में, लेकिन मुझे लगता है किmain
फ़ंक्शनret
निर्देश के साथ समाप्त नहीं होता है।
तो यहाँ है, मेरे सवाल यह है कि कैसे वहाँ एक assembly code
का सही निष्पादन अंत की पहचान करने के लिए, और सम्मिलित कुछ इंस्ट्रूमेंटेशन निर्देश? कुछ लाइब्रेरी कोड हुकिंग मेरे लिए ठीक है। मैं विभिन्न इनपुट के साथ समझता हूं, बाइनरी अलग-अलग स्थिति से बाहर निकल सकता है, इसलिए मुझे लगता है कि मुझे कुछ रूढ़िवादी अनुमान की आवश्यकता है। क्या मैंने स्पष्ट कर दिया है? धन्यवाद!
क्या आपका उपकरण कुछ मुफ्त सॉफ्टवेयर है? मुझे आपके कोड के अंदर देखने में खुशी होगी .... –
मुझे नहीं लगता कि यह हमेशा अच्छी तरह से परिभाषित किया जाता है। एक बार जब ऑप्टिमाइज़र ने अपना काम किया हो, तो हो सकता है कि कार्यों के बीच सीमाएं, या यहां तक कि 'मुख्य()' और libc की सामग्री के बीच भी परिभाषित सीमाएं न हो जाएं (प्रोग्राम का एंट्रीपॉइंट)। एक संभावित सुराग का पता लगाना होगा कि कैसे ढेर का उपयोग किया जा रहा है, लेकिन फिर से, मुझे नहीं लगता कि यह जरूरी है कि प्रोग्राम बाहर निकलने पर स्टैक पूरी तरह से उलट जाएगा। – Havenard