Re: *.exe self-delete.
От: Alex Fedotov США  
Дата: 11.02.02 01:27
Оценка: 21 (2)
Здравствуйте yaroslav_v, Вы писали:

YV>Можно ли удалить *.exe файлу самого себя?


Напрямую — нет.

YV>Нужно для uninstall'era.

YV>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe".
YV>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?

Нет.

YV>Есть ли какие-то другие способи удалить самого себя


До сих пор самый надежный способ, работающий во всех системах, — это запуск .bat файла, удаляющего основную программу, а затем и себя. Динамически формируется и запускается .bat-файл следующего содержания, после чего программа быстренько завершается, чтобы пользователь не успел заметить 100% использование процессора:

:loop
del "full-path-to-my-program.exe"
if exist "full-path-to-my-program.exe" goto :loop
del "full-path-to-this-file.bat"


В этот же .bat-файл можно добавить удаление директорий, в которых находилась основная программа.

На NT возможны более изощренные методы:
http://groups.google.com/groups?hl=en&selm=91q3cn%24v8n%241%40novalfsmtp1.novsvcs.net
http://groups.google.com/groups?hl=en&selm=c14f01c1a0f7%24f9b3f010%249ae62ecf%40tkmsftngxa02
-- Alex Fedotov
Re: *.exe self-delete.
От: paul_shmakov Россия  
Дата: 14.02.02 14:27
Оценка: 12 (2)
Здравствуйте yaroslav_v, Вы писали:

YV>Можно ли удалить *.exe файлу самого себя?


Под NT я так делал, под другими операционками это не работает.
Хотя для win9x есть аналогичный код.
Трюк основан на факте, что под nt в каждом процессе хэндл со значением 4
является хэндлом собственной проекции процесса (memory mapped file).
http://rsdn.ru/forum/message.asp?mid=22155&only
Автор: paul_shmakov
Дата: 16.01.02


#include <windows.h>

int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
   char szFileName[MAX_PATH];
   GetModuleFileName(GetModuleHandle(0), szFileName, MAX_PATH);

   HMODULE hkrnl = GetModuleHandle("kernel32.dll");

   void* pUnmapViewOfFile = GetProcAddress(hkrnl, "UnmapViewOfFile");
   void* pDeleteFile = GetProcAddress(hkrnl, "DeleteFileA");
   void* pExitProcess = GetProcAddress(hkrnl, "ExitProcess");
   void* pCloseHandle = GetProcAddress(hkrnl, "CloseHandle");

   unsigned hInstance = (unsigned)GetModuleHandle(0);

   asm {
       push    0
       lea     eax, szFileName
       push    eax 
       push    pExitProcess
       push    4
       push    pDeleteFile
       push    hInstance
       push    pCloseHandle
       push    pUnmapViewOfFile
       ret
   };

   return 0; /* never get here */
}
Paul Shmakov
Re[2]: *.exe self-delete.
От: Alex Fedotov США  
Дата: 14.02.02 17:14
Оценка: 8 (1)
Здравствуйте paul_shmakov, Вы писали:

PS>
PS>#include <windows.h>

PS>int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
PS>{
PS>   char szFileName[MAX_PATH];
PS>   GetModuleFileName(GetModuleHandle(0), szFileName, MAX_PATH);

PS>   HMODULE hkrnl = GetModuleHandle("kernel32.dll");

PS>   void* pUnmapViewOfFile = GetProcAddress(hkrnl, "UnmapViewOfFile");
PS>   void* pDeleteFile = GetProcAddress(hkrnl, "DeleteFileA");
PS>   void* pExitProcess = GetProcAddress(hkrnl, "ExitProcess");
PS>   void* pCloseHandle = GetProcAddress(hkrnl, "CloseHandle");

PS>   unsigned hInstance = (unsigned)GetModuleHandle(0);

PS>   asm {
PS>       push    0
PS>       lea     eax, szFileName
PS>       push    eax 
PS>       push    pExitProcess
PS>       push    4
PS>       push    pDeleteFile
PS>       push    hInstance
PS>       push    pCloseHandle
PS>       push    pUnmapViewOfFile
PS>       ret
PS>   };

PS>   return 0; /* never get here */
PS>}
PS>


Этот код не работает под XP, о чем заявляет автор метода (Gary Nebbett)
в своем сообщении

