Toon posts:

[alg] .exe-file die zichzelf verwijdert

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hoe laat ik een programma zichzelf verwijderen? Uninstallers kunnen dat ook, maar hoe?

Ik heb al twee methoden gevonden maar die vind ik niet zo mooi:
1. Genereer vlak voor het einde van het programma een .bat-file en start die op. De .bat-file verwijdert de exe en zichzelf (een .bat kan dat namelijk wel)
2. Verwijder het programma als de gebruiker opnieuw opstart. (kan ergens met RunOnce in de registry)

Maar zoals gezegd vind ik dit dus niet echt alles. Weten jullie betere manieren?

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
Laat uw programma een systemcall uitvoeren die een commando uitvoert (del, rm, ...) die uw exe verwijderd.

https://fgheysels.github.io/


  • iNSaNe-oNe
  • Registratie: Augustus 2000
  • Laatst online: 15:53

iNSaNe-oNe

Ja, ik ben pluizig en blauw!

Op maandag 11 maart 2002 14:35 schreef whoami het volgende:
Laat uw programma een systemcall uitvoeren die een commando uitvoert (del, rm, ...) die uw exe verwijderd.
Hum, jamaar... :)

Als die file nog in use is, dan zegt het OS toch dat er een sharing violation is?

Correct me if I'm wrong... maar dat is wat ik ooit op school in een ver verleden heb geleerd. :)

... en oranje! :P


Verwijderd

Topicstarter
Op maandag 11 maart 2002 14:39 schreef iNSaNe-oNe het volgende:

[..]

Hum, jamaar... :)

Als die file nog in use is, dan zegt het OS toch dat er een sharing violation is?

Correct me if I'm wrong... maar dat is wat ik ooit op school in een ver verleden heb geleerd. :)
Inderdaad. Gewoon DeleteFile o.i.d doet het niet. Ik heb het ook geprobeerd met ShFileOperation (die toont ook zo'n mooie windows dialoog :) ) maar die gaf ook een error op de .exe (file in use ofzo)

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-05 06:47
Ik geloof dat de meeste installers zichzelf stiekum naar de Windows directory kopiëren en vervolgens een opdracht in \\HKEY_LOCAL_MACHINE\Software\Microsoft\CurrentVersion\RunOnce zetten om zich bij de volgende reboot te verwijderen.

Het is een beetje een bug in Windows dat je geen draaiende executables kan verwijderen. Ik zie het nut in ieder geval niet echt, want op het moment dat de executable data geladen is, heb je het bestand op de harde schijf alleen nog nodig voor het laden van resources en dat kan toch wel fout gaan.

  • Basszje
  • Registratie: Augustus 2000
  • Laatst online: 14:05

Basszje

Reisvaap!]

Heb je een programma eindelijk geschreven, verwijdert het zichzelf :?

Beware of listening to the imposter; you are undone if you once forget that the fruits of the earth belong to us all, and the earth itself to nobody.


Verwijderd

op NT kan je MoveFileEx gebruiken,de lpNewFileName op NULL zetten en de MOVEFILE_DELAY_UNTIL_REBOOT flag mee geven, op 9x well batchfile met loopje maken dat doorgaat tot de file weg is ofzo en die als laatste in je exe aftrappen.

Verwijderd

Topicstarter
Ik heb het volgende gevonden:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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;

Beetje hacken, maar het werkt inderdaad!

  • iNSaNe-oNe
  • Registratie: Augustus 2000
  • Laatst online: 15:53

iNSaNe-oNe

Ja, ik ben pluizig en blauw!

Op maandag 11 maart 2002 14:54 schreef Soultaker het volgende:
Het is een beetje een bug in Windows dat je geen draaiende executables kan verwijderen. Ik zie het nut in ieder geval niet echt, want op het moment dat de executable data geladen is, heb je het bestand op de harde schijf alleen nog nodig voor het laden van resources en dat kan toch wel fout gaan.
Sorry?! "Een bug in Windows dat je geen draaiende executables kan verwijderen"? :z

WEES BLIJ dat dat niet kan! :) Het is overig in elk OS zo dat dat niet kan. (Naam)wijzigen, verwijderen, het is niet mogelijk. Stel je voor dat JIJ in een file zit, en een collega haalt deze weg terwijl jij die aan het inlezen bent. Wordt je niet blij van. :+ En dat is slechts één voorbeeld waaruit blijkt dat het maar goed is dat het niet kan. :)

(overigens is deze post niet als personal flame bedoeld, maar ter info! :) )

... en oranje! :P


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 12-05 22:46

Janoz

Moderator Devschuur®

!litemod

Op maandag 11 maart 2002 15:11 schreef iNSaNe-oNe het volgende:

[..]

Sorry?! "Een bug in Windows dat je geen draaiende executables kan verwijderen"? :z

