Пишем MAC CHANGER на PYTHON
moderator E7
Всем привет ! В данной статье мы вспомним что такое мак адресс , для чего он нужен и как нам его поменять. Для иземенения своего мак адреса мы напишем свой mac changer .
Что такое MAC ?Все выше выполненые действия в терминале, я перенес в программу на
МАС адрес (media access control address) – уникальный идентификатор, назначенный сетевому адаптеру, применяется в сетях стандартов IEEE 802, в основном Ethernet, Wi-Fi и Bluetooth.
Официально он называется «идентификатором типа EUI-48». Из названия очевидно, что адрес имеет длину в 48 бит, т.е. 6 байт. Общепринятого стандарта на написание адреса нет (в противоположность IPv4 адресу, где октеты всегда разделяют точками).Обычно он записывается как шесть шестнадцатеричных чисел, разделенных двоеточием: 00:AB:CD:EF:11:22 , хотя некоторые производители оборудования предпочитают запись вида 00-AB-CD-EF-11-22 и даже 00ab.cdef.1122.
Структура адреса
Адрес состоит из части идентификатора производителя, OUI, и идентификатора, присваиваемого производителем. Назначением идентификаторов OUI (Organizationally Unique Identifier) занимается организация IEEE. На самом деле его длина может быть не только 3 байта (24 бита), а 28 или 36 бит, из которых формируются блоки (MAC Address Block, МА) адресов типов Large (MA-L), Medium (MA-M) и Small (MA-S) соответственно. Размер выдаваемого блока, в таком случае, составит 24, 20, 12 бит или 16 млн, 1 млн, 4 тыс. штук адресов. В настоящий момент распределено порядка 38 тысяч блоков, их можно посмотреть многочисленными онлайн-инструментами, например у IEEE или Wireshark.
MAC CHANGER
Думаю , самое время приступить к написанию программы, но для начала поработаем в консоли.
Первое что мы сделаем , это посмотрим MAC адрес нашего сетевого адаптера и не только:
ifconfig

Мы можем заметить строку ether , вот она и указывает на наш адрес устройства
Второе , переходим к ручной смене MAC адреса. И начнем с того , что "положим" сетевой интерфейс eth0 (которые является основным среди всех интерфейсов выходящих в интернет).
P.S. И всё же , не всегда он может иметь такое имя (eth0) , он может у вас называться и (enp1s0f0) , но факт того, что это тот самый, основной интерфейс, который нам нужен , остаеться неизменным.
ifconfig eth0 down

А теперь пройдёмся поэтапно , что же мы сделали ? Во первых , мы положили сетевой интерфейс вот этой командой:
ifconfig eth0 down
Вторым действие мы меняем MAC адрес данного интерфейса.
ifconfig eth0 hw 00:11:22:33:44:55
Отлично , теперь мы поднимаем на интерфейс и вот , у нас уже другой MAC адресс !
MAC CHANGER на PYTHON
Переходим к самой программе. Для её написание нам потребуеться модуль subprocess.
Модуль subprocess отвечает за выполнение следующих действий: порождение новых процессов, соединение c потоками стандартного ввода, стандартного вывода, стандартного вывода сообщений об ошибках и получение кодов возврата от этих процессов.
В нашем случае , мы будем использовать этот модуль для выполнения системных команд с помощью языка Python

Основную функцию которую мы будем использовать это
subprocess.call("COMAND", shell=true)
и её вариация:
subprocess.call(["COMAND", "OPTION"])
Стоит сказать , что первый вариант дан для ознакомления , а использовать в дальнейшей разработки мы будем использовать второй вариант.
Сейчас объяcню по подробнее , почему мы так поступим на примере.

Допустим мы выложили данный код на открытый репозиторий гита , и какой нибудь пользователь его склонировал себе на рабочую машину. Решил он проверить код на ошибки с валидацией. Он берёт , и вписывает в поле ввода интерфейса (или MAC адреса) следующее:
Interface> eth0; shutdown MacAddr> 00:11:22:33:44:55
Бац , и у нас выключается тачка). Всё потому что функцию call мы прописаль как в первом варианте , то есть так:
subprocess.call("COMAND")
В этом случае в аргумент передается строка с командой и её опциями , причём , где опции, а где сама команда это строка не определяет , поэтому она выполняет всё что в неё передали.
Вторая вариация call лучше первой , тем что первым аргументом , в передаваемом списке, является команда , а остальные элементы списка , это её опции и параметры.
subprocess.call(["ls", "-l"])
- "ls" , это команда
- "-l" это её опция

Встроенный модуль optparse отвечает за парсинг параметров такого типа:
python3 main.py -i eth0 -m 00:11:22:33:44:55
Для того чтобы изпользовать этот модуль надо его импортировать(3 строка) , создать экземпляр класса(5 строка), добавляем флаги (6,9 строка), сам процесс парсинга данных из флагов(11; 16,17 строка).
Пожалуй на этом всё мы написали свой MAC CHANGER, однако эта программа не совершенна , поэтому вы можете изменять её на своё усмотрение ;)
С любовью от E7