http://groups.google.com/groups?hl=en&amp;selm=c14f01c1a0f7%24f9b3f010%249ae62ecf%40tkmsftngxa02
-- Alex Fedotov
Re: *.exe self-delete.
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 24.03.03 09:43
Оценка: 4 (1)
Есть варианты и без недокументированных фишек. Рихтер ими занимался некоторое время.
Последний писк был такой: копируем куда-то EXE, затем открываем эту копию CreateFile с флагом FILE_FLAG_DELETE_ ON_CLOSE, затем запускаем эту же копию (ч/з CreateProcess, например). Ей кидаем в командную строку (или как-то иначе) два параметра: путь к исходному EXE и inheritable-хендл самого работающего процесса. Потом делаем харакири (просто завершаем процесс).
В это время копия уже делает WaitForSingleObject, ожидая, пока не станет инвалидным полученный хендл. Как только это произойдет, она удаляет оригинал. Потом тоже просто-напросто умирает, и срабатывает (т.к. больше файл никому не нужен) Delete-On-Close.

Все!
Естественно, EXEшник должен уметь распознавать, что его запустили в режиме удаления, т.е. единственно в качестве копии для удаления деинсталлера.

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
*.exe self-delete.
От: yaroslav_v http://yaroslav-v.chat.ru
Дата: 11.02.02 01:05
Оценка:
Можно ли удалить *.exe файлу самого себя?
Нужно для uninstall'era.
Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe".
В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?
Есть ли какие-то другие способи удалить самого себя
Re: *.exe self-delete.
От: ua1zcl Россия www.alexklm.ru
Дата: 11.02.02 02:03
Оценка:
Здравствуйте yaroslav_v, Вы писали:

YV>Можно ли удалить *.exe файлу самого себя?


Смотрите
http://www.akzhan.midi.ru/win32api/46.htm
А вот сам себя — не получится.
Александр
Re: *.exe self-delete.
От: Аноним  
Дата: 12.02.02 14:00
Оценка:
Здравствуйте yaroslav_v, Вы писали:

YV>Можно ли удалить *.exe файлу самого себя?

YV>Нужно для uninstall'era.
YV>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe".
YV>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?
YV>Есть ли какие-то другие способи удалить самого себя



#include <windows.h>
#include <stdio.h>

