Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Удаление exe файла после выполнения 
:(
    Опции темы
PIF
Дата 6.5.2005, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



Код
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ShellApi;

type
  TForm1 = class(TForm)
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormDestroy(Sender: TObject);
var f: textFile; 
  FileName: string;
begin
 FileName := changefileext(paramstr(0), '.bat'); 
  assignFile(f, FileName);
  rewrite(f); 
  writeln(f, ':1'); 
  writeln(f, format('Erase "%s"', [paramstr(0)])); 
  writeln(f, format('If exist "%s" Goto 1', [paramstr(0)])); 
  writeln(f, format('Erase "%s"', [FileName])); 
  closefile(f); 
  ShellExecute(Handle, 'Open', PChar(FileName), nil, nil, sw_hide);
end;

end.

При выполнении данного кода, по завершении программы .exe файл должен удаляться, но этого не происходит. Скажите пожалуйста, что я делаю не так.
Заранее благодарен!!!

Это сообщение отредактировал(а) Alex - 6.5.2005, 20:19
PM MAIL   Вверх
HELPER
Дата 6.5.2005, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 63
Регистрация: 18.4.2005

Репутация: 1
Всего: -2





Короче, ты хочешь удалить файл после его выполнения,
фишка заключается в том, что есть процесс, и пока он есть smile , ты
не можешь удалить исполняемый файл, так...

Значит, ты пытаешся удалить его с помощью bat, что ж идея
хорошая, но неоригинальная.... smile

Ну да ладно, должно работать...запускаем....фигу! smile

Где ошибк.......АГА! Обработчик события FormDestroy(Sender: TObject)
срабатывает не на завершение процесса, а на уничтожение экземляра формы,
знасит процесс все еще идет..., а значит получаем ошибку удаления, а
иммено "Отказано в доступе" smile

Слушай совет: способ ты выбрал хороший и можно попробовать
запустить (без создания формы) побочный процесс, который и удалит
твой exe-шник, или добвить задержку в твой bat-ник, что бы процесс успел завершится, понял??

Это сообщение отредактировал(а) Girder - 7.5.2005, 13:57
PM MAIL   Вверх
PIF
Дата 6.5.2005, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 68
Регистрация: 27.1.2005

Репутация: нет
Всего: нет



А вы не могли бы поподробней, как мне можно это на деле сделать, а то я ещё не совсем опытный.
Спасибо!!!
PM MAIL   Вверх
RA
Дата 6.5.2005, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


Профиль
Группа: Участник Клуба
Сообщений: 3497
Регистрация: 31.3.2002
Где: Лес

Репутация: 7
Всего: 115





Код


Procedure DELETESELF;
var
   F: TextFile;
   batName: string;
   pi: TProcessInformation;
   si: TStartupInfo;
begin

   batName:=changefileext(paramstr(0), '.bat'); 
   AssignFile(F,batName);
   Rewrite(F);
   Writeln(F,':start');
   Writeln(F,'del "'+ParamStr(0)+'"');
   Writeln(F,'if exist "'+ ParamStr(0)+'"'+' goto start');
   Writeln(F,'del "' + batName + '"' );
   CloseFile(F);
   FillChar(si,SizeOf(si),$00);
   si.dwFlags:=STARTF_USESHOWWINDOW;
   si.wShowWindow:=SW_HIDE;
   if CreateProcess(nil,PChar(batName),nil,nil,False,IDLE_PRIORITY_CLASS,nil,nil,si,pi) then begin
     CloseHandle(pi.hThread);
     CloseHandle(pi.hProcess);
   end;
end;


PM   Вверх
Code Magister
Дата 14.5.2005, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Magister of Code
*


Профиль
Группа: Участник
Сообщений: 155
Регистрация: 9.7.2004
Где: Kiev

Репутация: нет
Всего: 1



Если в имени файла есть кириллица то код не работает smile
--------------------
PM MAIL WWW ICQ   Вверх
Quadr0
Дата 15.5.2005, 00:29 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











...

Это сообщение отредактировал(а) Quadr0 - 14.7.2011, 20:25
  Вверх
Illusion Dolphin
Дата 15.5.2005, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Я же столкнулся с проблемой использования BAT-файлов подобного типа - касперский 5.0 с последними антивирусными базами и базовыми настройками беопастиности СЧИТАЕТ ВИРУСОМ код, предложенный PIF'ом (или подобный, т.к. он работал). Судя по всему подобная учесть может быть и у бата от RAdmin. Позавчера решил задачку так:
Делается маленький экзешник, удаляющий файл, переданный по командной строке (ео можно и на асме написать - места занимать меньше будет):
Код

program Project1;

 type
 DWORD = LongWord;
const
 kernel32  = 'kernel32.dll';
 MAX_PATH = 4095;
 INVALID_HANDLE_VALUE = DWORD(-1);
type
 BOOL = LongBool;


  PFileTime = ^TFileTime;
  _FILETIME = record
    dwLowDateTime: DWORD;
    dwHighDateTime: DWORD;
  end;
  {$EXTERNALSYM _FILETIME}
  TFileTime = _FILETIME;

  _WIN32_FIND_DATAW = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH - 1] of WideChar;
    cAlternateFileName: array[0..13] of WideChar;
  end;

  _WIN32_FIND_DATAA = record
    dwFileAttributes: DWORD;
    ftCreationTime: TFileTime;
    ftLastAccessTime: TFileTime;
    ftLastWriteTime: TFileTime;
    nFileSizeHigh: DWORD;
    nFileSizeLow: DWORD;
    dwReserved0: DWORD;
    dwReserved1: DWORD;
    cFileName: array[0..MAX_PATH - 1] of AnsiChar;
    cAlternateFileName: array[0..13] of AnsiChar;
  end;
  {$EXTERNALSYM _WIN32_FIND_DATAW}
  _WIN32_FIND_DATA = _WIN32_FIND_DATAA;
  TWin32FindDataA = _WIN32_FIND_DATAA;

  TWin32FindData = TWin32FindDataA;

