• XSS.stack #1 – первый литературный журнал от юзеров форума

удалить самого себя (exe)

at0m

RAID-массив
Пользователь
Регистрация
16.05.2010
Сообщения
93
Реакции
2
Всем привет нужен метод самоудаления exe файла когда он запущен без использования (там без всяких батников,реестра, shellexecude + notify, инжектов в процесс и прочей ерести).
На примете пока MoveFileExW(pszwMyExistExe,NULL,MOVEFILE_DELAY_UNTIL_REBOOT);
и вообще существуют методы ?
 
Удалить EXE во время работы невозможно, исключение - файловые потоки NTFS. Если скопировать EXE в поток и запустить, то поток этот без проблем удаляется, но у многих аверов это вызовет ректальный зуд.
MoveFileEx весьма годный способ, но тут нужны права админа т.к. происходит запись в HKLM, что как и предъидушее вызовет побочные явления у многих АВ.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Создавать батник .. снимем процесс , и удаляем программу... я так делал , ну и конечно удаляем батник!!
 
shyrka
Код:
BOOL SelfDelete()
{
	CHAR szFile[MAX_PATH], szCmd[MAX_PATH];

	if((GetModuleFileName(0,szFile,MAX_PATH)!=0) &&
  (GetShortPathName(szFile,szFile,MAX_PATH)!=0))
	{
  lstrcpy(szCmd,"/c del ");
  lstrcat(szCmd,szFile);
  lstrcat(szCmd," >> NUL");

  if((GetEnvironmentVariable("ComSpec",szFile,MAX_PATH)!=0) &&
  	((INT)ShellExecute(0,0,szFile,szCmd,0,SW_SPOILER)>32))
  	return TRUE;
	}
	return FALSE;
}
Интересная статейка с исходниками в комплекте
 
изначально нужно выгрузить себя из процессов, иначе не удалится файл, во вторых это то же самое что и батник только комманда собирается, грузится cmd и туда вставляется комманда...
тс спрашивал об эксозитеческих вариантах)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Да ехе делает свои функции и удаляется.. во так должно быть...

Но вроде ругаются только не понятные АВ ) так что на разе спс , но если есть идеи пиши)
 
accelerator
С файловыми потоками глючный метод, если на ХР срабатывает, на Win7 может не удалить.
Работает на ура с xp по win7 в своем софте через нтфс потоки удаляю подгруженную либу
что касается удалить запущенный exe остановился пока на след. коде
Код:
BOOL SelfDelete()
{
  BOOL bRet = FALSE;
  PWCHAR pszwSelfFileName = (PWCHAR)AllocateHeap(BUFF_SIZE);  
  if (pszwSelfFileName != NULL)
  {
   if (GetModuleFileNameW(GetModuleHandleW(NULL),pszwSelfFileName,BUFF_SIZE)!=0)
   { 
        if (GetShortPathNameW(pszwSelfFileName,pszwSelfFileName,BUFF_SIZE)!=0)
     {
           PWCHAR pszwComSpec = (PWCHAR)AllocateHeap(BUFF_SIZE);
           if (pszwComSpec != NULL)
     {
         if (GetEnvironmentVariableW(L"COMSPEC",pszwComSpec,BUFF_SIZE)!=0)
      {
       PWCHAR pszwParamStr = (PWCHAR)AllocateHeap(BUFF_SIZE);
       if (pszwParamStr != NULL)
       {
      	// set command shell parameters
      	MyStrCatW(pszwParamStr,L"/c del ");
                            MyStrCatW(pszwParamStr,pszwSelfFileName);
      	MyStrCatW(pszwParamStr,L" > nul");
          // set struct members
                         SHELLEXECUTEINFOW sei;
                            sei.cbSize       = sizeof(sei);
                            sei.hwnd         = 0;
                            sei.lpVerb       = L"Open";
                            sei.lpFile       = pszwComSpec;
                            sei.lpParameters = pszwParamStr;
                            sei.lpDirectory  = 0;
                            sei.nShow        = SW_SPOILER;
                            sei.fMask        = SEE_MASK_NOCLOSEPROCESS;

                            SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);
                            SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_TIME_CRITICAL);
                     
      	if(ShellExecuteExW(&sei))
                            {
                                 SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
                                 SetProcessPriorityBoost(sei.hProcess,TRUE);
                                 SHChangeNotify(SHCNE_DELETE,SHCNF_PATHW,pszwSelfFileName,0);
                                 bRet = TRUE;
                            }
                            else // if error, normalize allocation
                            {
                                 SetPriorityClass(GetCurrentProcess(),NORMAL_PRIORITY_CLASS);
                                 SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_NORMAL);
                            }
      	FreeHeap(pszwParamStr);
       }
      }
         FreeHeap(pszwComSpec);
     }
     }
   }
   FreeHeap(pszwSelfFileName);
  }
  return bRet;
}
 
это все хорошо, но какой тайный смысл использования SetPriorityClass/SetThreadPriority/SetProcessPriorityBoost к чужому процессу ? :) у хипсов обычно стоят хуки на ntsetinformationthread/ntsetinformationprocess, а лишний раз их лучше не нервировать по пустякам :nono:
 
Barack
Причем тут хипс ЭТО не для обхода ....
ясень пень что все сервисы с SSDT хукнутые
для обхода хипса и uac - ка (еще не все потеряно ...) использую другую методику
автор выше сказаного мной кода не я, могу предположить что вся муть
SetPriorityClass(sei.hProcess,IDLE_PRIORITY_CLASS);
SetProcessPriorityBoost(sei.hProcess,TRUE);
.....
используется для выделения приоритета нашему процессу\потоку что бы "быстрее завершить наш процесс " потом его удалить ....
контекст меньше дергать то есть обработка только нашего потока\процесса
 
Причем тут хипс ЭТО не для обхода ....
ясень пень что все сервисы с SSDT хукнутые
для обхода хипса и uac - ка (еще не все потеряно ...) использую другую методику
а я что где-то упоминал про обходы ? про хипсы я имел ввиду - что делая ntsetinformationthread/ntsetinformationprocess к чужому процессу, наберешь как минимум "доп балы" у проактивки. Верю что ты обходишь и даже знаю как :)
используется для выделения приоритета нашему процессу\потоку что бы "быстрее завершить наш процесс " потом его удалить ....
контекст меньше дергать то есть обработка только нашего потока\процесса
я понял что не ты этот кодес сочинял , а просто как пример кинул , как по мне вся это возня с приоритетами - бред.
Почистил кодес от всего калла:
Код:
void SelfDelete()
{
        WCHAR szFile[MAX_PATH], szCmd[MAX_PATH];
        GetModuleFileNameW(0,szFile,MAX_PATH);
        GetShortPathNameW(szFile,szFile,MAX_PATH);
        lstrcpyW(szCmd,L"/c del "); lstrcatW(szCmd,szFile); lstrcatW(szCmd,L" > nul");            
        GetEnvironmentVariableW(L"ComSpec",szFile,MAX_PATH); 
        CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE); // MS советует перед ShellExecute
        ShellExecuteW(0,L"open",szFile,szCmd,0,SW_SPOILER);
}
 
Приоритеты для того чтоб ComSpec выполнился после закрытия приложения. Но это не гарантирует удаление, закрытие дескриптора может произойти после попытки удаления, темболее без установки приоритетов.
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх