Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C++

Viết mã tự hủy (Self-Destructing Code) trong C

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.out bị 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ư MoveFileEx với MOVEFILE_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ế.