![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Может ли ехе... [D5, D6, Win95/98, WinXP]
Artur © (2005-02-03 21:18:00)Может ли ехе-файл удалить самого себя? Есть ли варианты кроме bat-файла?
Kerk (2005-02-04 17:25:00) [1]Klev (04.02.05 4:24) [6]
попса
Marser (2005-02-04 17:18:00) [2]Системный реестр, ключ RunOnce
GrayFace (2005-02-04 06:53:00) [3]В XP не работает.
Klev (2005-02-04 04:24:00) [4]Проверял только на Win2K и W98 - все работает. Компиллировал с помощью D6.
Для (xp?)/2000:
procedure selfdeletent;
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;
Для 98/95/(me?):
Procedure selfDelete98;
Var Hmodule:Thandle;
Szmodulename:Array[0..Max_path] Of Char;
Hkrnl32 : Thandle;
Pexitprocess, Pdeletefile, Pfreelibrary,
Punmapviewoffile : Pointer;
Exitcode:Uint;
Begin
Hmodule:= Getmodulehandle(Nil);
Getmodulefilename(Hmodule, Szmodulename,
Sizeof(Szmodulename));
Hkrnl32 := Getmodulehandle( 'kernel32' );
Pexitprocess := Getprocaddress( Hkrnl32, 'exitprocess' );
Pdeletefile := Getprocaddress( Hkrnl32, 'deletefilea' );
Pfreelibrary := Getprocaddress( Hkrnl32, 'freelibrary' );
Punmapviewoffile := Getprocaddress( Hkrnl32, 'unmapviewoffile' );
Exitcode := 0;
If($80000000 And Getversion())<>0 Then
// Win95, 98, Me
Asm
Lea Eax, Szmodulename
Push Exitcode
Push 0
Push Eax
Push Pexitprocess
Push Hmodule
Push Pdeletefile
Push Pfreelibrary
Ret
End
Else
Begin
Closehandle(Thandle(4));
Asm
Lea Eax, Szmodulename
Push Exitcode
Push 0
Push Eax
Push Pexitprocess
Push Hmodule
Push Pdeletefile
Push Punmapviewoffile
Ret
End
End
End;
Просто Джо (2005-02-04 02:41:00) [5]Кстати, в SDK и MSDN -- ошибка (?)
Указано, что имя ключа должно быть "NUL". Во всех попадавшихся мне файлах wininit.ini я видел только "NULL". То-ли инсталляторы неграмотные, то-ли опечатка в MSDN.
Впрочем, я никогда не пробовал писать "NUL", а сейчас нет 9x под рукой, чтобы проверить, отрабатывается ли также "NUL".
Просто Джо (2005-02-04 02:37:00) [6]
> Может ли ехе-файл удалить самого себя?
Может, а почему нет? Не сказано же - во время его выполнения.
Решение для NT:
MoveFileEx(szSrcFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT);
Решение для 9x:
Ищем файл $WINDIR$\wininit.ini
В секцию [rename] пишем:
NULL=путь_и_имя_файла
Итог:
При следующей перезагрузке файл будет удален.
z007 (2005-02-03 22:59:00) [7]
> Есть ли варианты кроме bat-файла?
есть еще варианты с exe, com и dll - файлами )
Gero (2005-02-03 21:45:00) [8]Теоретически нет.
Anatoly Podgoretsky (2005-02-03 21:40:00) [9]Не может, а с bat-файл это не он сам себя, но хорошо.