
Winstrument is a framework of modular scripts to aid in instrumenting Windows software using Frida for reverse engineering and attack surface analysis.
Winstrument, रिवर्स इंजीनियरिंग और अटैक सरफेस विश्लेषण के लिए Frida का उपयोग करके Windows सॉफ़्टवेयर को इंस्ट्रूमेंट करने में सहायता के लिए मॉड्यूलर स्क्रिप्ट्स का एक फ्रेमवर्क है।
यह प्रोजेक्ट python 3.7 का समर्थन करता है। यह मानते हुए कि आपके पास पहले से Python और pip स्थापित हैं, बस:
pip install winstrument
और फिर प्रोग्राम को चलाने के लिए, रन करें:
winstrument
ध्यान दें कि यह टूल वर्तमान में प्रयोगात्मक (experimental) है, और कभी-कभी फ्रीज़ हो सकता है या अन्य स्थिरता संबंधी समस्याएँ हो सकती हैं।
कुछ मामलों में, जैसे कि Windows 10 की नई स्थापना में, Frida स्थापित करते समय pip में SSL त्रुटि आ सकती है। ऐसा होने पर, नीचे समस्या निवारण देखें।
winstrument REPL चलाने के लिए, बस winstrument चलाएँ।
यहाँ registry मॉड्यूल के साथ notepad.exe को इंस्ट्रूमेंट करने का एक त्वरित उदाहरण है। उपलब्ध CLI कमांड की पूरी जानकारी के लिए, नीचे CLI अनुभाग देखें।
PS C:\winstrument> winstrument
> set target C:\Windows\System32\notepad.exe
> use registry
> run
Spawned 1144
instrumented process with pid: 1144 and path: C:\Windows\System32\notepad.exe
<User closes notepad from GUI>
detached from 1144 for reason process-terminated
> show registry
module time target function hkey subkey value
-------- ----------------- ------------------------------- ---------------- ------------------ --------------------------------------------------------------------------- ---------------------------------
registry 2019-08-19 07:03:07 C:\Windows\System32\notepad.exe RegGetValueW 0x2f4 SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize AppsUseLightTheme
<...>
उपरोक्त उदाहरण में, उपयोगकर्ता लक्ष्य प्रक्रिया (target process) को इंगित करता है, इस मामले में notepad.exe। फिर वे बताते हैं कि वे registry मॉड्यूल का उपयोग करना चाहते हैं, जो प्रोग्राम द्वारा किए गए रजिस्ट्री-संबंधित सिस्टम कॉल्स को सूचीबद्ध (enumerate) करता है। प्रक्रिया समाप्त होने के बाद (उपयोगकर्ता Notepad बंद कर देता है), संग्रहीत आउटपुट को show registry का उपयोग करके देखा जा सकता है।
मुख्य python फ़ाइल winstrument.py Frida डिवाइस को प्रारंभ (initialize) करती है और लक्ष्य प्रक्रिया का एक इंस्टेंस स्पॉन (spawn) करती है।
cmdline.py cmd2 का उपयोग करके एक कमांडलाइन इंटरफ़ेस प्रदान करता है। जब Winstrument को सीधे कमांड लाइन से चलाया जाता है तो यह मुख्य स्क्रिप्ट एंट्री पॉइंट है। कमांड नीचे प्रलेखित हैं।
फिर यह प्रत्येक सक्षम मॉड्यूल के माध्यम से जाता है, उसे इंस्टैंशिएट करता है, और प्रक्रिया को इंस्ट्रूमेंट करने के लिए उस मॉड्यूल की load_scripts() विधि को कॉल करता है। अंत में, जब लक्ष्य से डिटैच किया जाता है, तो यह प्रत्येक मॉड्यूल के लिए get_output() और on_finish() को कॉल करता है।
मॉड्यूल modules/ निर्देशिका में .py फ़ाइलों में निहित हैं। एक मॉड्यूल base_module.BaseInstrumentation का एक उपवर्ग (subclass) होता है जो इंजेक्ट किए जाने वाले कोड, उस इंजेक्टेड कोड के लिए संदेश हैंडलिंग, और आउटपुट को परिभाषित करता है। मॉड्यूल API को आगे नीचे "Modules" अनुभाग में परिभाषित किया गया है।
प्रत्येक मॉड्यूल अपना मेटाडेटा जैसे विवरण modules/metadata.toml में संग्रहीत करता है। अनुभाग का शीर्षक मॉड्यूल के नाम (केस-इनसेंसिटिव) के साथ होना चाहिए। उदाहरण के लिए, यहाँ dlls मॉड्यूल के अनुरूप अनुभाग है:
[DLLS]
description = """Hooks LoadLibrary-family system calls and outputs DLL loads where part of the search path might be
writable by the current user or a low-privileged user group."""
प्रोग्राम सेटिंग्स को %APPDATA%/winstrument में settings.toml में संग्रहीत करता है। चूंकि अधिकांश, यदि सभी नहीं, मॉड्यूल लक्ष्य प्रक्रिया में Javascript इंजेक्ट करेंगे, modules/js/ निर्देशिका में Frida Javascript स्निपेट होते हैं जो मॉड्यूल द्वारा लोड और इंजेक्ट किए जाते हैं। इन फ़ाइलों का नाम मॉड्यूल के समान होना चाहिए, अर्थात मॉड्यूल dlls.py js/dlls.js से JS का उपयोग करेगा।
जैसा कि ऊपर वर्णित है, प्रत्येक मॉड्यूल base_module.py से BaseInstrumentation का उपवर्ग होता है।
प्रत्येक मॉड्यूल को अपना नाम (बिना एक्सटेंशन के python और js फ़ाइलों का नाम) modulename नामक स्थैतिक क्लास विशेषता के रूप में परिभाषित करना चाहिए।
मॉड्यूल BaseInstrumentation से निम्नलिखित विधियों का उपयोग या अधिभाव (override) कर सकते हैं:
__init__(self,*args,**kwargs) - किसी भी मॉड्यूल-विशिष्ट init कोड के अतिरिक्त, इस कंस्ट्रक्टर को super().__init__(*args,**kwargs) कॉल करना चाहिए।load_script(self) - इस विधि को सामान्यतः अधिभावित करने की आवश्यकता नहीं होती, क्योंकि BaseInstrumentation में कार्यान्वयन अधिकांश उपयोग मामलों के लिए पर्याप्त होना चाहिए। Frida इवेंट्स पर हुक करने के लिए, इसके बजाय register_callbacks() को अधिभावित करें। load_script का उपयोग इंस्ट्रूमेंट करने के लिए javascript फ़ाइल लोड करने, Frida से session.create_script कॉल करने, कोई वांछित कॉलबैक जोड़ने, फिर स्क्रिप्ट ऑब्जेक्ट की load() विधि को कॉल करने के लिए किया जाना चाहिए।register_callbacks(self) - स्क्रिप्ट को लक्ष्य प्रक्रिया में लोड करने से पहले BaseInstrumentation.load_script द्वारा कॉल किया जाता है। इसका उपयोग _session.on('message') जैसे इवेंट्स को पंजीकृत करने के लिए किया जाता है। संस्करण डिफ़ॉल्ट रूप से on_message के लिए हुक जोड़ता है।Winstrument शेल निम्नलिखित कमांड प्रदान करता है:
list - सभी उपलब्ध और लोड किए गए मॉड्यूल प्रदर्शित करेंload <modulename>/use <modulename> - दिए गए नाम वाले मॉड्यूल को सक्षम करेंunload <modulename> - दिए गए नाम वाले मॉड्यूल को अक्षम करेंset [setting [value]] - बिना तर्कों के, सभी सेटिंग्स और उनके मान दिखाएँ। एक तर्क के साथ, setting का मान दिखाएँ। दो तर्कों के साथ, setting को value पर सेट करें। सेटिंग्स कई रनों में बनी रहती हैं।show [modulename [format]] - निर्दिष्ट format में modulename से संग्रहीत इनपुट प्रदर्शित करें। फ़ॉर्मेटर्स की सूची देखने के लिए बिना तर्कों के चलाएँ।info <modulename> - दिए गए नाम वाले मॉड्यूल का विवरण प्रिंट करता है।run - इंस्ट्रूमेंटेशन प्रारंभ करें।यह ज्यादातर Windows की नई स्थापना पर होता प्रतीत होता है। Frida की setup.py https://files.pythonhosted.org से एक .egg फ़ाइल खींचने का प्रयास करती है। कुछ मामलों में, यह विफल हो जाता है क्योंकि उस डोमेन के लिए SSL प्रमाणपत्र सत्यापित नहीं होता। यह Windows द्वारा root CA लोड करने के तरीके का एक दुष्प्रभाव प्रतीत होता है। Windows डिफ़ॉल्ट स्थापना में सभी root CA शामिल नहीं करता है, बल्कि वेबसाइटों पर जाने पर आवश्यकतानुसार उन्हें खींचना पसंद करता है। परिणामस्वरूप, files.pythonhosted.org के SSL प्रमाणपत्र पर हस्ताक्षर करने वाला root CA सिस्टम ट्रस्ट स्टोर में नहीं हो सकता है।
इस समस्या को हल करने के लिए, Windows को अपने ट्रस्ट स्टोर में root CA जोड़ने के लिए Edge या Chrome में https://files.pythonhosted.org को मैन्युअल रूप से खोलें, फिर pip install फिर से आज़माएँ।
ध्यान दें कि Firefox में पेज को खोलना काम नहीं करेगा, क्योंकि Firefox सिस्टम स्टोर के बजाय अपने स्वयं के ट्रस्ट स्टोर का उपयोग करता है।
Winstrument GPLv3 के तहत लाइसेंस प्राप्त है। अधिक विवरण के लिए LICENSE फ़ाइल देखें।
BaseInstrumentationwrite_message(message) एक JSON-जैसे संदेश को dict के रूप में लेता है, उसे sqlite डेटाबेस में लिखता है और बाद में आउटपुट के लिए सहेजता है।post_load(self) स्क्रिप्ट को लक्ष्य प्रक्रिया के अंदर लोड करने के बाद BaseInstrumentation.load_script द्वारा कॉल किया जाता है। इसका उपयोग, उदाहरण के लिए, स्क्रिप्ट द्वारा निर्यात की गई rpc विधियों को कॉल करने के लिए किया जा सकता है।get_output(self) - लक्ष्य डिटैच होने पर मुख्य स्क्रिप्ट द्वारा कॉल किया जाता है। इस विधि को एक सूची लौटानी चाहिए, जहाँ प्रत्येक प्रविष्टि एक MoudleMessage ऑब्जेक्ट है (data/module_message.py से)। सामान्यतः इसे अधिभावित करने की आवश्यकता नहीं होती।on_message(self,message,data) - frida message इवेंट को संभालने के लिए कॉलबैक, जो इंजेक्टेड JS में send द्वारा ट्रिगर होता हैon_finish(self) - लक्ष्य डिटैच होने पर मुख्य स्क्रिप्ट द्वारा कॉल किया जाने वाला कॉलबैक। यहाँ आवश्यक कोई भी सफाई (cleanup) कार्य करें।q/quit/exit - CLI से बाहर निकलें (स्पष्ट रूप से)।