//Reposter: ฉันเคยเห็นบทความแบบนี้ที่แปลโดย Mr. Lu Lin มาก่อน มันเป็นเวอร์ชัน C ฉันเขียนมันใหม่ใน Delphi ไม่สำเร็จ วันนี้ฉันไปที่ Tsinghua BBS และเห็นเวอร์ชัน Delphi นี้ ฉันโพสต์ไว้ที่นี่
ผู้ส่ง: Litoad (Rick) พื้นที่: Delphi
หัวข้อ: ในที่สุดโปรแกรม Self-Delete เวอร์ชัน Delphi ก็เสร็จสิ้นแล้ว (พิมพ์ซ้ำ)
สถานีส่ง: สถานี BBS Shuimu Tsinghua (จันทร์ที่ 4 มิ.ย. 20:51:55 2544)
[ข้อความต่อไปนี้คัดลอกมาจากพื้นที่อภิปรายการการเขียนโปรแกรม]
ผู้ส่ง: Litoad (Rick) ส่วน: การเขียนโปรแกรม
หัวข้อ: ในที่สุดโปรแกรม Self-Delete เวอร์ชัน Delphi ก็เสร็จสิ้นแล้ว
สถานีส่ง: สถานี BBS Shuimu Tsinghua (จันทร์ที่ 4 มิ.ย. 20:50:42 2544)
ฉันไปที่ฟอรั่มของบอร์แลนด์แล้วถาม และมันก็เหมือนกับที่ลาวดวนพูดจริงๆ
GetProcที่อยู่ด้วยตัวคุณเอง รหัสมีดังนี้:
โปรแกรมโปรเจ็กต์1;
การใช้งาน
หน้าต่าง;
ขั้นตอน DeleteSelf;
var
hโมดูล: THandle;
บัฟ: อาร์เรย์ [0..255] ของ Char;
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: ตัวชี้;
เริ่ม
hModule := GetModuleHandle(ไม่มี);
GetModuleFileName(hModule, บัฟ, ขนาดของ (บัฟ));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
asm
LEA EAX หนังบัฟ
กด 0
กด 0
ผลักดัน EAX
กด pExitProcess
กด hModule
กด pDeleteFileA
กด pUnmapViewOfFile
รีต
จบ;
จบ;
เริ่ม
ลบตนเอง;
จบ.
ตอนนี้มีสิ่งหนึ่งที่แปลก นั่นก็คือ ต้องวางโค้ดไว้ใน Procedure
การวางไว้ตรงกลางของ start...end จะไม่ทำงาน อาจใช้ตัวแปรโกลบอลไม่ได้
แต่เหตุใดจึงใช้ไม่ได้ก็ยังไม่ชัดเจน
นอกจากนี้ แทนที่จะเป็น GetProcAddress ให้เขียนโดยตรงดังนี้:
กด OFFSET UnmapViewOfFile
ผลลัพธ์ของการติดตามคือการดำเนินการเข้าสู่ KERNEL32.UnmapViewOfFile แต่หลังจากนั้นเท่านั้น
เกิดข้อผิดพลาดเมื่อ RET $4 ออกจากฟังก์ชัน และกระโดดไปยังตำแหน่งที่ไม่สามารถอธิบายได้ ทำไม
ดังนั้น? เป็นปัญหากับคอมไพเลอร์ของ Delphi หรือไม่?
นอกจากนี้โค้ด RE ในฟอรัม Borland ไม่ใช่โค้ดข้างต้น แต่เอฟเฟกต์เหมือนกับที่ฉันเขียน
- แต่ FreeLibrary(p) มีผลเหมือนกับ UnmapViewOfFile(hModule) หรือไม่
รหัสมีดังนี้:
โปรแกรมโปรเจ็กต์1;
การใช้งาน
หน้าต่าง;
ขั้นตอน DeleteSelf;
var
โมดูล: HMODULE;
buf : อาร์เรย์ [ 0 .. MAX_PATH - 1 ] ของถ่าน;
p:อูหลง;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary : ตัวชี้;
เริ่ม
โมดูล := GetModuleHandle (ไม่มี);
GetModuleFileName ( โมดูล, buf, ขนาดของ ( buf ) );
ปิดแฮนเดิล ( THandle ( 4 ) );
p := ULONG (โมดูล) + 1;
//ประโยคข้างต้นหมายความว่าอย่างไร?
hKrnl32 := GetModuleHandle ( 'เคอร์เนล32' );
pExitProcess := GetProcAddress (hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress (hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress (hKrnl32, 'FreeLibrary');
asm
ลี เอกซ์, บัฟ
กด 0
กด 0
ดัน eax
กด pExitProcess
ดันพี
กด pDeleteFile
กด pFreeLibrary
เกษียณ
จบ;
จบ;