ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование > С/С++, C#, Delphi, .NET, Asm
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Самоудаление *.exe
  #1  
Старый 01.07.2007, 15:57
[53x]Shadow
Leaders of Antichat
Регистрация: 25.01.2007
Сообщений: 341
Провел на форуме:
3372120

Репутация: 2565
По умолчанию Самоудаление *.exe

Может такая тема уже была, но ничего на ачате не нашел.
Имхо вопрос самоудаления исполняемых файлов в Винде достаточно интересен. Сам всю жизнь юзал достаточно простые способы с батником и MoveFileEx, и через реестр.
Но покопавшись в поиске нашел еще несколько способов, опишу здесь все. Сразу хочу отметить, что весь материал взят из статьи Ex`a с www.progz.ru
Так же хотелось бы в этой теме увидеть и другие варианты/способы о которых знаете ВЫ.
И так:

Системный реестр

Код:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnce
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx
Записи в этом разделе указывают на имена файлов, которые должны выполниться один раз во время загрузки системы. Для удаления программы, нужно всего лишь добавить запись с именем файла, который удалит ее или командой del "имя файла".

MoveFileEx

Код:
BOOL MoveFileEx(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, DWORD dwFlags);
Эта функция перемещает файл в новое место. Если вы передадите NULL в качестве второго параметра, то файл не будет перемещен, а фактически будет удален. Если указать флаг MOVEFILE_DELAY_UNTIL_REBOOT в dwFlags, то Windows удалить или переместит файл при перезагрузке. У этого метода есть несколько недостатков. Первый: вы не можете удалить каталог, в котором находиться исполняемый файл. Второй: Файл будет удален только после перезагрузки системы. Третий недостаток, в том, что функция MoveFileEx не поддерживается в Windows 9x/ME.

Wininit.ini

Код:
[Rename]
NUL=c:\dir\myapp.exe
c:\dir\new.exe=c:\dir\old.exe
В Windows 9x/ME при каждой загрузке системы выполняется приложение wininit.exe. Это приложение ищет на диске файл wininit.ini, если файл существует, то ищется секция [Rename]. Каждая строка в этой секции указывает на файл который должен быть переименован или удален. Этот метод похож на MoveFileEx, описанный выше. Имя файла с лева от знака “=” указывает на новый путь к файлу, название справа указывает на текущий путь. Если в качестве нового имени файла указан NUL, wininit.exe удалит его.

Batch File
Этот метод работает во всех версиях Windows. Он основан на том, что bat файлы способны удалять сами себя. Что бы проверить данный метод создайте небольшой bat файл (назовите его test.bat) содержащий единственную команду:

Код:
del test.bat
После запуска, bat файл удалит себя и выйдет с сообщением об ошибке “the batch file cannot be found”, это всего лишь сообщение и его можно спокойно игнорировать. Для самоудаления программа должна создать и выполнить bat файл (назовем его delus.bat) со следующим содержанием:

Код:
:Repeat
del "C:\MYDIR\MYPROG.EXE"
if exist "MYPROG.EXE" goto Repeat
rmdir "C:\MYDIR"
del "\delus.bat"
После запуска bat файл будет пытаться удалить указанную программу и после успешного удаления уничтожит себя.

COMSPEC

Код:
BOOL SelfDelete()
{
  TCHAR 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_HIDE)>32))
  return TRUE;
}

  return FALSE;
}
Этот способ похож на способ Batch File, но немного аккуратнее в реализации и работает под всеми 32-разрядными версиями Windows, где определена переменная среда COMSPEC. Она всегда определена по умолчанию и содержит полный путь к командному интерпретатору (для Windows 9x – это “command.exe”, для Windows NT – “cmd.exe”). Функция будет работать, только если программа не запущена, так что важно после запуска функции немедленно выйти из программы. Это функция порождает копию программного интерпретатора и выполняет следующий код:

Код:
del <путь к программе> >> NUL
Этот код удаляет текущую программу и направляет вывод к NUL. Shell process создается со скрытым окном и поэтому весь процесс удаления незаметен.

FILE_FLAG_DELETE_ON_CLOSE

Функция CreateFile принимает несколько флагов, указывающих, как файл должен быть создан или открыт. Один из таких флагов, FILE_FLAG_DELETE_ON_CLOSE, указывает на то, что файл должен быть удален после закрытия последнего дескриптора. Для удаления программы вы должны выполнить программу с этим флагом, чтобы после завершения запускной файл удалился. Первым шагом должно быть создание пустого файла с указанным флагом FILE_FLAG_DELETE_ON_CLOSE. Потом содержимое запускного файла копируется в пустой файл и создается процесс из нового файла. Это приводит к тому, что дублируются дескрипторы файлов. Когда новый процесс создан, полный путь текущего процесса и его PID передается через командную строку. Дальше, текущая программа (которая хочет удалить себя), закрывает дескриптор файла, используемого для создания нового процесса, и завершается.

Это звучит немного сложно, но на самом деле все не так уж трудно.

Текущий процесс:
1. Создать новый файл с флагом FILE_FLAG_DELETE_ON_CLOSE.
2. Скопировать содержимое текущего файла в новый файл.
3. Создать новый процесс с дублированной программой.
4. Передать полный путь и PID текущей программы в вызове CreateFile.
5. Бездействовать некоторое время, чтобы новый процесс запустился.
6. Закрыть новый файл.
7. Выйти из текущего процесса.

Дублированный процесс:
8. Дождаться пока первый процесс завершится
9. Удалить файл указанный в командной строке.
10. Выйти из процесса дублера.

Есть несколько замечаний по этому способу. Первой, когда новый процесс запущен, “старый” должен бездействовать некоторое время, что бы дать время загрузчику Windows открыть файл и запустить процесс (таким образом увеличивается счетчик файла). Второе, новый процесс должен дождаться пока старый не завершится. Третье, когда дубликат программы создан, он должен иметь установленный флаг FILE_SHARE_DELETE, иначе CreateProcess потерпит неудачу, потому что, не сможет открыть файл, пока он имеет флаг DELETE_ON_CLOSE. Четвертое, программа должна быть написана таким образом чтобы смогла исполнить две задачи. И последенее, дублированный процесс должен знать, что это его задача удалить исходный файл.
Очевидно, этот метод требует осторожного кодирования, но работает очень хорошо. Альтернативный метод состоит в том, что бы написать маленькую программу, для которой единственной задачей являлось бы удаление файла указанного в командной строке.

совершенный для Windows NT/2000

Этот кусок встроенного ассемблера короток и прост.

Код:
#include

int main(int argc, char *argv[])
{
  char buf[MAX_PATH];
  HMODULE module;

  module = GetModuleHandle(0);
  GetModuleFileName(module, buf, MAX_PATH);
  CloseHandle((HANDLE)4);

  __asm
  {
    lea eax, buf
    push 0
    push 0
    push eax
    push ExitProcess
    push module
    push DeleteFile
    push UnmapViewOfFile
  ret
  }

  return 0;
}
Этот код работает только под Windows NT, но зато как работает! Как только вы компилируете и выполняете программу она исчезает с диска. Примечание: код работает под Windows NT/2000, но не работает под Windows XP и .NET Server.

совершенный для Windows 9x/ME

Код:
int main(int argc, char *argv[])
{
  char buf[MAX_PATH];
vHMODULE module;

  module = GetModuleHandle(0);
  GetModuleFileName(module, buf, MAX_PATH);

  __asm
  {
    lea eax, buf
    push 0
    push 0
    push eax
    push ExitProcess
    push module
    push DeleteFile
    push FreeLibrary
    ret
  }

  return 0;
}

совершенный, комбинированный для Windows NT и Windows 9x


Код:
void DeleteMyself()
{
  char buf[MAX_PATH];
  HMODULE module;
  DWORD fnFreeOrUnmap;

  module = GetModuleHandle(0);
  GetModuleFileName(module, buf, MAX_PATH);

  // Check for Win9x Kernel
  if(0x80000000 & GetVersion())
  {
    fnFreeOrUnmap = FreeLibrary;
  }
  // do for WinNT kernel
  else
  {
    fnFreeOrUnmap = UnmapViewOfFile;
    CloseHandle((HANDLE)4);
  }

  __asm
  {
    lea eax, buf
    push 0
    push 0
    push eax
    push ExitProcess
    push module
    push DeleteFile
    push fnFreeOrUnmap
    ret
  }
}
ЗЫ
Возможно кому-нидь пригодится, хочется увидеть и другие варианты и способы =)
Думаю тема не помешает в разделе, если в нее собирать различные способы...

Последний раз редактировалось [53x]Shadow; 01.07.2007 в 16:10..
 
Ответить с цитированием

  #2  
Старый 01.07.2007, 17:24
KEZ
Banned
Регистрация: 18.05.2005
Сообщений: 1,981
Провел на форуме:
1941233

Репутация: 2726


По умолчанию

не очень круто. потому что это всем известные методы, и я не думаю что их придумал ты.
вот почему-то метода удаления через Com нету.

Great: Он и не писал, что сам придумал =) Но то, что собрал в одном месте - по-любому, неплохо.

Последний раз редактировалось _Great_; 01.07.2007 в 17:28..
 
Ответить с цитированием

  #3  
Старый 01.07.2007, 17:31
AHTOLLlKA
Участник форума
Регистрация: 01.02.2005
Сообщений: 233
Провел на форуме:
748321

Репутация: 112
Отправить сообщение для AHTOLLlKA с помощью ICQ
По умолчанию

тоже интересна эта тема..
меня всегда интересовало то..
если по расшарить например папку с калькулятором.. зайти по сети.. запустить..
а потом расшареную папку закрыть и снести..
файл получаеться только в памяти будет =\
 
Ответить с цитированием

  #4  
Старый 01.07.2007, 17:40
ZaCo
Banned
Регистрация: 20.06.2005
Сообщений: 880
Провел на форуме:
4610226

Репутация: 1332


По умолчанию

>>файл получаеться только в памяти будет =\

ну это ясно. вообще невозможность удаления стандартным способом можно объяснить имхо только политикой безопасности винды, другого повода я просто не вижу. учитывая то, что запущенный выполняемый файл можно, например, спокойно переименовать...
 
Ответить с цитированием

  #5  
Старый 01.07.2007, 17:43
AHTOLLlKA
Участник форума
Регистрация: 01.02.2005
Сообщений: 233
Провел на форуме:
748321

Репутация: 112
Отправить сообщение для AHTOLLlKA с помощью ICQ
По умолчанию

да, переименовать то можно..
а можно при запуске быстро расшаривать папку запускаться от туда, и потом сносить ее ))вот... жжесть =\\
меня наверно с этой херни прет..
http://forum.antichat.ru/thread43416.html
 
Ответить с цитированием

  #6  
Старый 01.07.2007, 18:46
Ky3bMu4
Постоянный
Регистрация: 03.02.2007
Сообщений: 520
Провел на форуме:
1777536

Репутация: 932


Отправить сообщение для Ky3bMu4 с помощью ICQ
По умолчанию

Код:
char szPath[256] ;
GetModuleFileName(NULL, szPath, sizeof(szPath));
SHFILEOPSTRUCT sh;
sh.hwnd   = GetSafeHwnd();
sh.wFunc  = FO_DELETE;
sh.pFrom  =szPath;
sh.pTo    = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation (&sh);
Вынесет наш .ехе и даже не поперхнётся.
 
Ответить с цитированием

  #7  
Старый 01.07.2007, 18:57
slider
Members of Antichat - Level 5
Регистрация: 04.09.2005
Сообщений: 528
Провел на форуме:
6520559

Репутация: 2947


По умолчанию

...
Цитата:
#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();
}
С КрякЛаба...
 
Ответить с цитированием

  #8  
Старый 01.07.2007, 19:23
AHTOLLlKA
Участник форума
Регистрация: 01.02.2005
Сообщений: 233
Провел на форуме:
748321

Репутация: 112
Отправить сообщение для AHTOLLlKA с помощью ICQ
По умолчанию

Цитата:
Сообщение от Ky3bMu4  
Код:
char szPath[256] ;
GetModuleFileName(NULL, szPath, sizeof(szPath));
SHFILEOPSTRUCT sh;
sh.hwnd   = GetSafeHwnd();
sh.wFunc  = FO_DELETE;
sh.pFrom  =szPath;
sh.pTo    = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation (&sh);
Вынесет наш .ехе и даже не поперхнётся.
procedure DeleteFiles(Source: string);
var
FO: TShFileOpStruct;
begin
FillChar(FO,SizeOf(FO),#0);
FO.Wnd := Form1.Handle;
FO.wFunc := FO_DELETE;
FO.pFrom := PChar(Source);
FO.pTo := 0;
FO.fFlags := FOF_NOCONFIRMATION or FOF_SILENT;
FO.hNameMappings :=0;
FO.lpszProgressTitle :=0;
ShFileOperation(FO);
end;

не сносит.. грит что файл юзаеться виндой =\
 
Ответить с цитированием

  #9  
Старый 01.07.2007, 19:25
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
Сообщение от Ky3bMu4  
Код:
char szPath[256] ;
GetModuleFileName(NULL, szPath, sizeof(szPath));
SHFILEOPSTRUCT sh;
sh.hwnd   = GetSafeHwnd();
sh.wFunc  = FO_DELETE;
sh.pFrom  =szPath;
sh.pTo    = NULL;
sh.fFlags = FOF_NOCONFIRMATION | FOF_SILENT;
sh.hNameMappings = 0;
sh.lpszProgressTitle = NULL;

SHFileOperation (&sh);
Вынесет наш .ехе и даже не поперхнётся.
Уверен?
 
Ответить с цитированием

  #10  
Старый 01.07.2007, 21:17
Pochka
Познающий
Регистрация: 26.11.2005
Сообщений: 32
Провел на форуме:
47872

Репутация: 20
По умолчанию

Цитата:
Сообщение от ZaCo  
>>файл получаеться только в памяти будет =\

ну это ясно. вообще невозможность удаления стандартным способом можно объяснить имхо только политикой безопасности винды, другого повода я просто не вижу. учитывая то, что запущенный выполняемый файл можно, например, спокойно переименовать...
А как ты объяснишь работу Windows, когда в нее подгружено программ больше, чем это позволяет себе оперативная память?
Есть такое понятие, как динамическое распределение памяти
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