2011-02-03 4 views
11

मैं रन-टाइम पर (LD_PRELOAD) कैसे, विंडोज़ के लिए ला डिटोरस, लिनक्स पर fopen() जैसे सी फंक्शन को रोक/हुक कर सकता हूं? मैं इसे पायथन से करना चाहता हूं (इसलिए, मुझे लगता है कि प्रोग्राम पहले से ही एक सीपीथन वीएम चला रहा है) और पाइथन कोड पर भी दोबारा शुरू कर रहा है। मैं साझा पुस्तकालय कार्यों को सिर्फ हुकिंग के साथ ठीक हूं। मैं प्रोग्राम चलाने के तरीके को बदलने के बिना भी ऐसा करना चाहता हूं।लिनक्स पर पाइथन से सी कार्यों को गतिशील रूप से कैसे इंटरैप करना है (एलडी_PRELOAD के बिना)?

एक विचार ptrace() के आधार पर अपने खुद के उपकरण रोल करने के लिए, या dlsym() साथ या PLT में पाया कोड को फिर से लिखने, और ctypes -generated सी प्रतिदेय कार्यों को लक्षित पर है, लेकिन मैंने सोचा कि मैं यहाँ पहली बार पूछना चाहते हैं। धन्यवाद।

+0

* एलडी_PRELOAD के साथ * आप इसे कैसे करेंगे? –

+0

आपको अपने लिए निम्न-स्तरीय काम करने के लिए एक मूल मॉड्यूल लिखना होगा। यहां तक ​​कि यदि आप पाइथन से पीएलटी तक पहुंचने और संशोधित करने का प्रबंधन करते हैं (जो शायद संभव है), तो आपको पायथन वीएम लॉन्च करने के लिए कोड की आवश्यकता होगी। –

+1

@ मैट जॉइनर: जिस तरह से आप अपना प्रश्न पूछ रहे हैं, मैं इसे लेता हूं आपको कुछ ऐसा पसंद नहीं है, जिस स्थिति में यह उत्पादक/रचनात्मक होगा यदि आप अधिक विशिष्ट हो सकते हैं। लेकिन अगर आप वास्तव में सिर्फ पूछ रहे थे, तो इस तरह आप इंटरपॉजिशन को गतिशील रूप से कार्य करते हैं: http://stackoverflow.com/questions/426230/what-is-the-ld-preload-trick (और, हाँ, मैं ' मैंने इसे कई बार पहले लागू किया है) – Yang

उत्तर

2

google-perftools का src/windows/preamble_patcher* के तहत डेटोर का अपना कार्यान्वयन है। यह केवल इस समय खिड़कियां है, लेकिन मुझे कोई कारण नहीं दिखता है कि यह किसी भी x86 मशीन पर काम नहीं करेगा, इस तथ्य को छोड़कर कि यह प्रतीक पतों को देखने के लिए Win32 फ़ंक्शंस का उपयोग करता है।

कोड के एक त्वरित स्कैन और मैं इन Win32 इस्तेमाल किया कार्यों को देखते हैं, जो सभी के linux संस्करण है:

  • GetModuleHandle/GetProcAddress: समारोह का पता मिलता है। dlsym यह कर सकते हैं।
  • वर्चुअलप्रोटेक्ट: असेंबली के संशोधन की अनुमति देने के लिए। mprotect।
  • GetCurrentProcess: getpid
  • FlushInstructionCache (जाहिरा तौर पर एक टिप्पणी के अनुसार nop)

यह बहुत मुश्किल नहीं लगता है इस संकलित और अजगर में लिंक करने के लिए, लेकिन मैं के लिए एक संदेश भेजना चाहते हैं perftools devs और देखें कि वे क्या सोचते हैं।

+0

यह समझाने के लिए कि कौन सी असेंबली संशोधित है? –

+0

कृपया उल्लिखित स्रोत फ़ाइल से लिंक करें। –

+0

http://code.google.com/codesearch#BGeH2W13jNw/trunk/src/windows/preamble_patcher.cc&q=preamble_patcher%20package:http://gperftools%5C.googlecode%5C.com, win32 फ़ंक्शन कॉल कुछ निर्देश छोड़ दें प्रत्येक फ़ंक्शन कॉल की शुरुआत में जिसे आप जो भी फ़ंक्शन चाहते हैं उसे कूदने के लिए बदला जा सकता है। – aaron

2

आप इसे एक ऐसा करने के लिए एक प्रकार का एक डेवलपर से मिलेगा। this post देखें, जिसमें गतिशील रूप से लोड की गई लाइब्रेरी को पकड़ने के लिए एक पूर्ण पैच शामिल है। इसे पायथन से कॉल करने के लिए, आपको शायद सी मॉड्यूल बनाना होगा।

+0

शानदार लिंक, धन्यवाद। –

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