2010-03-29 14 views
8

पर कोड बदलना मेरे पास एक फ़ंक्शन के लिए एक पॉइंटर है (जो मुझे एक vtable से मिलता है) और मैं रनटाइम पर असेंबलर कोड (कुछ बाइट्स को बदलकर) बदलकर फ़ंक्शन को संपादित करना चाहता हूं। मैंने मेमसेट का उपयोग करने की कोशिश की और नए मान को सीधे निर्दिष्ट करने की कोशिश की (एमपीआरटी [0] = एक्स, एमपीआरटी [1] = वाई इत्यादि जैसे कुछ) लेकिन मुझे सेगमेंटेशन गलती मिल रही है। मैं कोड कैसे बदल सकता हूं?रनटाइम

(मैं सी ++ का उपयोग कर रहा हूं)

ओएस विंडोज़ है।

+1

के साथ पहली मेमोरी विशेषताओं की जांच करें कौन सा ऑपरेटिंग सिस्टम? – elcuco

+1

हालांकि आप ऐसा करने की कोशिश क्यों कर रहे हैं? निश्चित रूप से एकमात्र कारण कामकाजी स्मृति की मात्रा को कम करना है क्योंकि आप डिस्क से कोड के अनुभाग लोड कर सकते हैं। यदि आप समझाते हैं कि आप क्या करने की कोशिश कर रहे हैं, तो हम मदद कर सकते हैं। – thecoshman

+0

स्व-संशोधित कोड कठिन है। यह ओएस पूरी तरह से असेंबली में लिखा गया था क्योंकि मध्य-स्तर की भाषा में स्वयं-संशोधित कोड की अनुमति देने के लिए वाक्यविन्यास नहीं है: http://valerieaurora.org/synthesis/SynthesisOS/abs.html। –

उत्तर

6

आम तौर पर: अगर एपीआई कॉल वर्चुअलअलोक के साथ मेमोरी आवंटित की जाती है तो आप एपीआई कॉल VirtualProtect के साथ मेमोरी विशेषताओं को बदल सकते हैं। एपीआई कॉल VirtualQuery

+0

धन्यवाद, यह वही है जो मैं ढूंढ रहा था – polo

3

ऑपरेटिंग सिस्टम और/या आर्किटेक्चर के आधार पर आप निष्पादन योग्य पृष्ठों को लिख सकते हैं या नहीं लिख सकते हैं।

निष्पादन योग्य या केवल इंटेल (आईए -32e) मैनुअल में पढ़ने के लिए पृष्ठों को चिह्नित करने के बारे में दस्तावेज़ों की जांच करें। कोड केवल पढ़ने के लिए खंड में स्थित हो सकता है, इसलिए, आप इसे लिख नहीं सकते हैं।

आप कोड को केवल पृष्ठों को पढ़ने में रहने के लिए चिह्नित नहीं कर सकते हैं, लेकिन यह संकलक विशिष्ट है (जेआईटी कंपाइलर्स ऐसा करते हैं)।

एमएसवीसी के तहत, आप #pragma section का उपयोग रीड-राइट सेक्शन बनाने के लिए कर सकते हैं और इसमें #pragma alloc_text का उपयोग करने के लिए इसका उपयोग कर सकते हैं।

-1

मेमोरी अनुभाग जहां आपका कोड रहता है आमतौर पर केवल पढ़ने के रूप में चिह्नित किया जाता है। यही कारण है कि आप विभाजन विफलता प्राप्त करते हैं। आप इस ध्वज को संकलक के लिए विशेष कुंजी द्वारा (या इसके बारे में निश्चित नहीं) या फिर बाइनरी फ़ाइल को संशोधित करके (फिर से 100% नहीं) को संशोधित करके

0

सामान्य रूप से, आप लिखने की कोशिश कर रहे हैं कोड सेगमेंट, कुछ नए ऑपरेटिंग सिस्टम आपको करने से रोक देंगे। इस तरह कुछ वायरस काम करते हैं।

उस सुरक्षा को हटाने के लिए एपीआई हैं, लेकिन वे ऑपरेटिंग सिस्टम पर निर्भर हैं।