Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Может ли ехе... [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-файл это не он сам себя, но хорошо.


Наверх

Титульная страница Поиск, карта сайта Написать письмо