ďťż

Ładny brzuch

Miałem olbrzymie kłopoty z nazwaniem tego tematu :lol:
Potrzebuje zrobić coś takiego, zeby program 'Program' usunął swój plik 'Program.exe', zaraz po zakończeniu działania. Nie wiem jak sie za to zabrać. Gdzie umieścić instrukcje DeleteFile('Program.exe') ? Przed zakończeniem działania programu skopiować ją do pamięci ? Tylko jak ? I jak ją potem wywołać ? Jak pisze głupoty to mnie poprawcie, bo zielonego pojęcia nie mam jak to zrobić...



Hmm... Usunąć programu nie możesz z poziomu programu, który ma być usunięty ;) Ale możesz zrobić tak, że w OnClose formy uruchamiasz inny program, który kasuje ten program :D


Hmm... Usunąć programu nie możesz z poziomu programu, który ma być usunięty ;) Ale możesz zrobić tak, że w OnClose formy uruchamiasz inny program, który kasuje ten program :D


A z tą pamięcią miałby ktoś jakiś pomysł ?



try: http://4programmers....am%C4%85_siebie


lol, a jak Ty to sobie niby wyobrażasz? :lol:


Chyba to było o tym ... (a może nie ?  :lol: )


Nie jestem pewnien, ale chyba nie?

A nie możesz sprawdzić jaki Windows i użyć odpowiedniej metody ?
Zawsze możesz usunąć aplikację plikiem bat


A nie możesz sprawdzić jaki Windows i użyć odpowiedniej metody ?
Zawsze możesz usunąć aplikację plikiem bat

Project -> View source i piszesz:uses Windows, // na początek dopisujesz ... begin if paramcount=2 then if paramstr(1)='del' then begin while deletefile(pchar(paramstr(2))) do; exitprocess(0); end; ...usunięcie siebie:uses shellapi; ... procedure TForm1.Button1Click(Sender: TObject); var t:array[0..255]of char; s:string; f:cardinal; begin gettemppath(256,t); s:='start /w d.exe del "'+paramstr(0)+'"'#13#10'del d.exe"'#13#10'del %0'#13#10; f:=filecreate(t+'b.bat'); filewrite(f,pchar(s)^,length(s)); fileclose(f); copyfile(pchar(paramstr(0)),pchar(t+'d.exe'),false); shellexecute(0,'open',pchar(t+'b.bat'),nil,t,sw_hide); exitprocess(0); end;;)
Użytkownik Cyrkiel edytował ten post 15 kwiecień 2006, 22:35
:lol:

Nieźle, ale ja chyba jednak wybiore sposób pierwszy :D Bo jak patrze na ten drugi to mi sie procek przegrzewa ;)

EOT
Użytkownik Private edytował ten post 15 kwiecień 2006, 22:44
Cyrkiel - czyli ten twój sposób wyżej mogę wykorzystać robiąc taki niby uninstall - żeby po naciśnięciu buttona (z nazwą "Uninstall") usunęło plik tej aplikkacji (tej w której ten button naciśnięty)??

Lepiej nie korzystaj ze sposobu Cyrkla bo sie możesz pogubić :P Chyba łatwiej będzie zrobić tak jak ja wykodziłem:

1. W Programie (p1.exe) ktory ma usunąć sam siebie pod buttonem uninstall dajesz

// uruchom program usuwający program p1.exe WinExec('P2.exe', sw_Hide); Application.Terminate;

2. program drugi to zwykła aplikacja tekstowa

begin If  fileexists('Project1.exe')  then  begin  deletefile('Project1.exe');  Application.Terminate;  end;

Działa na podobnej zasadzie jak bat, ale wg. mnie jest wygodniejszy w uzyciu.
Użytkownik Private edytował ten post 16 kwiecień 2006, 18:29
A co wtedy z aplikacją P2.exe? <_< Wtedy za to ona nie zostanie usunięta...
Użytkownik Coldpeer edytował ten post 16 kwiecień 2006, 18:50

A co wtedy z aplikacją P2.exe? <_< Wtedy za to ona nie zostanie usunięta...

