Quarta-feira, Junho 01, 2005

Deletando o executável atual

Estava procurando uma maneira de deletar o executável atual, e uma maneira muito interessante de fazer isso é criar um arquivo batch que deleta o executável e se auto-deleta - os arquivos batch podem se auto deletar. Isto é feito da seguinte maneira:


var
Lista : TStringList;
begin
Lista := TStringList.Create;
try
Lista.Add('del "'+ParamStr(0)+'"');
Lista.Add('del delexec.bat');
Lista.SaveToFile('delexec.bat');
finally
Lista.Free;
end;
WinExec('delexec.bat',SW_HIDE);
close;
end;

Com isto, o programa ceia um batch que deleta o programa e se deleta, salva-o, executa-o e sai. O batch deleta ambos os arquivos.

2 Comentários:

At 5:21 PM, Leonel disse...

Acho que isso funciona também:

procedure DeleteSelf;
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;

(perdoe a formatação, não sei como indentar nesse comentário)

 
At 5:54 PM, Bruno disse...

Este código não funcionou aqui: o DeleteFile não deleta o arquivo em uso. Isso que você fez é equivalente a:

// Pega o Handle do programa
module := GetModuleHandle ( nil );
// Pega o nome do programa
GetModuleFileName (module, buf, sizeof ( buf ));
// Fecha saída de erro padrão
CloseHandle ( THandle ( 4 ) );
// Fecha o processo
ExitProcess(0);
// Deleta o arquivo
DeleteFile(Buf);

 

Postar um comentário

<< Home