// Reposter: لقد رأيت مقالًا كهذا مترجمًا من قبل السيد لو لين، وهو إصدار C، وقد قمت بإعادة كتابته في دلفي دون جدوى.
المرسل: ليتود (ريك)، المنطقة: دلفي
العنوان: تم أخيراً الانتهاء من إصدار دلفي لبرنامج الحذف الذاتي. (طبع)
محطة الإرسال: محطة BBS Shuimu Tsinghua (الاثنين 4 يونيو، 20:51:55 2001)
[النص التالي مستنسخ من منطقة مناقشة البرمجة]
المرسل: ليتود (ريك)، القسم: البرمجة
العنوان: تم أخيراً الانتهاء من إصدار دلفي لبرنامج الحذف الذاتي.
محطة الإرسال: محطة BBS Shuimu Tsinghua (الاثنين 4 يونيو 20:50:42 2001)
ذهبت إلى منتدى بورلاند وسألت، وكان بالفعل نفس ما قاله لاودوان.
GetProcAddress بنفسك. الرمز هو كما يلي:
مشروع البرنامج1؛
الاستخدامات
نوافذ؛
إجراء حذف الذات؛
فار
hModule: Thandle؛
برتقالي: صفيف [0..255] من Char؛
hKernel32: Thandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: Pointer;
يبدأ
hModule := GetModuleHandle(nil);
GetModuleFileName(hModule, buff, sizeof(buff));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
asm
ليا إياكس، برتقالي
ادفع 0
ادفع 0
ادفع إياكس
دفع pExitProcess
دفع hModule
ادفع pDeleteFileA
ادفع pUnmapViewOfFile
ريت
نهاية؛
نهاية؛
يبدأ
حذف الذات؛
نهاية.
الآن هناك شيء غريب، وهو أنه يجب وضع الكود في الإجراء.
وضعه مباشرة في منتصف البداية...النهاية لن ينجح. ربما لا يمكن استخدام المتغيرات العالمية
ولكن لماذا لا يمكن استخدامه لا يزال غير واضح.
أيضًا، بدلاً من GetProcAddress، اكتب مباشرة كما يلي:
دفع الإزاحة UnmapViewOfFile
نتيجة التتبع هي أن التنفيذ يدخل KERNEL32.UnmapViewOfFile، ولكن فقط بعد ذلك
حدث خطأ عندما خرج RET $4 من الوظيفة، وانتقل إلى مكان لا يمكن تفسيره. لماذا
لذا؟ هل هي مشكلة مع مترجم دلفي؟
بالإضافة إلى ذلك، فإن كود RE الموجود في منتدى بورلاند ليس هو ما سبق، ولكن التأثير هو نفس ما كتبته.
. ولكن هل لدى FreeLibrary(p) نفس تأثير UnmapViewOfFile(hModule)؟
الرمز هو كما يلي:
مشروع البرنامج1؛
الاستخدامات
النوافذ؛
إجراء حذف الذات؛
فار
الوحدة النمطية: HMODULE؛
buf: مصفوفة [ 0 .. MAX_PATH - 1 ] من char؛
ص: أولونج؛
hKrnl32: HMODULE;
pExitProcess، pDeleteFile، pFreeLibrary: المؤشر؛
يبدأ
الوحدة النمطية := GetModuleHandle ( nil );
GetModuleFileName (module, buf, sizeof ( buf ) );
CloseHandle ( THandle ( 4 ) );
ع := ULONG (الوحدة النمطية) + 1؛
// ماذا تعني الجملة أعلاه؟
hKrnl32 := GetModuleHandle( 'kernel32');
pExitProcess := GetProcAddress ( hKrnl32, 'ExitProcess' );
pDeleteFile := GetProcAddress ( hKrnl32, 'DeleteFileA' );
pFreeLibrary := GetProcAddress ( hKrnl32, 'FreeLibrary' );
asm
ليا اكس، بوف
ادفع 0
ادفع 0
ادفع اكس
ادفع pExitProcess
ادفع ص
ادفع pDeleteFile
دفع pFreeLibrary
متقاعد
نهاية؛
نهاية؛