//Reposter: Saya pernah melihat artikel seperti ini diterjemahkan oleh Tuan Lu Lin sebelumnya. Ini adalah versi C. Saya menulis ulang di Delphi tanpa hasil. Saya pergi ke Tsinghua BBS hari ini dan melihat versi Delphi ini.
Pengirim: Litoad (Rick), Area: Delphi
Judul: Program Self-Delete versi Delphi akhirnya selesai. (mencetak kembali)
Stasiun pengirim: Stasiun BBS Shuimu Tsinghua (Senin 4 Juni 20:51:55 2001)
[Teks berikut ini direproduksi dari area diskusi Pemrograman]
Pengirim: Litoad (Rick), Bagian: Pemrograman
Judul: Program Self-Delete versi Delphi akhirnya selesai.
Stasiun pengirim: Stasiun BBS Shuimu Tsinghua (Senin 4 Juni 20:50:42 2001)
Saya pergi ke forum Borland dan bertanya, dan memang sama dengan yang dikatakan laoduan.
DapatkanProcAddress sendiri. Kodenya adalah sebagai berikut:
program Proyek1;
kegunaan
jendela;
prosedur Hapus Diri;
var
hModul: Pegangan;
buff: array[0..255] dari Char;
hKernel32: Pegangan;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: Penunjuk;
mulai
hModule := GetModuleHandle(nihil);
GetModuleFileName(hModule, buff, sizeof(buff));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'Proses Keluar');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
asm
LEA EAX, penggemar
DORONG 0
DORONG 0
DORONG EAX
PUSH pProses Keluar
PUSH hModul
TEKAN pDeleteFileA
TEKAN pUnmapViewOfFile
MEMBASAHI
akhir;
akhir;
mulai
Hapus Diri;
akhir.
Sekarang ada satu hal yang aneh, yaitu kode tersebut harus ditempatkan di sebuah Prosedur.
Meletakkannya langsung di tengah awal...akhir tidak akan berhasil. Mungkin variabel global tidak bisa digunakan
, tapi kenapa tidak bisa digunakan masih belum jelas.
Selain itu, alih-alih GetProcAddress, tulis langsung sebagai berikut:
PUSH OFFSET UnmapViewOfFile
Hasil penelusurannya adalah eksekusi masuk KERNEL32.UnmapViewOfFile, tetapi hanya setelahnya
Terjadi kesalahan ketika RET $4 keluar dari fungsi, dan melompat ke tempat yang tidak dapat dijelaskan. Mengapa
Jadi? Apakah ada masalah dengan kompiler Delphi?
Selain itu kode RE di forum Borland memang bukan diatas, namun efeknya sama dengan yang saya tulis.
. Tetapi apakah FreeLibrary(p) memiliki efek yang sama dengan UnmapViewOfFile(hModule)?
Kodenya adalah sebagai berikut:
program Proyek1;
kegunaan
jendela;
prosedur Hapus Diri;
var
modul: HMODULE;
buf : array [ 0 .. MAX_PATH - 1 ] dari char;
p:ULONG;
hKrnl32: HMODULE;
pExitProcess, pDeleteFile, pFreeLibrary : penunjuk;
mulai
modul := GetModuleHandle ( nihil );
GetModuleFileName ( modul, buf, sizeof ( buf ) );
CloseHandle ( Pegangan ( 4 ) );
p := ULONG (modul) + 1;
//Apa arti kalimat di atas?
hKrnl32 := GetModuleHandle ( 'kernel32' );
pExitProcess := GetProcAddress ( hKrnl32, 'Proses Keluar' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'Perpustakaan Gratis' );
asm
lea eax, kawan
tekan 0
tekan 0
dorong eax
tekan pExitProcess
dorong hal
tekan pDeleteFile
dorong pFreeLibrary
membasahi
akhir;
akhir;