
एक इवेंट-संचालित मल्टी-कोर प्रक्रिया डिबगिंग, ट्रेसिंग और हेरफेर फ्रेमवर्क।
libptrace एक इवेंट-संचालित प्रक्रिया/थ्रेड डीबगिंग, ट्रेसिंग और मैनिपुलेशन फ्रेमवर्क है। यह C में लिखा गया है और इसमें Python 2.7 और 3.7 बाइंडिंग हैं।
इसे एक लाइब्रेरी के रूप में उपयोग करने का इरादा है। API को क्रॉस-प्लेटफ़ॉर्म समर्थन को ध्यान में रखकर डिज़ाइन किया गया है। हालाँकि वर्तमान संस्करण केवल Windows के 32- और 64-बिट (wow64 समर्थित) संस्करणों पर चलता है, डिज़ाइन और एब्स्ट्रैक्शन ऐसे हैं कि अन्य प्लेटफ़ॉर्म और यहाँ तक कि रिमोट डीबगिंग समर्थन को भी उसी API के अंतर्गत जोड़ा जा सकता है।
यह मल्टीपल कोर/थ्रेड से अवगत है, और इसका उपयोग एक साथ कई इवेंट लूप चलाने के लिए आसानी से किया जा सकता है। डीबगिंग प्रोसेस समूहों या पाइपलाइनों या बड़ी संख्या में प्रक्रियाओं को ट्रेस करने को इस तरह से निष्पादन कोर बढ़ाकर स्केल किया जा सकता है।
मैंने libptrace का प्रारंभिक संस्करण 2006 में विश्वविद्यालय में पढ़ाई के दौरान लिखा था, और 2011 में इसे Immunity Inc. द्वारा पूर्ण उपयोग के लिए पुनः लाइसेंस दिया, जो उस समय मेरा नियोक्ता था। इस समय के आसपास फ्रेमवर्क को Immunity Debugger में एकीकृत किया जाना था, हालाँकि मैंने हमेशा फ्रेमवर्क को अलग रखने का ध्यान रखा है, ताकि इसका उपयोग स्वतंत्र रूप से किया जा सके।
इस लक्ष्य को ध्यान में रखते हुए इसने Immunity में बहुत विकास देखा, और मैं आभारी हूँ कि मैं अपने काम के घंटों के दौरान इस पर सक्रिय रूप से विकास कर पाया और फ्रेमवर्क को अधिक परिपक्व होते देखा। मैंने इसके अधिकांश भाग को मल्टीपल कोर से अवगत होने, Python बाइंडिंग प्रदान करने और बेहतर एब्स्ट्रैक्शन बनाने के लिए पुनः डिज़ाइन किया।
x64dbg के अंतिम रिलीज़ के साथ, यह निर्णय लिया गया कि हम Immunity Debugger पर अब काम नहीं करेंगे, और इसके बजाय अपने प्रयासों को अन्य चीज़ों पर केंद्रित करेंगे। इससे libptrace का विकास भी रुक गया, और अगले वर्षों तक यह आंतरिक git रिपॉजिटरी में धूल खाता रहा, जब तक कि Cyxtera Technologies द्वारा Immunity Inc. के अधिग्रहण के बाद, अब Cyxtera Cybersecurity Inc. के अंतर्गत, परियोजना को LGPL संस्करण 2.1 के तहत जारी करने का निर्णय लिया गया, ताकि यह उम्मीद से अपनाया जा सके और आगे विकसित हो सके।
मैं Immunity Inc., साथ ही Cyxtera Technologies और Cyxtera Cybersecurity Inc. का इस रिलीज़ को संभव बनाने के लिए तहे दिल से धन्यवाद करना चाहता हूँ। साथ ही, मैं विशेष रूप से Dave Aitel का धन्यवाद करना चाहता हूँ, जिन्होंने प्रबंधन की परतों के माध्यम से इस रिलीज़ को आगे बढ़ाया और मुझे प्रक्रिया के नौकरशाही भागों से बचाया। यह देखना दुखद होता अगर मेरी मेहनत बेकार चली जाती और बिना उद्देश्य के, और उनकी libptrace विकास को जारी करने की इच्छा के बिना, जो आंतरिक रूप से ओपन सोर्स के रूप में किया गया था, यही होता।
मैं उन कई सहकर्मियों को भी धन्यवाद देना चाहता हूँ जिन्होंने फ्रेमवर्क का उपयोग करने या उस पर काम करने में समय बिताया, विशेष रूप से Massimiliano Oldani, Roderick Asselineau, और Christos Kalkanis। मेरा धन्यवाद Lennert Buytenhek तक भी फैला है उनके इंट्रूसिव AVL ट्री और लिंक्ड लिस्ट कार्यान्वयन के लिए, जिनका मैंने अंततः उपयोग किया।
हालाँकि परियोजना पर कोई काम हुए 4 साल से अधिक हो चुके हैं, मुझे उम्मीद है कि लोग इसे उपयोगी पाएंगे। मेरा मानना है कि डिज़ाइन और स्रोत कोड अपेक्षाकृत साफ हैं, और इस बिंदु पर फ्रेमवर्क को अपेक्षाकृत आसानी से अन्य प्लेटफ़ॉर्म पर विस्तारित और पोर्ट किया जा सकता है। उम्मीद है कि एक दिन यह एक सुसंगत API के तहत एक सच्ची क्रॉस-प्लेटफ़ॉर्म डीबगिंग लाइब्रेरी में बदल सकता है।
अंत में, मैं इस परियोजना को अपनी खोई हुई बेटी, Yuzuyu Huizer, को समर्पित करना चाहता हूँ, जिससे मुझे एक दिन फिर से मिलने की उम्मीद है। मैं तुमसे प्यार करता हूँ।
-- Ronald Huizer [email protected]
वर्तमान समर्थित निर्माण विधि MinGW और CMake का उपयोग करके परियोजना को क्रॉस-कम्पाइल करना है। बिल्ड सिस्टम का परीक्षण Ubuntu 19.04 पर किया गया है।
32-बिट इंस्टॉलर का निर्माण इस प्रकार किया जा सकता है:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x86.cmake .
make
makensis libptrace-setup.nsi
64-बिट इंस्टॉलर का निर्माण इस प्रकार किया जा सकता है:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_TOOLCHAIN_FILE=mingw-w64-x64.cmake .
make
makensis -DUSE64 libptrace-setup.nsi
उपरोक्त निर्माण चरणों का पालन करने के बाद, 32-बिट इंस्टॉलर libptrace-setup32.exe पर और 64-बिट इंस्टॉलर libptrace-setup64.exe पर होगा।
इंस्टॉलर स्वचालित रूप से यह निर्धारित करेगा कि Python के कौन से संस्करण स्थापित हैं और वे 32-बिट हैं या 64-बिट। जो संस्करण पाए गए, वे इंस्टॉलर द्वारा पेश किए जाएंगे, और जो नहीं पाए गए, उन्हें धुंधला कर दिया जाएगा।
रिलीज़ डाउनलोड यहाँ पाए जा सकते हैं।
doc/ निर्देशिका निराशाजनक रूप से पुरानी है। इसे अधिक वर्तमान दस्तावेज़ीकरण के लिए एक प्रारंभिक बिंदु के रूप में शामिल किया गया है। कृपया इसका उपयोग न करें।
python/scripts निर्देशिका में कई उदाहरण स्क्रिप्ट पाए जा सकते हैं। उन्हें Program Files\Immunity Inc\libptrace या 32-बिट संस्करण के मामले में Program Files (x86)\Immunity Inc\libptrace में स्थापित किया जाएगा।
ये उदाहरण किसी भी तरह से फ्रेमवर्क को पूरी तरह से नहीं दिखाते, लेकिन उन्हें किसी भी व्यक्ति के लिए एक अच्छा प्रारंभिक बिंदु प्रदान करना चाहिए जो फ्रेमवर्क का उपयोग करना चाहता है। C API का अच्छी तरह से दस्तावेज़ीकरण नहीं किया गया है, लेकिन कुछ उदाहरण unittests/windows निर्देशिका में पाए जा सकते हैं। python/ निर्देशिका जिसमें Python बाइंडिंग हैं, एक अच्छा अवलोकन भी प्रदान करती है। अंत में, include/libptrace निर्देशिका में हेडर फ़ाइलें हैं जो सार्वजनिक हैं, और इस प्रकार API फ़ंक्शन की एक अच्छी सूची प्रदान करती हैं।
यह ध्यान दिया जाना चाहिए कि Python API वर्तमान में C API का काफी सीमित उपसमुच्चय है।
एक उदाहरण के रूप में, एक निष्पादन योग्य में RegOpenKeyExW कॉल को ट्रेस करने का सामान्य वर्कफ़्लो होगा:
import _ptrace
def bp_handler(bp, thread):
(key, subkey, options, sam, result) = _ptrace.cconv.args_get(thread, "%u%p%u%u%p")
subkey = thread.process.read_utf16(subkey)
print('T{}: RegOpenKeyEx({}, "{}", 0x{:08x}, 0x{:08x}, 0x{:08x})'
.format(thread.id, key, subkey, options, sam, result), end='')
def attached_handler(process):
bp = _ptrace.breakpoint_sw("advapi32!RegOpenKeyExW", bp_handler)
process.breakpoint_set(bp)
handlers = _ptrace.event_handlers()
handlers.attached = attached_handler
_ptrace.execv(r"C:\Windows\Notepad.exe", [], handlers, 0)
_ptrace.main()
यदि RegOpenKeyExW के वापसी मूल्य की भी आवश्यकता है, तो फ़ंक्शन कॉल के वापसी पते पर एक ब्रेकपॉइंट सेट करना सबसे आसान है। यह स्थिर रूप से फ़ंक्शन निकास पथ निर्धारित करने के लिए कोड विश्लेषण की आवश्यकता से बचाता है:
def bp_end_handler(bp, thread):
print("=", _ptrace.cconv.retval_get(thread))
def bp_handler(bp, thread):
(key, subkey, options, sam, result) = _ptrace.cconv.args_get(thread, "%u%p%u%u%p")
subkey = thread.process.read_utf16(subkey)
print('T{}: RegOpenKeyEx({}, "{}", 0x{:08x}, 0x{:08x}, 0x{:08x})'
.format(thread.id, key, subkey, options, sam, result), end='')
retaddr = _ptrace.cconv.retaddr_get(thread)
if thread.process.breakpoint_find(retaddr) is None:
bp_end = _ptrace.breakpoint_sw(retaddr, bp_end_handler)
thread.process.breakpoint_set(bp_end)
कॉपीराइट की स्थिति प्रत्येक व्यक्तिगत फ़ाइल में स्पष्ट की गई है। वे अधिकांशतः Cyxtera Cybersecurity Inc., Ronald Huizer, या दोनों के पास एक साथ हैं। कुछ चुनिंदा फ़ाइलों में तीसरे पक्ष के कॉपीराइट धारक हैं, जैसे कि Lennert Buytenhek।
GNU Lesser General Public License के संस्करण 2.1 के तहत वितरित। अधिक जानकारी के लिए COPYING और COPYING.LESSER देखें।