Категория > Новости > Разведка змеем. Собираем информацию о системе с помощью Python - «Новости»

Разведка змеем. Собираем информацию о системе с помощью Python - «Новости»


3-02-2021, 00:00. Автор: Емельян
PyCharm. Уста­нов­ка и нас­трой­ка прос­ты как два руб­ля: ска­чал уста­нов­щик, запус­тил — и кли­кай себе «Далее», пока есть такая кноп­ка.

Еще нам пот­ребу­ется Python. Я буду исполь­зовать вер­сию 3.9.0 — с ней точ­но все работа­ет.


 

Задачи


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



  1. IP-адрес.

  2. MAC-адрес.

  3. Имя поль­зовате­ля.

  4. Тип опе­раци­онной сис­темы.

  5. Ско­рость работы сис­темы.

  6. Вре­мя.

  7. Скрин­шот.

  8. Ско­рость интернет‑соеди­нения.

  9. Мо­дель про­цес­сора.


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



Зачем?


На­вер­няка у тебя воз­ник воп­рос: зачем может понадо­бить­ся MAC-адрес или модель про­цес­сора? Эти парамет­ры меня­ются очень и очень ред­ко, так что прек­расно под­ходят для фин­гер­прин­тинга. Даже если поль­зователь купит более быс­трый интернет‑канал или поменя­ет часовой пояс, ты без осо­бого тру­да смо­жешь опре­делить, что уже имел дело с этим компь­юте­ром. Сто­ит пом­нить, что ров­но такие же методы исполь­зуют хит­рые рек­ламщи­ки для иден­тифика­ции поль­зовате­лей, да и раз­работ­чики три­аль­ных вер­сий прог­рамм тоже. Эта статья поможет чуть луч­ше понять, что мож­но узнать о тво­ем компь­юте­ре в пол­ностью авто­мати­чес­ком режиме, а как при­менить эту информа­цию — решать толь­ко тебе.


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



 

Создаем основу программы


Для отправ­ки дан­ных я решил вос­поль­зовать­ся Telegram-ботом. Соз­дать его ты можешь через BotFather, а пос­ле сох­ранить token тво­его тво­рения. Пуб­ликовать его нель­зя — любой, кто получит этот токен, смо­жет зах­ватить кон­троль над тво­им ботом.


Для под­клю­чения к 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, а этот кусочек кода поз­волит лег­ко выявить такие проб­лемы.



Перейти обратно к новости