Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

Self-Destructing Code ใน C: ลบ Executable ตัวเองหลังรัน


Self-Destructing Code คือโปรแกรมที่หลังจากทำงานเสร็จจะลบไฟล์ Executable ของตัวเองออกจากดิสก์ ทำให้ไม่เหลือร่องรอยของโปรแกรมหลังรัน

หลักการทำงาน

  1. รับชื่อไฟล์ Executable จาก argv[0] (Command Line Argument ตัวแรก)
  2. ใช้ฟังก์ชัน remove() จาก stdio.h ลบไฟล์
  3. โค้ดที่เหลือยังทำงานต่อได้ เพราะโค้ดถูกโหลดลง Primary Memory (RAM) ก่อนการ Execute

ตัวอย่างโค้ด

#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("After completing this, the file will be removed\n");
    
    // argv[0] ชื่อไฟล์ executable ที่กำลังรันอยู่
    if (remove(argv[0]) == 0) {
        printf("File removed successfully\n");
    } else {
        perror("Error removing file");
    }
    
    printf("Removed\n"); // บรรทัดนี้ยังทำงาน เพราะโค้ดอยู่ใน RAM
    return 0;
}

ผลลัพธ์

After completing this, the file will be removed
File removed successfully
Removed

ทำไมโค้ดหลัง remove() ยังทำงานได้?

เมื่อโปรแกรมถูก Execute ระบบปฏิบัติการจะโหลด Machine Code ทั้งหมด จากดิสก์ขึ้นสู่ RAM (Primary Memory) แล้ว CPU จะ Fetch/Execute จาก RAM ไม่ได้อ่านจากดิสก์ทีละบรรทัด ดังนั้นการลบไฟล์บนดิสก์ไม่ส่งผลต่อ Process ที่กำลังรันอยู่

กรณีการใช้งานจริง

  • Installer/Updater ที่ต้องการลบตัวตนหลังติดตั้งเสร็จ
  • Security Tools ที่ไม่ต้องการทิ้ง Binary ไว้บนระบบ
  • Ephemeral Scripts ที่รันครั้งเดียว

ข้อควรระวัง

  • ทำงานได้เฉพาะระบบที่รองรับการลบไฟล์ที่กำลังถูก Execute (Linux/Unix ปกติทำได้ Windows อาจล้มเหลว)
  • ต้องมี Permission เขียนใน Directory ที่ Executable อยู่
  • ไม่ควรใช้กับโปรแกรมที่ต้องรันซ้ำหรือเป็น Service