Self-Destructing Code คือโปรแกรมที่หลังจากทำงานเสร็จจะลบไฟล์ Executable ของตัวเองออกจากดิสก์ ทำให้ไม่เหลือร่องรอยของโปรแกรมหลังรัน
หลักการทำงาน
- รับชื่อไฟล์ Executable จาก
argv[0](Command Line Argument ตัวแรก) - ใช้ฟังก์ชัน
remove()จากstdio.hลบไฟล์ - โค้ดที่เหลือยังทำงานต่อได้ เพราะโค้ดถูกโหลดลง 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