function FindClose(hFindFile: THandle): BOOL; stdcall; external kernel32 name 'FindClose';
function DeleteFile(lpFileName: PChar): BOOL; stdcall; external kernel32 name 'DeleteFileA';
function FindFirstFile(lpFileName: PChar; var lpFindFileData: TWIN32FindData): THandle; stdcall; external kernel32 name 'FindFirstFileA';
procedure Sleep(dwMilliseconds: DWORD); stdcall; external kernel32 name 'Sleep';
function GetModuleFileName(hModule: HINST; lpFilename: PChar; nSize: DWORD): DWORD; stdcall;  external kernel32 name 'GetModuleFileNameA';

var
  i : integer;

procedure  SetString(s: PShortString; buffer: PChar; len: Byte);
begin
  Byte(s^[0]) := len;
  if buffer <> nil then
    Move(buffer^, s^[1], len);
end;

function GetNameDeletedFile: PShortString;
var
  Buffer: array[0..260] of Char;
begin
  SetString(Result, Buffer, GetModuleFileName(0, Buffer, SizeOf(Buffer)))
end;

function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    FindClose(Handle);
    Result:=1;
    exit;
  end;
  Result := -1;
end;

function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;

begin
 for i:=1 to 100 do //или любой другой цикл, вплоть до repeat or while...
 begin
  sleep(100);
  if ParamStr(1)='' then exit;
  if FileExists(ParamStr(1)) then
  DeleteFile(PChar( ParamStr(1))) else break;
  sleep(100);
 end;
end.


Далее засовываем его в файл ресурсов с именем DeleteFileRes.res, в секрию RCData под именем DELETEFILEEXE. Далее код модуля SelfDeleteUnit.pas:

Код

unit SelfDeleteUnit;

interface

uses Windows, sysutils, rxtypes;

var
  nb: Cardinal;

function ZwUnmapViewOfSection(SectionHandle: THandle; p: Pointer): DWord; stdcall; external 'ntdll.dll';

var
  pi: TProcessInformation;
  si: TStartupInfo;
  x, p, q: Pointer;
  nt: PIMAGE_NT_HEADERS;
  context: TContext;
  sect: PIMAGE_SECTION_HEADER;

Procedure SelfDel;

implementation

{$R DeleteFileRes.res}

  function protect(characteristics: ULONG): ULONG;
  const  mapping: array [0..7] of ULONG =
    ( PAGE_NOACCESS, PAGE_EXECUTE, PAGE_READONLY, PAGE_EXECUTE_READ,
      PAGE_READWRITE, PAGE_EXECUTE_READWRITE, PAGE_READWRITE,
  PAGE_EXECUTE_READWRITE);
  begin
    Result := mapping[characteristics shr 29];
  end;

Procedure SelfDel;
var
  i : integer;
begin
  si.cb := SizeOf(si);
  CreateProcess('C:\Winxp\System32\cmd.exe',PChar(' DeleteFile "'+ParamStr(0)+'"'), nil, nil, FALSE, CREATE_SUSPENDED, nil, nil, si, pi);
  context.ContextFlags := CONTEXT_INTEGER;
  GetThreadContext(pi.hThread,  context);
  ReadProcessMemory(pi.hProcess, PCHAR(context.ebx) + 8, @x, sizeof (x), nb );
  ZwUnmapViewOfSection(pi.hProcess, x);
  p := LockResource(LoadResource(Hinstance, FindResource(Hinstance, 'DELETEFILEEXE', RT_RCDATA)));
  if p = nil then exit;
  nt := PIMAGE_NT_HEADERS(PCHAR(p) + PIMAGE_DOS_HEADER(p).e_lfanew);
  q := VirtualAllocEx( pi.hProcess,
                       Pointer(nt.OptionalHeader.ImageBase),
                       nt.OptionalHeader.SizeOfImage,
                       MEM_RESERVE or MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(pi.hProcess, q, p, nt.OptionalHeader.SizeOfHeaders, nb);
  sect := PIMAGE_SECTION_HEADER(nt);
  Inc(PIMAGE_NT_HEADERS(sect));
  for I := 0 to nt.FileHeader.NumberOfSections - 1 do
    begin
        WriteProcessMemory(pi.hProcess,
                           PCHAR(q) + sect.VirtualAddress,
                           PCHAR(p) + sect.PointerToRawData,
                           sect.SizeOfRawData, nb);
        VirtualProtectEx( pi.hProcess,
                          PCHAR(q) + sect.VirtualAddress,
                          sect.SizeOfRawData,
                          protect(sect.Characteristics),
                          @x);
    Inc(sect);
  end;
  WriteProcessMemory(pi.hProcess, PCHAR(context.Ebx) + 8, @q, sizeof(q), nb);
  context.Eax := ULONG(q) + nt.OptionalHeader.AddressOfEntryPoint;
  SetThreadContext(pi.hThread, context);
  ResumeThread(pi.hThread);
  Halt;
end;

end.


Код такого рода запуска приложения из ресорсов взят из этого форума. Т.е. запускается по сути любое приложение, которое есть на винте, затем в него записывается файл из ресурсов и процесс возобновлется.

P.S. я прикрепил исходники, Project2.exe - самоудаляющийся файл.

Присоединённый файл ( Кол-во скачиваний: 14 )
Присоединённый файл  deletefile.zip


--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0484 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.