WEES BLIJ dat dat niet kan! :) Het is overig in elk OS zo dat dat niet kan. (Naam)wijzigen, verwijderen, het is niet mogelijk. Stel je voor dat JIJ in een file zit, en een collega haalt deze weg terwijl jij die aan het inlezen bent. Wordt je niet blij van. :+ En dat is slechts één voorbeeld waaruit blijkt dat het maar goed is dat het niet kan. :)

(overigens is deze post niet als personal flame bedoeld, maar ter info! :) )
In linux kun je wel executables die op dat moment draaien verwijderen :).. Er wordt dan echter wel een temp kopie van de executable gemaakt.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 13-05 06:47
Op maandag 11 maart 2002 15:11 schreef iNSaNe-oNe het volgende:
Sorry?! "Een bug in Windows dat je geen draaiende executables kan verwijderen"? :z
Ja, een bug, want in andere operating system kan het wel.
WEES BLIJ dat dat niet kan! :) Het is overig in elk OS zo dat dat niet kan. (Naam)wijzigen, verwijderen, het is niet mogelijk.
Dat is zeker wle mogelijk in andere operating systems. Het feit dat je een bestand niet kan verplaatsen/hernoemen als de filesystem node in gebruik is, is eigenlijk een andere bug, maar ook dat slaat nergens op.
Stel je voor dat JIJ in een file zit, en een collega haalt deze weg terwijl jij die aan het inlezen bent. Wordt je niet blij van. :+ En dat is slechts één voorbeeld waaruit blijkt dat het maar goed is dat het niet kan. :)
Dat is wat anders. Op een moment dat een executable draait, is het bestand al ingeladen. Het is dus nergens goed voor dat het bestand gelocked blijft. Daarbij ben ik het ook met jou voorbeeld niet eens; daarvoor hebben we file locking uitgevonden. In de meeste operating systems kan je dan ook gewoon bestanden verwijderen waar iemand anders mee bezig is.
(overigens is deze post niet als personal flame bedoeld, maar ter info! :) )
Geen probleem :)

  • iNSaNe-oNe
  • Registratie: Augustus 2000
  • Laatst online: 15:53

iNSaNe-oNe

Ja, ik ben pluizig en blauw!

Op maandag 11 maart 2002 15:26 schreef Soultaker het volgende:

[KNiP verhaal waar ongetwijfeld een kern van waarheid in zit :) ]

Daarbij ben ik het ook met jou voorbeeld niet eens; daarvoor hebben we file locking uitgevonden. In de meeste operating systems kan je dan ook gewoon bestanden verwijderen waar iemand anders mee bezig is.
En toch vind ik het persoonlijk geen veilig idee dat je bestanden kunt veranderen/deleten indien er nog één of meerdere users mee bezig zijn. Natuurlijk, file-locking wordt daarvoor gebruikt. Read-locks, Write locks, exclusive write locks, het kan allemaal. Maarrehm, ik kan mij situaties voorstellen waarin het weggooien van files die nog in use zijn zeeeeer onwenselijk zijn. Ik neem aan dat een OS alleen DIE files kan weggooien waarin users in read-modus de file geopend hebben? Het lijkt mij bijzonder schuin dat een file weggeflikkerd kan worden als een file door een user in write-modus is geopend... of zit ik er nu naast?

... en oranje! :P


  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
Op maandag 11 maart 2002 15:19 schreef Janoz het volgende:

[..]

In linux kun je wel executables die op dat moment draaien verwijderen :).. Er wordt dan echter wel een temp kopie van de executable gemaakt.
Volgens mij kan het in DOS ook. 'k Geloof zelfs dat ik dat al eens gedaan heb.

https://fgheysels.github.io/


Verwijderd

De meest nette oplossing lijkt mij om gebruik te maken van wininit.ini. Dit bestand moet in de Windows-directory komen. Je zet er bijvoorbeeld dit in:
code:
1
2
[rename]
c:\program files\myprograms\deleteme.exe=nul

Bij de volgende reboot wordt deze opdracht uitgevoerd en is je programma verdwenen.

  • Mark_Steverink
  • Registratie: November 2000
  • Laatst online: 20-12-2007
Op maandag 11 maart 2002 15:26 schreef Soultaker het volgende:

Ja, een bug, want in andere operating system kan het wel.
[..]
Nu kun je met evenveel recht beweren dat het een bug is in die andere OS-en, omdat het in Windows niet kan. Waarom noem je dit een bug, en niet een feature?

  • Ronald_stage
  • Registratie: Januari 2002
  • Laatst online: 12-05 07:13

Ronald_stage

wat kan je hier nog zeggen

Ooit schreef Iemand het volgende:
A bug is an undocumented feature
en volgens mij is dit wel een gedocumenteerde feature, dus geen bug.
Pagina: 1