void DelSelf(void)
{
 char modulename[MAX_PATH];
 char batfile[MAX_PATH];
 char batlines[MAX_PATH*4];
 LPSTR tempdir;
 char Buf[MAX_PATH];

 GetModuleFileName(NULL,modulename,MAX_PATH);

 tempdir = ((GetEnvironmentVariable(TEXT("TEMP"),
 Buf, MAX_PATH) > 0) ? Buf : NULL);

 strcpy(batfile,tempdir);
 strcat(batfile,"\\");
 strcat(batfile,"delself.bat");
 strcpy(batlines,"@echo off\n:try\ndel ");
 strcat(batlines,modulename);
 strcat(batlines,"\nif exist ");
 strcat(batlines,modulename);
 strcat(batlines," goto try\n");
 strcat(batlines,"del ");
 strcat(batlines,batfile);

 DWORD NOfBytes;
 HANDLE hbf= CreateFile(batfile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ
| FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
 WriteFile(hbf,batlines,strlen(batlines),&NOfBytes, NULL);
 CloseHandle(hbf);

 STARTUPINFO         si;
 PROCESS_INFORMATION pi;
 ZeroMemory( &si, sizeof(si) );
 si.cb = sizeof(si);
 si.wShowWindow = SW_HIDE;
 si.dwFlags = STARTF_USESHOWWINDOW;

 CreateProcess(
     NULL,
     batfile,
     NULL,
     NULL,
     FALSE,
     IDLE_PRIORITY_CLASS|DETACHED_PROCESS,
     NULL,
     NULL,
     &si,
     &pi);

}
void main()
{
 DelSelf();
}


С уважением
Dushes :crash:
Re[2]: *.exe self-delete.
От: ilya123 Россия  
Дата: 14.09.02 21:08
Оценка:
YV>>Можно ли удалить *.exe файлу самого себя?

А> strcat(batfile,"delself.bat");

А> strcpy(batlines,"@echo off\n:try\ndel ");
А> strcat(batlines,modulename);
А> strcat(batlines,"\nif exist ");
А> strcat(batlines,modulename);
А> strcat(batlines," goto try\n");
А> strcat(batlines,"del ");

Это работает на XP, но не работает на 98.
А дело в том, что нужно вместо \n использовать \r\n!
Re[2]: *.exe self-delete.
От: Блудов Павел Россия  
Дата: 25.03.03 03:24
Оценка:
Здравствуйте, Slicer [Wirkwood], Вы писали:

SW>Естественно, EXEшник должен уметь распознавать, что его запустили в режиме удаления, т.е. единственно в качестве копии для удаления деинсталлера.


По-моему, этот вариант мало отличается от варианта с .bat файлом.
Только сложней в реализации.

Павел.
Re[3]: *.exe self-delete.
От: Slicer [Wirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 25.03.03 04:20
Оценка:
Может, я извращенец, но, по-моему, так все же... изящнее, что ли?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
Re: *.exe self-delete.
От: Valerio Россия linkedin.com/in/boronin
Дата: 25.03.03 21:43
Оценка:
YV>Есть ли какие-то другие способи удалить самого себя
свежее поступление по теме на codeguru
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re: *.exe self-delete.
От: Курильщик  
Дата: 11.07.03 12:08
Оценка:

а вот у меня тоже вопрос есть: как сообще отвязаться от файла.
т.е. если мы запускаем прогу с сиди, вынимаем диск, и прога пробует обратиться за своими ресурсами, то потребуется диск. а как сделать чтоб он не был нужен? (чур без копирования на хард)
еслибы можно было этого добиться то exe-файл можно запросто удалить и самой прогой.
такие вот изыскания...
тока кто что подскажет по этому поводу?
селф делит — оч любопытная тема.
запуск самого себя с параметром FILE_FLAG_DELETE_ ON_CLOSE не поможет с освобождением хэндлов сразу по загрузке кода и ресурсов в память?
оч любопытно.
я вот например делаю программу-безопасниковскую. чтобы контролировать целостность одного бизнес-процесса.
хочу запускать прогу с дискеты и вынимать е:е. а прога чтоб работала и при неком событии просто завершалась. если при контроле е:е нет в списке задач значит беда!
----
cgbs.
Re: *.exe self-delete.
От: Calc Россия  
Дата: 11.07.03 16:01
Оценка:
Здравствуйте, yaroslav_v, Вы писали:

_>Можно ли удалить *.exe файлу самого себя?

_>Нужно для uninstall'era.
_>Сейчас я копировал им его в TEMP, и запускал с парамeтром, тот удалял первый, а себя делал “удалять на перезапускe".
_>В PE-заголовках есть флаг, что мол мы на сменном носителе, позволяет ли он удалить исполняемому файлу самого себя?
_>Есть ли какие-то другие способи удалить самого себя


Можно создать bat ( del путь к exe) файл и вызвать его, но потом проблема удалить этот bat
Re[2]: *.exe self-delete.
От: Valerio Россия linkedin.com/in/boronin
Дата: 12.07.03 06:11
Оценка:
вся эта тема подробнейшим образом обсуждена — воспользуйтесь поиском! даже субж практически 1 в 1
... << RSDN@Home 1.1 alpha 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: *.exe self-delete.
От: Valerio Россия linkedin.com/in/boronin
Дата: 12.07.03 06:25
Оценка:
эта любопытная действительно тема уже давно лежит на сайте — достаточно попробовать поиск!!!
... << RSDN@Home 1.1 alpha 1 >>
Valery A. Boronin, RSDN Team, linkedin.com\in\boronin
R&D Mgmt & Security. AppSec & SDL. Data Protection and Systems Programming. FDE, DLP, Incident Management. Windows Filesystems and Drivers.
Re[2]: *.exe self-delete.
От: masta Россия  
Дата: 16.07.03 13:22
Оценка:
Есть такая идея — сделать секцию на основе файла подкачки, в неё затолкать ресурсы из файла, которые являются кодом, ожидающим завершения процесса. потом настроит стек, остальные вещи, необходимые для работы NtCreateProcess, и вызвать NtCreateProcess для созданной секции.

Новый процесс дождётся завершения родителя и завершится.

Или такая мысль — родить поток в чужом процессе, который сделает то же самое, процессом-носителем может быть любой процесс, хоть SYSTEM
Re[3]: *.exe self-delete.
От: Аноним  
Дата: 15.10.06 23:14
Оценка:
Здравствуйте, masta, Вы писали:

M>Есть такая идея — сделать секцию на основе файла подкачки, в неё затолкать ресурсы из файла, которые являются кодом, ожидающим завершения процесса. потом настроит стек, остальные вещи, необходимые для работы NtCreateProcess, и вызвать NtCreateProcess для созданной секции.


Можно, пожалуйста поподробнее об этом... Если не трудно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.