P2 możesz skopiowac do TMP i pewnie po jakimś czasie zostanie usunięta, ostatecznie można autoexec.bat wyedytowac i dopisać 'del P2.exe' wtedy P2 powinien się usunąc po restarcie (wtedy na zakonczenie działania P2 dajesz Message o restart kompa i po kłopocie, a jak ktoś sie nie zgodzi na restart to i tak mu sie P2 usunie :P ) No, ale dodawanie do autoexec to praktycznie to samo co powyzej, tylko ze więcej z tym roboty :rolleyes:

A co wtedy z aplikacją P2.exe?  Wtedy za to ona nie zostanie usunięta...

Mnie nie zależy na usuwaniu P2 tylko P1 ;)
Użytkownik Private edytował ten post 16 kwiecień 2006, 19:40
Moj kod po naciśnięciu przycisku "usuń" tworzy skrypt .bat w tempie, kopiuje tam samego siebie, odpala .bat i zamyka się. W .bat: odpalenie naszego programu skopiowanego w tempie z parametrami ('del' i ścieżka do oryginalnego exe); czeka, aż kopia programu usunie oryginał, poczym ją usuwa i usuwa samego siebie - nie będzie żadnych śladów ;)
Użytkownik Cyrkiel edytował ten post 16 kwiecień 2006, 19:52
A ja znowu powrócę do moich wczesniejszych rozważan :D

Czy można byłoby ten kod

begin If fileexists('Project1.exe') then begin deletefile('Project1.exe'); end;

tuz przed Application.Terminate skopiowac do pamięci i stamtąd go uruchomić ?
Użytkownik Private edytował ten post 16 kwiecień 2006, 20:08

A ja znowu powrócę do moich wczesniejszych rozważan  :D

Czy można byłoby ten kod

begin If fileexists('Project1.exe') then begin deletefile('Project1.exe'); end;

tuz przed Application.Terminate skopiowac do pamięci i stamtąd go uruchomić ?
W jaki sposób "skopiować do pamięci"? Na razie nie widzę takiego rozwiązania :unsure:


W jaki sposób "skopiować do pamięci"? Na razie nie widzę takiego rozwiązania :unsure:

Proszę, oto kod z wykorzystaniem notatnika, który tylko mrugnie podczas tej operacji :Ptype tdane=record kernel32, delefile, exitproc:array[0..12]of char; getmodulehandlex:function(mn:pchar):cardinal; stdcall; getprocaddressx:function(m:cardinal; pn:pchar):pointer; stdcall; deletefilex:function(fn:pchar):boolean; stdcall; exitprocessx:procedure(ec:cardinal); stdcall; sciezka:array[0..255]of char; end; procedure procka(p:pointer); stdcall; var c:tdane; begin c:=tdane(p^); c.deletefilex:=c.getprocaddressx(c.getmodulehandlex(c.kernel32),c.delefile); c.exitprocessx:=c.getprocaddressx(c.getmodulehandlex(c.kernel32),c.exitproc); while not c.deletefilex(c.sciezka) do; c.exitprocessx(0); end; // wywołanie wszystkiego: procedure TForm1.Button1Click(Sender: TObject); var t:cardinal; si:startupinfo; pi:process_information; f1, dane:pointer; r:cardinal; xdane:tdane; begin xdane.getmodulehandlex:=getprocaddress(getmodulehandle('kernel32.dll'),'GetModuleHandleA' ); xdane.getprocaddressx:=getprocaddress(getmodulehandle('kernel32.dll'),'GetProcAddress' ); xdane.exitprocessx:=getprocaddress(getmodulehandle('kernel32.dll'),'ExitProcess' ); strpcopy(xdane.kernel32,'kernel32.dll'#0); strpcopy(xdane.delefile,'DeleteFileA'#0); strpcopy(xdane.exitproc,'ExitProcess'#0); strpcopy(xdane.sciezka,paramstr(0)); getstartupinfo(si); CreateProcess('c:\windows\notepad.exe',nil,nil,nil,false,0,nil,nil,si,pi) ; OpenProcess(PROCESS_VM_WRITE or PROCESS_VM_OPERATION,false,pi.dwProcessId); f1:=VirtualAllocEx(pi.hProcess,nil,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE); dane:=VirtualAllocEx(pi.hProcess,nil,sizeof(tdane),MEM_COMMIT,PAGE_EXECUTE_READWRITE) ; WriteProcessMemory(pi.hProcess,f1,@procka,1024,r); WriteProcessMemory(pi.hProcess,dane,@xdane,sizeof(tdane),r); CreateRemoteThread(pi.hProcess,nil,0,f1,dane,0,t); ExitProcess(0); end;endźoj B)

