Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.21;
Скачать: CL | DM;

Вниз

Удалить файл выполняющейся программы   Найти похожие ветки 

 
Pk   (2003-04-08 14:55) [0]

из этой же программы. То есть программа Project1.exe выполнившись должна удалить саму себя. Через DeleteFile не получается.


 
Diamond Cat ©   (2003-04-08 15:34) [1]

не раз обсуждалось. на прямую сделать это под виндами не возможно


 
MC TOL ©   (2003-04-08 16:09) [2]

>Diamond Cat © (08.04.03 15:34)

Зря Вы так... Хотя, может, в слове "напрямую" какой-то смысл, мне не ясный...
А если попробовать так? (см. ниже)

procedure DeleteSelf;
var hModule:THandle;
szModuleName:array[0..MAX_PATH] of char;
hKrnl32 : THandle;
pExitProcess, pDeleteFile, pFreeLibrary,pUnmapViewOfFile : pointer;
ExitCode:UINT;
begin
hModule:= GetModuleHandle(nil);

GetModuleFileName(hModule, szModuleName, sizeof(szModuleName));


hKrnl32 := GetModuleHandle ( "kernel32" );
pExitProcess := GetProcAddress ( hKrnl32, "ExitProcess" );
pDeleteFile := GetProcAddress ( hKrnl32, "DeleteFileA" );
pFreeLibrary := GetProcAddress ( hKrnl32, "FreeLibrary" );
pUnmapViewOfFile := GetProcAddress ( hKrnl32, "UnmapViewOfFile" );

ExitCode := system.ExitCode;

if($80000000 and GetVersion())<>0 then
// Win95, 98, Me
asm

lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pFreeLibrary
ret
end
else
begin
CloseHandle(THANDLE(4));

asm
lea eax, szModuleName
push ExitCode
push 0
push eax
push pExitProcess
push hModule
push pDeleteFile
push pUnmapViewOfFile
ret
end
end
end;



 
MityaP ©   (2003-04-08 16:50) [3]

Взято из справки Озерова:
Работает под Windows 9x, но под NT не работает
(проверял лично)

var
Filename:String;
aTempBuf:array[0..MAX_PATH] of char;
bat_file:String;
f:TextFile;
si:TStartUpInfo;
pi:TProcessInformation;
begin
FileName:=Application.ExeName;
if GetShortPathName(PChar(FileName),aTempBuf,Sizeof(aTempBuf)-1)>0 then
FileName:=StrPAs(aTempBuf);

GetEnvironmentVariable("TEMP",aTempBuf,MAX_PATH);
bat_file:=StrPas(aTempBuf)+"\"+"delself.bat";
if GetShortPathName(PChar(bat_file),aTempBuf,Sizeof(aTempBuf)-1)>0 then
bat_file:=StrPAs(aTempBuf);

AssignFile(f,bat_file);
rewrite(f);
Writeln(f,"@echo off");
Writeln(f,":try");
Writeln(f,"del "+FileName);
Write(f,"if exist "+FileName);
Writeln(f," goto try");
Write(f,"del "+ bat_file);
CloseFile(f);
Memo1.Lines.LoadFromFile(bat_file);

ZeroMemory(@si,sizeof(si));
si.cb:=sizeof(si);
si.wShowWindow:=SW_HIDE;
si.dwFlags:=STARTF_USESHOWWINDOW;
CreateProcess(nil,PChar(bat_file),nil,nil,False,IDLE_PRIORITY_CLASS or DETACHED_PROCESS,
nil,nil,si,pi);
end;


 
MityaP ©   (2003-04-08 16:51) [4]

Дополнение [MityaP © (08.04.03 16:50)]:
// проверено и работает для WIN 9x. Не работает в WinNT

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



 
MityaP ©   (2003-04-08 16:53) [5]

в RSDN видел еще пример - в NT тоже удаляет...



Страницы: 1 вся ветка

Текущий архив: 2003.04.21;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.019 c
4-67638
Afonya
2003-02-24 13:38
2003.04.21
Проблема при принудительном завершении потока


3-67161
Proxvost
2003-04-03 12:06
2003.04.21
Adotable + DbGridEh


14-67545
CAMOBAP
2003-04-04 16:01
2003.04.21
i


1-67354
Ace
2003-04-09 22:38
2003.04.21
Помогите новечку разобратся с глючным циклом for.to.do


3-67138
Sirus
2003-04-03 09:37
2003.04.21
Interbase 6 Диалект 3 не получаются запросы???