Mã tự hủy là chương trình tự xóa file thực thi (executable) của chính nó sau khi chạy xong. Kỹ thuật này đôi khi dùng trong phần mềm dùng một lần (one-time run) hoặc bảo mật cơ bản.
Nguyên lý
- Khi chương trình chạy, bộ nạp (loader) sao chép toàn bộ mã máy từ đĩa vào bộ nhớ RAM.
- CPU thực thi mã từ RAM, không đọc file đĩa nữa.
- Do đó, chương trình có thể an toàn xóa file thực thi trên đĩa trong khi đang chạy — các lệnh tiếp theo vẫn thực hiện bình thường từ RAM.
Cách thực hiện
Sử dụng đối số dòng lệnh argv[0] (chứa tên file thực thi) và hàm remove() từ <stdio.h>.
Ví dụ
#include <stdio.h>
#include <stdlib.h> // Cho remove()
int main(int argc, char *argv[]) {
printf("Chuong trinh dang chay... Sau khi xong se tu xoa file thuc thi.\n");
// argv[0] là đường dẫn file thực thi (ví dụ: ./a.out hoặc /path/to/program)
if (remove(argv[0]) == 0) {
printf("Da xoa file thuc thi: %s\n", argv[0]);
} else {
perror("Khong the xoa file");
}
printf("Dong nay van in ra duoc vi ma da load vao RAM.\n");
return 0;
}
Kết quả
Chuong trinh dang chay... Sau khi xong se tu xoa file thuc thi. Da xoa file thuc thi: ./a.out Dong nay van in ra duoc vi ma da load vao RAM.
Kiểm tra
ls -l a.out
# ls: cannot access 'a.out': No such file or directory
⚠️ Cảnh báo & Hạn chế
- Chỉ xóa file thực thi, không xóa mã nguồn (.c) hay file object (.o).
- Không hoạt động nếu chương trình được chạy từ bộ nhớ (ví dụ:
./a.outbị xóa nhưng vẫn có thể chạy lại nếu còn trong cache bộ nhớ? Không — file đã mất). - Cần quyền ghi vào thư mục chứa file thực thi.
- Không phải biện pháp bảo mật mạnh — người dùng có thể copy file trước khi chạy.
- Trên Windows, file đang chạy bị khóa, không thể xóa (cần kỹ thuật khác như
MoveFileExvớiMOVEFILE_DELAY_UNTIL_REBOOT).
Đây là kỹ thuật thú vị để hiểu về cách hệ điều hành nạp và thực thi chương trình, nhưng ít dùng trong sản phẩm thực tế.