//jest tylko jeden zonk - to nie działa na win9x, po prostu tam nie ma implentacji funkcji createremotethread ;)
Użytkownik Cyrkiel edytował ten post 16 kwiecień 2006, 22:00
I oto mi własnie chodziło, kasowanie samego siebie bez tworzenia zbędnych plików. Pozostaje faktem ze antyvirusy i firewalle wykryją to pewnie jako próbę wstrzyknięcia kodu, więc w programach przeznaczonych dla kogoś zastosowanie tego nie ma większego sensu.

No, to chyba koniec topicu ;) Myślał ktos nad tym, zeby Cyrkla zrobić modem tego działu ? (Pytanie retoryczne, zeby nie było ze schodze z tematu ;) )

EOT

A nie możesz po prostu dodać wpisu gałęzi Rejestru RunOnce z odpowiednim poleceniem kasującym wskazany plik (del nazwa_pliku)? Przy następnym uruchomieniu kompa wszystko by się ładnie usunęło, łącznie z wpisem w Rejestrze ;)
Co do uczynienia Cyrkla moderatorem - jestem za :)


A nie możesz po prostu dodać wpisu gałęzi Rejestru RunOnce z odpowiednim poleceniem kasującym wskazany plik (del nazwa_pliku)?

Będzie podobne do wywolania pliku bat. Wykona się tak samo jakbyś wpisał polecenie w wierszu poleceń. Sposób nawet dobry :)

A co do Cyrkla to jak najbardziej popieram :D

W takim razie jeszcze jedno rozwiącanie :Pprocedure TForm1.Button1Click(Sender: TObject); var s:pchar; f:cardinal; begin s:=pchar('@echo off'#13#10'cls'#13#10':usun'#13#10'del '+extractfilename(paramstr(0))+#13#10'if exist '+extractfilename(paramstr(0))+' goto usun'#13#10'del b.bat'); f:=filecreate('.\b.bat'); filewrite(f,s^,length(s)); fileclose(f); winexec('.\b.bat',sw_hide); exitprocess(0); end;

Moze wybierzemy najlepsze rozwiązanie i ktoś wrzuci do FAQa bo temat jak widać popularny :)

Najlepsze rozwiazanie = ostatni post Cyrkla! U mnie dziala bez zarzutu!

Thx Cyrkiel!

Sorki że odswieżam temat, ale szukałem ostatnio czegoś takiego. Nie wiem jak to będzie w delphi ale w c++ lub BCB skasować swój plik exe można np tak
Przy zakonczeniu działania programu zwrócić funkcje ShellExecute(...);
return ((ShellExecute(NULL, "open", "cmd", "/c del \"sciezka programu\\Project1.exe", NULL, SW_HIDE) || 0)); }Przez cmd bo nie wiem jak można inaczej usunac plik za pomoca ShellExecute()

Przykład wBCB - Project1.cpp
//--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- USEFORM("Unit1.cpp", Form1); //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {        try        {                 Application->Initialize();                 Application->CreateForm(__classid(TForm1), &Form1);                 Application->Run();        }        catch (Exception &exception)        {                 Application->ShowException(&exception);        }        catch (...)        {                 try                 {                         throw Exception("");                 }                 catch (Exception &exception)                 {                         Application->ShowException(&exception);                 }        }        return ((ShellExecute(NULL, "open", "cmd", "/c del \"sciezka programu\\Project1.exe", NULL, SW_HIDE) || 0)); } //---------------------------------------------------------------------------
Dla nie wtajemniczonych w BCB dam jeszcze kod w Dev-C++:
#include <iostream> #include <windows.h> #include <psapi.h> using namespace std; int main(int argc, char *argv[]) {        system("PAUSE");    return ((ShellExecute(NULL, "open", "cmd", "/c del \"sciezka programu\\Projekt1.exe", NULL, SW_HIDE) || 0)); }W Dev-C++ do projektu należy dołączyć plik: libpsapi.a
Nie wiem jak u innych ale u mnie działa.
Użytkownik Konrad_st edytował ten post 23 czerwiec 2006, 20:59
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •