![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Самоудаление [D7, WinXP]
Calibr2 © (2006-07-20 21:44:00)Как сделать чтобы программа удалила сама себя?
_mik (2006-07-20 23:07:00) [1]вот пример
procedure DeleteSelf;
var
module: HModule;
buf: array [0..MAX_PATH - 1] of char;
p: ULong;
hKrnl32: HModule;
pExitProcess,
pDeleteFile,
pFreeLibrary: pointer;
begin
module := GetModuleHandle(nil);
GetModuleFileName(module, buf, SizeOf(buf));
CloseHandle(THandle(4));
p := ULONG(module) + 1;
hKrnl32 := GetModuleHandle('kernel32');
pExitProcess := GetProcAddress(hKrnl32, 'ExitProcess');
pDeleteFile := GetProcAddress(hKrnl32, 'DeleteFileA');
pFreeLibrary := GetProcAddress(hKrnl32, 'FreeLibrary');
asm
lea eax, buf
push 0
push 0
push eax
push pExitProcess
push p
push pDeleteFile
push pFreeLibrary
ret
end;
end;
Andy BitOff (2006-07-20 23:02:00) [2]А я вот узнал, что строка "del setup.bat >NUL" в bat'нике setup.bat удалит его, тем самым можно удалить себя создав батник.
P.S. Я знаю что земля не круглая (с)
Джо (2006-07-20 22:45:00) [3]> [6] Anatoly Podgoretsky © (20.07.06 22:41)
Значит, нужно поступить вежливо и вывести пользователю окно с "Перегрузите, пожалуйста, компьютер" :)
Anatoly Podgoretsky (2006-07-20 22:41:00) [4]Джо © (20.07.06 21:58) [3]
А иногда система годами не перезагружается, особенно в свете hibernate
tesseract (2006-07-20 22:03:00) [5]> [3] Джо © (20.07.06 21:58)
А был же вроде трюк - переименовать себя и удалить, но вроде в XP не работал.
Джо (2006-07-20 22:01:00) [6]Да, еще. Все это работает начиная с NT. В 98 аналогичную задачу можно решить создав файл WININIT.INI в директории Windows, если файл уже существует, просто добавить в него строку такого образца в секции [rename]:
NULL=SourceFileName
RzCoDer (2006-07-20 21:58:00) [7]Программа не может удалить сама себя, т.к. нельзя удалять приложения загруженные в память. А вот дать такое задание какому нить левому системному исполнителю можно.
Джо (2006-07-20 21:58:00) [8]Можно воспользоваться докумментированным способом, функцией MoveFileEx.
Задаем следующие параметры:
MoveFileEx (PChar(Application.ExeName),nil,MOVEFILE_DELAY_UNTIL_REBOOT)
При первой же перегрузке ОС файл FileName будет удален. Пользователь, в контексте которого выполняется данный код, должен иметь права локального администратора.
Мефисто (2006-07-20 21:50:00) [9]Вот сейчас придут и попинают...