
पुस्तक "Violent Python" का स्रोत कोड, TJ O'Connor द्वारा। कोड को पूरी तरह से Python 3 में बदल दिया गया है, PEP8 मानकों के अनुपालन के लिए पुनः स्वरूपित किया गया और पुराने पुस्तकालयों के कार्यान्वयन से संबंधित निर्भरता समस्याओं को समाप्त करने के लिए पुनर्रचित किया गया।
टीजे ओ'कॉनर द्वारा लिखित पुस्तक "वायलेंट पायथन" का सोर्स कोड। कोड को पूरी तरह से Python 3 में बदल दिया गया है, PEP8 मानकों के अनुरूप सुधारा गया है तथा डिप्रीकेटेड लाइब्रेरीज़ के कार्यान्वयन से जुड़ी निर्भरता संबंधी समस्याओं को दूर करने के लिए रीफैक्टर किया गया है।
इसी तरह का एक रूपांतरण मेरे द्वारा जस्टिन सीट्ज़ की पुस्तक "ब्लैक हैट पायथन" के सोर्स कोड पर भी उपलब्ध कराया गया है। यदि आपने अभी तक नहीं देखा है तो इसे यहाँ देखें।
बस प्रोजेक्ट के लिए एक नई निर्देशिका (DIR) बनाएँ, उसके लिए एक नया वर्चुअल एनवायरनमेंट या venv बनाएँ (अनुशंसित), git clone का उपयोग करके इस रिपॉजिटरी को क्लोन करें और pip install का उपयोग करके आवश्यकताएँ स्थापित करें।
user@host:~/DIR$ git clone https://github.com/EONRaider/violent-python3
user@host:~/DIR$ python3 -m venv venv
user@host:~/DIR$ source venv/bin/activate
(venv) user@host:~/DIR$ pip install -r requirements.txt
optparse लाइब्रेरी को पूरे सोर्स कोड में argparse से बदल दिया गया है। सभी आर्गुमेंट पार्सिंग अब प्रत्येक फ़ाइल के __main__ निष्पादन स्कोप के अंतर्गत समाहित है। स्क्रिप्ट के निष्पादन के लिए अनिवार्य सभी CLI आर्गुमेंट, जिन्हें मूल कोड में वैकल्पिक माना जाता था, अब पोज़ीशनल के रूप में कार्यान्वित किए गए हैं। argparse का उपयोग करने वाली सभी स्क्रिप्ट्स के लिए CLI को -h आर्गुमेंट प्रदान करके एक usage प्रॉम्प्ट उपलब्ध है। सीमा और नियंत्रक ऑब्जेक्ट दोनों की जिम्मेदारियों को CLI पार्सर पर छोड़ना निश्चित रूप से सॉफ्टवेयर आर्किटेक्चर के संदर्भ में सबसे अच्छा विकल्प नहीं है, लेकिन मूल कोडर के इरादे के अनुरूप होने की आवश्यकता के कारण इसे यथावत रखा गया है।PEP 8: E722 डू नॉट यूज़ बेयर एक्सेप्ट उल्लंघनों की सभी घटनाओं को अधिक विशिष्ट अपवाद खंडों के साथ रीफैक्टर किया गया है।close() विधि को कॉल करने के। इस कारण से फ़ाइल और डेटाबेस हेरफेर के सभी उदाहरणों को संदर्भ प्रबंधकों का उपयोग करके रीफैक्टर किया गया है।# -*- coding: utf-8 -*-) को Python 3 (Python 2 से ASCII को बदलना) के लिए डिफ़ॉल्ट एन्कोडिंग के रूप में UTF-8 के मानकीकरण के कारण समाप्त कर दिया गया है।नीचे सूचीबद्ध नहीं की गई फ़ाइलों को "नोट्स" अनुभाग में स्थापित किए गए अनुसार एक या दूसरे तरीके से रीफैक्टर किया गया माना जा सकता है।
chapter01/vuln_scanner.py को इस प्रकार संरचित किया गया था कि एक गैर-मौजूद फ़ाइल रनटाइम पर OSError अपवाद का कारण बनेगी। इस कारण से, check_vulns() को कॉल करने वाले पुनरावृत्ति नियंत्रण को मुख्य फ़ंक्शन में परिभाषित सशर्त कथन में स्थानांतरित कर दिया गया।chapter02/nmap_scan.py ने केवल अप्रचलित optparse लाइब्रेरी को कॉल करने के उद्देश्य से एक मुख्य फ़ंक्शन लागू किया, जिसे argparse से बदल दिया गया है। इसके कारण मुख्य फ़ंक्शन को हटा दिया गया। मूल कोड में optparse कॉल का हिस्सा थी एक पुनरावृत्ति नियंत्रण संरचना इस प्रकार कार्यान्वित की गई थी कि स्कैन किए गए प्रत्येक पोर्ट के लिए nmap के लिए एक नया कॉल निष्पादित किया जाता था। चक्रों को बर्बाद होने से रोकने के लिए पुनरावृत्ति को nmap_scan फ़ंक्शन में स्थानांतरित कर दिया गया।chapter02/ssh_command.py का आरंभीकरण कोड __main__ निष्पादन स्कोप में स्थानांतरित कर दिया गया। बाहरी स्कोप में उपयोग किए जाने वाले चरों के नाम जो पहले फ़ंक्शन के पैरामीटर के नामों से टकराते थे, बदल दिए गए हैं। लौटाई गई प्रॉम्प्ट जानकारी मूल रूप से एन्कोडेड थी और अब बेहतर पठनीयता प्रदान करने के लिए इसे डीकोड किया गया है।chapter02/ssh_brute.py ने को एक स्टैंडअलोन लाइब्रेरी के रूप में आयात किया, लेकिन वास्तव में यह लाइब्रेरी के अंतर्गत एक लाइब्रेरी है। बग के कारण हुआ और इसे ठीक कर दिया गया है। पुस्तक में प्रस्तुत कोड स्वयं इंडेंटेशन त्रुटियों से भरा हुआ था जिसने इसे अनुपयोगी बना दिया और इसे काम करने की स्थिति में लाया गया है।अन्य भाषाओं में योगदान यहाँ देखे जा सकते हैं:
सामान्य ज्ञान के अनुसार, पहले एक मुद्दे के माध्यम से इस रिपॉजिटरी में आप जो परिवर्तन करना चाहते हैं, उस पर चर्चा करने का प्रयास करें।
pxsshpexpectModuleNotFoundErrorchapter02/ssh_brutekey.py को काम करने के लिए कई पूर्व-निर्मित कुंजियों की आवश्यकता थी; इसके अलावा पुस्तक पाठक को एक URL पर ऐसी कुंजियाँ प्राप्त करने का निर्देश देती है जो वर्तमान में 403 प्रतिक्रिया लौटाता है। इस कारण से, कुंजियों वाला एक संपीड़ित संग्रह chapter02 उपनिर्देशिका में जोड़ा गया है।chapter02/ssh_botnet.py में optparse के लिए एक अप्रयुक्त आयात कथन था जिसे हटा दिया गया। ऐसा लगता है कि यह इस स्क्रिप्ट के लिए CLI को लागू करने के एक छोड़े गए प्रयास का एक टुकड़ा था। हैरानी की बात है कि इसे वैसे ही लटका दिया गया था, यहाँ तक कि पुस्तक के मुद्रित संस्करण में भी। बॉटनेट को आरंभ करने और उसके आदेश जारी करने वाले कोड को मानकीकरण के लिए __main__ निष्पादन स्कोप के तहत व्यवस्थित किया गया। बॉट्स को जारी किए गए दो आदेशों को रिटर्न स्टेटमेंट की अनावश्यक संख्या से बचने के लिए एकीकृत किया गया है।chapter02/conficker.py ने sys लाइब्रेरी के अनुपयोगी कॉल को हटा दिया।chapter03/discover_networks.py को केवल रीफैक्टर करने के बजाय पुनः कार्यान्वित करना पड़ा। यह मूल रूप से न केवल अप्रचलित mechanize लाइब्रेरी का उपयोग करता था बल्कि WiGLE सेवा के साथ इस तरह से इंटरैक्ट करता था जो अब आवश्यक नहीं है, क्योंकि WiGLE अब एक API प्रदान करता है। इस कारण से कोड को मानकीकृत किया गया है और requests लाइब्रेरी का उपयोग करके WiGLE को एक प्रमाणित HTTP GET अनुरोध भेजने के लिए एक नया wigle_print फ़ंक्शन लागू किया गया। प्रतिक्रिया एक JSON ऑब्जेक्ट लौटाती है जिसे सीधे एक्सेस किया जा सकता है, जिससे re लाइब्रेरी का उपयोग भी अनावश्यक हो जाता है। API द्वारा भेजे गए त्रुटि प्रतिक्रिया संदेशों से निपटने में सक्षम बनाने के लिए अपवाद हैंडलिंग जोड़ी गई। ध्यान दें कि यह स्क्रिप्ट winreg पर निर्भर करती है, जो केवल माइक्रोसॉफ्ट विंडोज OS के तहत Python इंस्टॉलेशन पर चलती है, और निष्पादन के दौरान रजिस्ट्री कुंजियों तक पहुँच के लिए प्रशासक विशेषाधिकारों की आवश्यकता होती है। API तक पहुँच के लिए https://wigle.net/account पर एक खाता पंजीकृत होना चाहिए।chapter03/pdf_read.py अब अप्रचलित PyPDF के बजाय PyPDF4 लाइब्रेरी का उपयोग करता है। पुस्तक पाठ में एक विशिष्ट PDF फ़ाइल का संदर्भ देती है और इसे chapter03 उपनिर्देशिका में जोड़ा गया है।chapter03/exif_fetch.py को BeautifulSoup ऑब्जेक्ट कंस्ट्रक्टर पर कॉल में features="html.parser" तर्क की आवश्यकता थी। इसे पंक्ति 15 पर जोड़ा गया। यह स्क्रिप्ट केवल उन वेब अनुप्रयोगों पर काम करती है जो छवियों को img HTML टैग के बीच लपेटते हैं (आधुनिक वेब अनुप्रयोगों पर एक दुर्लभ अभ्यास जो JavaScript पर बहुत अधिक निर्भर करते हैं)।chapter03/skype_parse.py उदाहरण के रूप में main.db फ़ाइल का उपयोग करता है। इसे सुविधा के लिए chapter03/skype_profile उपनिर्देशिका में जोड़ा गया है।chapter03/firefox_parse.py उदाहरण के रूप में कई .sqlite फ़ाइलों का उपयोग करता है। इन्हें सुविधा के लिए chapter03/firefox_profile उपनिर्देशिका में जोड़ा गया है।chapter03/iphone_messages.py iPhone बैकअप फ़ाइलों को संदर्भित करता है जो लेखक द्वारा उपलब्ध नहीं कराई गई थीं। इस कारण से कोड को रीफैक्टर किया गया है लेकिन अपरीक्षित रहता है।chapter04/geo_ip.py ने अप्रचलित pygeoip लाइब्रेरी का उपयोग किया। जैसा कि इसके निर्माता द्वारा सुझाव दिया गया है, अब geoip2 का उपयोग किया जाना चाहिए। नव कार्यान्वित कोड को पुस्तक पर मूल कार्यान्वयन के जितना संभव हो सके समान रखने का प्रयास किया गया, लेकिन geoip2 और इसकी विशेषताओं की नई पैकेज संरचना को समायोजित करने के लिए कुछ बदलाव करने पड़े। स्क्रिप्ट चलाने के लिए आवश्यक डेटाबेस फ़ाइल MaxMind से डाउनलोड की गई और chapter04 निर्देशिका में उपलब्ध कराई गई। argparse का उपयोग करके एक CLI भी लागू किया गया।chapter04/print_direction.py ने मूल कार्यान्वयन में फ़ाइल खोलते समय UnicodeDecodeError अपवाद उठाया। फ़ाइल को संभालने वाले संदर्भ प्रबंधक में rb तर्क जोड़कर इसे ठीक किया गया है।chapter04/find_ddos.py ने Hivemind हमले के स्रोत पते को उसके गंतव्य के रूप में मुद्रित किया, जिससे आउटपुट बेकार हो गया। सही dst चर अब stdout पर प्रदर्शित होता है। पुस्तक traffic.pcap नामक एक फ़ाइल का संदर्भ देती है जो लेखक द्वारा उपलब्ध नहीं कराई गई थी, इसलिए कोड को रीफैक्टर किया गया है लेकिन अपरीक्षित रहता है।chapter04/test_domain_flux.py लेखक द्वारा प्रदान की गई pcap फ़ाइल का विश्लेषण करते समय लौटाता है कि शून्य अनुत्तरित अनुरोध किए गए थे। किसी कारण से पैकेटों में स्वयं DNS रिसोर्स रिकॉर्ड फ़ील्ड मान सेट नहीं होता है, इसलिए dns_QR_test फ़ंक्शन में स्थिति हमेशा गलत के रूप में मूल्यांकन करती है। ऐसा होने पर, सशर्त कथन से DNSRR फ़ील्ड का मूल्यांकन करने वाली स्थिति को हटा दिया गया है और अब सभी UDP पैकेट जिनका पोर्ट 53 उनके स्रोत के रूप में है, का विश्लेषण किया जाता है। इसके परिणामस्वरूप कम कुशल कोड होता है लेकिन कम से कम यह पुस्तक में इच्छित परिणामों को आउटपुट करता है।chapter05/blue_bug.py PyBluez लाइब्रेरी का उपयोग करता है, जो बदले में अपने इंस्टॉलेशन निर्देशों में बताए अनुसार BlueZ लाइब्रेरी और हेडर फ़ाइलों का अनुरोध करता है। PyBluez को एक आवश्यकता के रूप में स्थापित करने से पहले इन निर्भरताओं को स्थापित किया जाना चाहिए। Linux में यह apt install bluetooth libbluetooth-dev कमांड जारी करके किया जा सकता है। मूल कोड एक गैर-मौजूद client_sock ऑब्जेक्ट को संदर्भित करता है जिसे phone_sock से बदल दिया गया है।chapter05/ftp_sniff.py में एक तर्क दोष था जिसने एक सूँघा हुआ उपयोगकर्ता नाम प्रस्तुत किया लेकिन if... else कथन के खराब कार्यान्वयन के कारण कोई पासवर्ड नहीं दिया। इसे सशर्त कथन को एक नेस्टेड if खंड से बदलकर ठीक किया गया है।chapter05/ninja_print.py को काम करने के लिए obexftp लाइब्रेरी की आवश्यकता है। यह लाइब्रेरी Python 2 के लिए लिखी गई थी और इसे वर्तमान तिथि तक पोर्ट या किसी समतुल्य से प्रतिस्थापित नहीं किया गया है, इसलिए कोड लेखक द्वारा लिखे गए Python 2 संस्करण के अनुसार ही रहता है।chapter05/__init__.py और chapter06/__init__.py को क्रमशः chapter05/dup.py और chapter06/anon_browser.py से मॉड्यूल आयात करने में सक्षम बनाने के लिए जोड़ा गया।chapter06/anon_proxy.py को MechanicalSoup Python 3 लाइब्रेरी के साथ पुनः कार्यान्वित किया गया। इसमें proxy_test.py, useragent_test.py और print_cookies.py के लिए आवश्यक संशोधनों को एकीकृत किया गया है।chapter06/anon_browser.py को भी MechanicalSoup के साथ पुनः कार्यान्वित किया गया और कोड में कुछ संशोधन किए गए। AnonBrowser वर्ग के लिए कंस्ट्रक्टर विधि में cookielib लाइब्रेरी को http.cookiejar से बदल दिया गया और पैरामीटर user_agents अब एक टपल के बजाय स्ट्रिंग्स की एक सूची स्वीकार करता है।chapter06/link_parser.py को re और bs4 के कार्यान्वयन को संभालने के नए तरीकों का उपयोग करके रीफैक्टर किया गया।