Пишем свой ботнет в Termux на python. 1 часть. Что такое сокеты и их применение на яп python. Практика + Теория. Убиваем школохацкеров.
UpgradeSelfИтак начнем с теории.
Представим себе большой зал с множеством окошек, за которыми стоят девушки. Есть и пустые окна, за которыми никого нет. Те самые окна — это закрытые порты. Там, где окно открыто и за ним стоит девушка — это открытый порт, за которым стоит какое-то приложение, которое его прослушивает. То есть, если, вы подойдете к окошку с номером 9090, то вас поприветствуют и спросят, чем могут помочь. Так же и с сокетами. Создается приложение, которое прослушивает свой порт. Когда клиент устанавливает соединение с сервером на этом порту именно данное приложение будет ответственно за работу этим клиентом. Вы же не подойдете к одному окошку, а кричать вам будут из соседнего :)
После успешной установки соединения сервер и клиент начинают обмениваться информацией. Например, сервер посылает приветствие и предложение ввести какую-либо команду. Клиент в свою очередь вводит команду, сервер ее анализирует, выполняет необходимые операции и отдает клиенту результат.
Сервер
Сейчас создайте два файла — один для сервера, а другой для клиента.
Давайте рассмотрим это в python
Импортируем библиотеку socket
import socket
Теперь создадим сам сокет
sock = socket.socket()
Теперь выберем хост и порт. Чтобы не морать себе и вам мозги я возьму локальник (localhost). Однако мы оставим строку пустой, чтобы наш сервер был доступен для всех интерфейсов. А порт выберем любой от нуля до 65535. Однако на Android (песочнице linux) использование портов 0 — 1023 требует особых прав (root). Я выбрал порт 2222. Теперь свяжем наш сокет с данными хостом и портом с помощью метода bind, которому передается кортеж, первый элемент (или нулевой, если считать от нуля) которого — хост, а второй — порт:
sock.bind(('', 9090))
Отлично, теперь осталось принять соединения.
Обязательно указываем кол-во макс подключений(я указал 10000)
sock.listen(10000)
Теперь код для принятия подключений.
conn, addr = sock.accept()
Конн это параметры конекшена к серваку, а адрес это айпи и порт клиента.
Все! Теперь давайте примем данные, которые в будущем отошлет нам клиент.
Чтобы получить данные нужно воспользоваться методом recv, который в качестве аргумента принимает количество байт для чтения. Мы будем читать порциями по 1024 байт (или ~ 1 кб)
while True:
data = conn.recv(1024).decode()
if not data:
break
conn.send(data.upper())
(по умолчанию кодировка стоит на UTF-8)
Последнее исключение мы сделали для того, чтобы если клиент отослал нам больше байтов чем надо, мы послали его куда подальше, чтобы не напрягать сервер.
Ну и закроем соединение
conn.close()
Сервер готов, покажу что добавил я.
import socket
from colorama import Fore, Back, Style
sock = socket.socket()
sock.bind(('', 2222))
sock.listen(10000)
while True:
conn, addr = sock.accept()
print(Fore.GREEN + ' [!] Connection:' + Fore.BLUE , addr)
f = open("bot_list.txt", 'r')
text = f.read()
f.close()
comaddr = str(addr)
con = comaddr.split()
if con[1] == "('127.0.0.1',":
print(Fore.CYAN + " [•] " + Fore.YELLOW + "Admin")
try:
data = conn.recv(1024).decode()
print(data)
except:
pass
if not data:
conn.send(data.upper())
conn.close()
if con[0] in text:
print(Fore.CYAN + " [+] " + Fore.MAGENTA + "Old bot")
print("")
else:
f = open("bot_list.txt", 'w')
f.write(con[0] + '\n')
f.close()
print(Fore.CYAN + " [+] " + Fore.BLUE + "New bot!!!")
print("")
data = conn.recv(10240)
print(data)
if not data:
conn.send(data.upper())
conn.close()
Теперь рассмотрим клиента.
import socket
sock = socket.socket()
sock.connect(('localhost', 2222))
data = sock.send('привет, я твой клиент'.encode())
sock.close
print(data)
Вот и все, мы сделали сервер на половину, и клиента на 1/3
Ждите 2 части.