//Репостер: Я уже видел подобную статью в переводе г-на Лу Линя. Я безуспешно переписал ее на Delphi. Сегодня я зашел на BBS и увидел эту версию для Delphi.
Отправитель: Литоад (Рик), Район: Дельфи
Заголовок: Версия программы Self-Delete для Delphi наконец готова. (перепечатка)
Отправляющая станция: станция BBS Шуйму Цинхуа (понедельник, 4 июня, 20:51:55, 2001 г.)
[Следующий текст воспроизведен из раздела обсуждения PROgramming]
Отправитель: Litoad (Рик), Раздел: Программирование
Заголовок: Версия программы Self-Delete для Delphi наконец готова.
Отправляющая станция: станция BBS Шуйму Цинхуа (понедельник, 4 июня, 20:50:42, 2001 г.)
Я зашел на форум Borland и спросил, и это действительно то же самое, что сказал Лаодуан.
GetProcAddress самостоятельно. Код выглядит следующим образом:
программа Проект1;
использует
Окна;
процедура УдалитьСелф;
вар
hМодуль: THandle;
бафф: массив [0..255] символов;
hKernel32: THandle;
pExitProcess, pDeleteFileA, pUnmapViewOfFile: Указатель;
начинать
hModule: = GetModuleHandle (ноль);
GetModuleFileName(hModule, buff, sizeof (buff));
CloseHandle(THandle(4));
hKernel32 := GetModuleHandle('KERNEL32');
pExitProcess := GetProcAddress(hKernel32, 'ExitProcess');
pDeleteFileA := GetProcAddress(hKernel32, 'DeleteFileA');
pUnmapViewOfFile := GetProcAddress(hKernel32, 'UnmapViewOfFile');
Асм
ЛЕА ЭАКС, бафф
НАЖМИТЕ 0
НАЖМИТЕ 0
НАЖМИТЕ EAX
НАЖМИТЕ pExitProcess
НАЖМИТЕ hМодуль
НАЖМИТЕ pDeleteFileA
НАЖМИТЕ pUnmapViewOfFile
РЭТ
конец;
конец;
начинать
Удалить себя;
конец.
Есть одна странная вещь: код необходимо поместить в процедуру.
Поместить его прямо в начало начала... конца не получится. Возможно, глобальные переменные нельзя использовать
, но почему его нельзя использовать, до сих пор не ясно.
Также вместо GetProcAddress напишите прямо следующее:
НАЖМИТЕ СМЕЩЕНИЕ UnmapViewOfFile
Результат трассировки — выполнение входит в KERNEL32.UnmapViewOfFile, но только после
Произошла ошибка, когда RET $4 вышел из функции и перешел в необъяснимое место. почему
так? Это проблема с компилятором Delphi?
Кроме того, код RE на форуме Borland не тот, что выше, а эффект тот же, что я написал.
. Но имеет ли FreeLibrary(p) тот же эффект, что и UnmapViewOfFile(hModule)?
Код выглядит следующим образом:
программа Проект1;
использует
окна;
процедура УдалитьСелф;
вар
модуль: ХМОДУЛЬ;
buf: массив [0 .. MAX_PATH - 1] символов;
р: УЛОНГ;
hKrnl32: ХМОДУЛЬ;
pExitProcess, pDeleteFile, pFreeLibrary: указатель;
начинать
модуль: = GetModuleHandle (ноль);
GetModuleFileName (модуль, buf, sizeof (buf));
CloseHandle(THandle(4));
p := ULONG (модуль) + 1;
//Что означает приведенное выше предложение?
hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress (hKrnl32, 'ExitProcess');
pDeleteFile:= GetProcAddress (hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress (hKrnl32, 'FreeLibrary');
Асм
Леа Эакс, буф
нажмите 0
нажмите 0
нажмите eax
нажмите pExitProcess
нажмите п
нажмите pDeleteFile
нажмите pFreeLibrary
в отставку
конец;
конец;