Если ваш руководитель
Заблуждаясь утверждает,
Что в его машине вирус
И он вами занесен,
То когда он отлучится,
Выньте из нее винчестер
И в кастрюле кипятите,
Пока вирус не помрет!!!
Это программное обеспечение Delphi, которое пытается удалить себя. Код использует функции Windows API GetModuleHandle, GetModuleFileName и GetProcAddress для получения handles и процедур из библиотеки kernel32.dll.
Вот шаг за шагом, что код делает:
Он получает handle текущего модуля с помощью GetModuleHandle(nil).
Он получает полный путь текущего модуля с помощью GetModuleFileName.
Он закрывает неименованный handle (handle 4) с помощью CloseHandle.
Он рассчитывает адрес текущего модуля, добавляя к его handle 1.
Он получает handles на три процедуры kernel32.dll: ExitProcess, DeleteFileA и FreeLibrary с помощью GetProcAddress.
Затем программа использует inline-ассемблерный код для вызова этих процедур, передавая аргументы следующим образом:
buf: адрес полного пути текущего модуля.
pExitProcess: handle процедуры ExitProcess.
p: адрес текущего модуля.
pDeleteFile: handle процедуры DeleteFileA.
pFreeLibrary: handle процедуры FreeLibrary.
Надоедающий эффект - удалить текущий исполняемый файл с помощью DeleteFileA, освободить загруженные библиотеки с помощью FreeLibrary и затем выйти из программы с помощью ExitProcess. Однако, код имеет несколько проблем:
Ассемблерный код неправильен: он пытается положить аргументы на стек без правильной алинировки.
Вызов CloseHandle не нужен и может вызвать проблемы при использовании с недопустимым handle.
Программа не проверяет ошибки при вызове функций Windows API.
Функция DeleteFileA требует null-terminated строки, но переменная buf не гарантирована быть null-terminated.
Чтобы улучшить этот код, я бы рекомендовал:
Исправить ассемблерный код для правильной алинировки и положения аргументов на стек.
Удалить ненужные вызовы и проверять ошибки при вызове функций Windows API.
Проверить, что функция DeleteFileA получает валидную null-terminated строку.
Обратите внимание, что даже с этими улучшениями удаление программы все еще сложный процесс и может не всегда быть успешным.
Статья рассказывает о том, как программист создал процедуру на языке Паскаль, которая может удалить саму себя из операционной системы Windows.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.