
Исходный код книги "Violent Python" от TJ O'Connor. Код полностью переведён на Python 3, отформатирован в соответствии со стандартами PEP8 и реорганизован для устранения проблем с зависимостями, связанными с использованием устаревших библиотек.
Исходный код книги «Violent Python» Ти Джей О'Коннора. Код полностью преобразован в Python 3, переформатирован в соответствии со стандартами PEP8 и реорганизован для устранения проблем с зависимостями, связанных с использованием устаревших библиотек.
Аналогичное преобразование было выполнено мною для исходного кода книги «Black Hat Python» Джастина Зейтца. Ознакомьтесь с ним здесь, если вы ещё этого не сделали.
Просто создайте новый каталог (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__ для каждого файла. Все аргументы командной строки, которые были
обязательны для выполнения скриптов, но в исходном коде рассматривались как необязательные,
теперь реализованы как позиционные. Для всех скриптов, использующих argparse, теперь доступна подсказка usage при передаче аргумента -h в
CLI. Передача обязанностей как boundary, так и controller
объекта парсеру CLI, безусловно, не является лучшим выбором с точки
зрения архитектуры программного обеспечения, но оставлено как есть из-за
необходимости соответствия замыслу исходного автора.PEP 8: E722 do not use bare except были
переработаны с использованием более конкретных предложений исключений.close() для открытых объектов файлов/баз данных. По
этой
причине все случаи манипуляций с файлами и базами данных были переработаны с
использованием менеджеров контекста.# -*- coding: utf-8 -*-), было исключено из-за
стандартизации UTF-8 в качестве кодировки по умолчанию для Python 3 (заменяет
ASCII из Python 2).Файлы, не указанные ниже, можно считать переработанными в той или иной степени, как установлено в разделе «Примечания».
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 импортировал как отдельную библиотеку, но на
самом деле это библиотека внутри библиотеки . Ошибка приводила к
и была исправлена. Сам код, представленный в
книге, был переполнен ошибками отступов, что делало его непригодным для использования, и
приведён в рабочее состояние.Вклад на других языках можно посмотреть здесь:
Руководствуясь здравым смыслом, сначала попробуйте обсудить изменение, которое вы хотите внести в этот репозиторий, через issue.
pxsshpexpectModuleNotFoundErrorchapter02/ssh_brutekey.py требовал ряда предварительно сгенерированных ключей для работы;
более того, книга указывает читателю получить такие ключи по URL,
который в настоящее время возвращает ответ 403. Из-за этого сжатый архив,
содержащий ключи, был добавлен в подкаталог chapter02.chapter02/ssh_botnet.py содержал неиспользуемый оператор импорта optparse,
который был удалён. Похоже, это был фрагмент прерванной попытки
реализации CLI для этого скрипта. Удивительно, но он был просто оставлен,
даже в печатной версии книги. Код,
который инициализирует ботнет и выдаёт его команды, был организован в области выполнения
__main__ для стандартизации. Две команды, отправляемые ботам,
были объединены, чтобы избежать ненужного количества операторов return.chapter02/conficker.py удалён неиспользуемый вызов библиотеки sys.chapter03/discover_networks.py пришлось перереализовать, а не просто
переработать. Изначально он не только использовал устаревшую библиотеку mechanize, но
и взаимодействовал с сервисом WiGLE способом, который больше не требуется,
поскольку WiGLE теперь предоставляет API. По этой причине код был стандартизирован,
а новая функция wigle_print была реализована с использованием библиотеки requests для отправки аутентифицированного HTTP GET-запроса к WiGLE. Ответ
возвращает объект JSON, к которому можно обращаться напрямую, что также делает
использование библиотеки re ненужным. Обработка исключений была
добавлена, чтобы скрипт мог обрабатывать ответы об ошибках,
отправляемые API. Обратите внимание,
что этот скрипт зависит от winreg, который работает только в установках Python
под ОС Microsoft Windows, и требует привилегий администратора
во время выполнения для доступа к ключам реестра. Необходимо зарегистрировать
учётную запись на https://wigle.net/account для доступа к API.chapter03/pdf_read.py теперь использует библиотеку PyPDF4 вместо устаревшей
PyPDF. В книге упоминается конкретный PDF-файл, и
он был добавлен в подкаталог chapter03.chapter03/exif_fetch.py требовал аргумента features="html.parser" при
вызове конструктора объекта BeautifulSoup. Он был добавлен в строке 15
. Этот скрипт работает только с веб-приложениями, которые оборачивают изображения между HTML-тегами img
(редкая практика в современных веб-приложениях, сильно зависящих от
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. Также был реализован CLI
с использованием argparse.chapter04/print_direction.py вызывал исключение UnicodeDecodeError при
открытии файла в исходной реализации. Это было исправлено добавлением
аргумента rb в менеджер контекста, обрабатывающий файл.chapter04/find_ddos.py выводил исходный адрес атаки Hivemind
как её назначение, делая вывод бесполезным. Теперь правильная переменная dst
отображается в stdout. В книге упоминается файл
traffic.pcap, который не был предоставлен автором, поэтому код
был переработан, но остаётся непроверенным.chapter04/test_domain_flux.py возвращает, что при анализе файла pcap,
предоставленного автором, не было сделано ни одного неотвеченного запроса. По
какой-то причине сами пакеты не имеют установленного значения поля DNS Resource Record,
поэтому условие в функции 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
и прошёл некоторые модификации кода. Библиотека cookielib
была заменена на http.cookiejar в методе-конструкторе для
класса AnonBrowser, а параметр user_agents теперь принимает список
строк вместо кортежа.chapter06/link_parser.py был переработан с использованием новых способов обработки
реализаций re и bs4.