Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken (https://www.delphipraxis.net/89932-movefile_delay_until_reboot-ins-loeschen-einklinken.html)

DGL-luke 8. Apr 2007 20:46


MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo,

wenn MoveFile mit dem Flag MOVEFILE_DELAY_UNTIL_REBOOT aufgerufen wird, werden die Dateien vorgemerkt und beim nächsten Systemstart verschoben/gelöscht.

Kann man sich in das Löschen irgendwie einklinken? Z.B. den Fortschritt anzeigen?

Sunlight7 9. Apr 2007 02:43

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Moin!

Ich glaub mal net das das geht :gruebel:
Aber Du kannst Dein Programm in den RunOnce Schlüssel eintragen und das gewünschte selber löschen.

Olli 9. Apr 2007 04:25

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von Sunlight7
Ich glaub mal net das das geht :gruebel:

Korrekt, zumindest wenn man die Funktion des Session-Managers (SM) benutzt (MOVEFILE_DELAY_UNTIL_REBOOT tut das).

Siehe auch Schlüsselname: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro l\Session Manager\FileRenameOperations

Zitat:

Zitat von Sunlight7
Aber Du kannst Dein Programm in den RunOnce Schlüssel eintragen und das gewünschte selber löschen.

Das würde ja am Ziel meilenweit vorbeigehen. Das Problem ist ja gerade, daß solche Löschungen stattfinden bevor Winlogon überhaupt startet. Damit hat man einen deutlichen Vorteil wenn es darum geht "benutzte" Dateien zu löschen. Ein gutes Beispiel sind bestimmte Spyware-DLLs welche gleichzeitig als Winlogon-Benachrichtigungspakete und BHOs laufen und sich gegenseitig beschützen. Wenn sowas clever implementiert ist, hat man keine Chance es zu löschen. Allerdings geht umbenennen üblicherweise (hilft aber auch nicht gegen clevere Implementationen).

Die Lösung wäre ein Programm zu schreiben welches bereits vom SM augerufen werden kann, sprich eines ohne Subsystem. Man nennt sowas auch native Programme. Kann nur davon abraten es in Delphi zu machen, aber prinzipiell ist auch das nicht vollkommen unmöglich. Mein DDKWizard ermöglicht es solche nativen Programme zu erstellen, dazu benötigt man ein DDK oder eben das WDK.

Achtung, wenn man außerhalb des Win32-Subsystems arbeitet, sind DLLs wie Kernel32, User32 usw. tabu. Außerdem gibt es nur einen einzigen Rootschlüssel in der Registry von dem aus alle anderen verzweigen, überhaupt ist die Registrystruktur ein wenig anders.

Mackhack 9. Apr 2007 05:06

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo Olli,

genau dass hab ich ja vor. DGL-Luke hat aber die Frage fuer mich gestellt gehabt.

Ich moechte eben wie das Spybot auch tut sofort nach dem Login von Windows bestimmte Dateien loeschen. Naemlich welche die von Spyware und Viren gesperrt sind in Windows.

Aber generell ist es doch mit MoveFileEx moeglich das ganze zu realisieren, nur eben kann ich mein Fenster nicht anzeigen lassen waehrend er Loescht sehe ich das richtig?

Aber wie macht es Spybot dann denn das ist auch in Delphi geschrieben!

Olli 9. Apr 2007 05:30

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von Mackhack
Ich moechte eben wie das Spybot auch tut sofort nach dem Login von Windows bestimmte Dateien loeschen. Naemlich welche die von Spyware und Viren gesperrt sind in Windows.

Das ist vermutlich über Userinit gelöst, siehe:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon

Wenn du das nach dem Einloggen machst, hat es allerdings nichts mehr mit dem besagten Flag (MOVEFILE_DELAY_UNTIL_REBOOT) zu tun! Das umbenennen (MoveFileEx) ist allerdings auch etwas was bei "benutzten Dateien" funktioniert. Daher handelt es sich unter Umständen auch um eine wirksame Waffe. Kannst du auch testen. Starte ein Programm und lasse es laufen, dann benenne die Programmdatei um. :zwinker:

Zitat:

Zitat von Mackhack
Aber generell ist es doch mit MoveFileEx moeglich das ganze zu realisieren, nur eben kann ich mein Fenster nicht anzeigen lassen waehrend er Loescht sehe ich das richtig?

Jupp. Gibt nur ein kleines Problemchen ... moderne Malware überwacht oft genau diesen Schlüssel und entfernt Änderungen welche du dort machst. Daher empfehle ich eher ein eigenes natives Programm zu schreiben welches eine ähnliche Funktionalität enthält wie sie MoveFileEx() anbietet.

Du kannst durchaus was anzeigen lassen von einem nativen Programm, nur eben beschränkt auf Text. Siehe bspw. bei geplanten Dateisystemchecks.

Zitat:

Zitat von Mackhack
Aber wie macht es Spybot dann denn das ist auch in Delphi geschrieben!

Dazu weiß ich offiziell nichts, kann aber gern Patrick fragen, ob er hier mal antwortet. Bei der GUI ist es vermutlich nur die Anzeige des Fortschritts der "Planung" (für das Löschen), eben mit jedem Aufruf von MoveFileEx(), hat aber mit der eigentlichen Löschung nichts zu tun. Die findet beim nächsten Neustart statt bevor du den Willkommensbildschirm siehst (oder den Login-Dialog, je nachdem).

Mackhack 9. Apr 2007 06:06

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo Olli,

das waere klasse wenn er sich mal hier darueber auslassen koennte.

Was den Bildschirm des eigentlichen Loeschvorgangs angeht in Spybot, so ist das ein Fenster das NACH dem logon erscheint und den Fortschritt des Scannens/Loeschens anzeigt.

Nicht das eigentliche Vorbereiten.

Olli 9. Apr 2007 06:14

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von Mackhack
das waere klasse wenn er sich mal hier darueber auslassen koennte.

Werde ihm eine Mail schreiben.

Zitat:

Zitat von Mackhack
Was den Bildschirm des eigentlichen Loeschvorgangs angeht in Spybot, so ist das ein Fenster das NACH dem logon erscheint und den Fortschritt des Scannens/Loeschens anzeigt.

Wie gesagt. Probier mal Userinit zu modifizieren (nach dem Komma den Pfad deines Programms rein). Wenn ich mich recht entsinne, startet damit dein Programm vor der eigentlichen Shell und ist damit exklusiver Besitzer aller Ressourcen bis es beendet wird.

Mackhack 9. Apr 2007 06:19

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
[quote="Olli"Wie gesagt. Probier mal Userinit zu modifizieren (nach dem Komma den Pfad deines Programms rein). Wenn ich mich recht entsinne, startet damit dein Programm vor der eigentlichen Shell und ist damit exklusiver Besitzer aller Ressourcen bis es beendet wird.[/quote]

Kannst du mal hier posten mit einer Dummy.exe wie das ganze aussehen soll? Ich weis noch nicht so recht wie du das meinst!

Und was meinst du mit Native Programme?

Olli 11. Apr 2007 02:01

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Habe ihm gemailt.

Native Programme sind solche die kein Subsystem haben - eben nativ laufen. Sie haben als einzige Abhängigkeit NTDLL.DLL und bestimmte Flags im PE-Header gesetzt. Wenn man Delphi benutzen will wird eine Nachbehandlung der EXE nötig und man muß auf die komplette RTL verzichten. Im Grunde ist das noch einen Zahn schärfer als nonVCL.

Du kannst beim UserInit-Wert hinter dem Komma einen Pfad zu deinem Programm angeben, soweit ich mich entsinne. Das ist eine Methode die manche Malware benutzt, aber offensichtlich auch Spybot, wenn dort ein Dialog nach dem Einloggen erscheint (hatte ich noch nicht). Einfach mal testen. Mache zB ein Programm welches nur eine MessageBox() anzeigt und füge den Pfad dorthin hinter dem Komma ein. Mit etwas Glück bekommst du eine MessageBox zu sehen bevor Explorer startet und vermutlich wird es nicht weitergehen bevor du OK oder was auch immer wählst damit die MessageBox weggeht.

Mackhack 12. Apr 2007 02:23

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo DPler,

ich komme hier einfach nicht weiter.

Der Code gibt mir immer ein Access is Denied aus. Ich habe 8 Files hier auf einer 2. Platte die aus einer alten Windows Installation her stammen die ich gerne loeschen wuerde mit dem Tool. Jedoch wird nichts in die Registry geschrieben damit Windows die Files loeschen koennte.

Delphi-Quellcode:
procedure TfoMain.BtnGoClick(Sender: TObject);
var
  Errors, I: Integer;
  FileName, S: String;
  PrevState: Boolean;
  Priv: DWORD;
begin
  MemInfo.Lines.Clear;
  MemInfo.Lines.Add('Now storing information for file deleting at next systemstart'#13#10);

  Errors := 0;

  PBarDeletion.Max := LvwFiles.Items.Count;
  for I := 0 to LvwFiles.Items.Count - 1 do
  begin
    PBarDeletion.Position := I + 1;
    FileName := LvwFiles.Items[I].Caption;
    if ( not MoveFileEx(PChar(FileName), Nil, MOVEFILE_DELAY_UNTIL_REBOOT) ) then
    begin
       MemInfo.Lines.Add(LvwFiles.Items[I].Caption + ': ' + SysErrorMessage(GetLastError));
       Inc(Errors, 1);
    end;
  end;

  S := #13#10'Finished';
  Case Errors of
     0: ;
     1: AppendStr(S, ', ' + IntTostr(Errors) + ' Error');
     else
       AppendStr(s, ', ' + IntTostr(Errors) + ' Errors');
  end;
  MemInfo.Lines.Add(S);

  Priv := EnablePrivilege('SeShutDownPrivilege', True, PrevState);
  if ( Priv <> 0 ) then
  begin
    ShowMessage('Du hast nicht die Rechte, den PC neu zu starten');
    Exit;
  end;

  if ( MessageDlg('Do you want to reboot your machine now?', mtConfirmation, [mbYes, mbNo], 0) = mrYes ) then
  begin
    if ( not ExitWindowsEx(EWX_REBOOT or EWX_FORCEIFHUNG, 0) ) then
    begin
      ShowMessage(SysErrorMessage(GetLastError));
    end
    else
    begin
      EnablePrivilege('SeShutDownPrivilege', PrevState, PrevState);
    end;
  end;
end;

CCRDude 13. Apr 2007 08:22

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von Mackhack
Aber wie macht es Spybot dann denn das ist auch in Delphi geschrieben!

Glückauf,

Also wie Olli schon sagte... das Fenster kommt erst später, die ersten Löschversuche beim Neustart macht Spybot schon auf diversen anderen Wegen. Wer RegMon, InCtrl5 oder anderes verwendet, wird das auch relativ schnell rausfinden, deswegen ist das nicht so geheim, als daß ich das nicht verraten könnte ;)
Da benutzen wir z.B. RunOnce-Einträge mit schlichtem cmd /c del ... bzw. command /c del ... dann gibt es den Abschnitt [rename] in der wininit.ini ... und noch nen Registry-Schlüssel, den ich gerade nicht wiederfinde :D Attribute zurücksetzen, Zugriffsberechtigungen erweitern wo möglich...
MoveFileEx selber benutzt glaub ich je nach Betriebssystem auch jeweils eine dieser Methoden, wobei mir mehrere zu verwenden einfach sicherer erschien, schließlich gibts ja auch gegen Gegenmaßnahmen immer Gegengegenmaßnahmen...

Oder halt wie von Olli beschrieben ein Programm ohne Subsystem:
Zitat:

Zitat von Olli
... und bestimmte Flags im PE-Header gesetzt. Wenn man Delphi benutzen will wird eine Nachbehandlung der EXE nötig und man muß auf die komplette RTL verzichten. Im Grunde ist das noch einen Zahn schärfer als nonVCL

Wobei ich dazu ja sagen muß: warum ein Delphi-Programm umständlich nachträglich patchen, wenn man mit FreePascal einen offenen Compiler hat, für den man "einfach" nur ein neues Target mit eigener nur auf ntdll.dll basierender RTL schreiben müsste?
Das "einfach" wohlgemerkt in Anführungszeichen, steht seit Ewigkeiten auf meiner Todo-Liste, aber fände ich wesentlich eleganter, da die Möglichkeit einer eigenen RTL wenigstens etwas Pascal-Komfort erlauben würden... sonst könnte man ja gleich doch wieder C nehmen :D

Zitat:

Zitat von Mackhack
Jedoch wird nichts in die Registry geschrieben damit Windows die Files loeschen koennte.

Schau mal in die MSDN, welche Methoden MoveFileEx auf welchem Betriebssystem verwendet, das ist nicht zwangsweise immer die Registry.

Zitat:

Zitat von Mackhack
Der Code gibt mir immer ein Access is Denied aus.

Bezieht sich das nicht nur auf das ExitWindowsEx?

Wenn es Dir nur darum geht, einige bestimmte statische Dateien loszuwerden, versuchs mal hiermit:
Code:
// info: For internal testing of new stuff only
// author: Mackhack
// date: 2007-04-03 (1.4)

:: Produktname
File:"<$FILE_TEXT>","D:\loswerden.txt"
File:"<$FILE_TEXT>","D:\auchloswerden.txt","filesize=...,md5=..."
Als Mackhack.sbi (einfach Textdatei) im Spybot-S&D\Includes-Ordner speichern, in den Einstellungen mit aktivieren (bei unverschlüsselten & unsignierten externen Hilfsdateien wie dieser gibts dafür ne Rückfrage beim Benutzer) und Spybot den Krams entfernen lassen.

Irgendwo in unserem Forum (oder war das nur in unserem alten Forum?) steht noch mehr zu der Syntax, aber mehr ist hier ja gar nicht nötig ;)

Mackhack 13. Apr 2007 15:17

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo CCRDude,

vielen Dank. Nein das Access is Denied kommt gleich nach dem MoveFileEx. Der PC faehrt auch sauber runter und rebootet.

Olli 13. Apr 2007 15:27

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von CCRDude
Das "einfach" wohlgemerkt in Anführungszeichen, steht seit Ewigkeiten auf meiner Todo-Liste, aber fände ich wesentlich eleganter, da die Möglichkeit einer eigenen RTL wenigstens etwas Pascal-Komfort erlauben würden... sonst könnte man ja gleich doch wieder C nehmen :D

:zwinker:

Zitat:

Zitat von Mackhack
Jedoch wird nichts in die Registry geschrieben damit Windows die Files loeschen koennte.

Schau mal in die MSDN, welche Methoden MoveFileEx auf welchem Betriebssystem verwendet, das ist nicht zwangsweise immer die Registry.

@Mackack: Schonmal versucht SetLastError(ERROR_SUCCESS) zwischen die API-Aufrufe zu packen? Ansonsten kannst du nie wirklich genau eingrenzen wo der Fehler gesetzt wird (es sei denn du ueberwachst in einem Debugger das entsprechende Feld in der PEB - ab XP oder so)

CCRDude 13. Apr 2007 15:32

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Nun ja, wie wärs dann mit ein paar mehr Details? Welches Betriebssystem, was für eine Art User führt das Programm aus?

Aus MSDN: MoveFileEx zu MOVEFILE_DELAY_UNTIL_REBOOT:
Zitat:

This value can be used only if the process is in the context of a user who belongs to the administrator group or the LocalSystem account.
Ansonsten... wie Olli schon sagte... MSDN-Doku lesen, vielleicht steht da noch mehr drin ;)

Mackhack 13. Apr 2007 16:01

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hi,

es rennt auf Windows MCE 05, Admin ist angemeldet und das Programm rennt auch unter diesem Konto!

CCRDude 13. Apr 2007 16:27

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Dann kann ich gerade nur spekulieren, die Informationen muss man Dir ja aus der Nase ziehen ;)
Du schriebst was von Dateien, die aus einer inaktiven Windows-Installation einer anderen Platte/Partition stammen... wo war das noch gleich:
Zitat:

Zitat von Mackhack
Ich habe 8 Files hier auf einer 2. Platte die aus einer alten Windows Installation her stammen die ich gerne loeschen wuerde mit dem Tool.

Vielleicht kann MoveFileEx sie ja gar nicht zum löschen markieren, weil sie irgendwie anders geschützt sind? Schützt Windows sie etwa per SFC, kann ich mir sehr gut vorstellen, daß MoveFileEx dort ein Löschen gar nicht zulässt - dafür ist SFC schließlich da.
Weiter mit meinen Fragen... gehe ich richtig in der Annahme, daß der Explorer sie auch nicht löschen kann? Lassen die Dateien sich von einer PE-CD oder einer Linux-CD gebootet löschen (nur um einen pyhsikalischen Fehler auszuschließen)? Vermutest Du, daß die Dateien böse sind?

Olli 13. Apr 2007 16:41

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Bei einer alten Windows-Installation ist es wahrscheinlicher, dass die ACLs nur den entsprechenden Usern der nun inaktiven Windows-Installation Rechte einraeumen (sprich die SIDs stimmen nicht). Dazu koenntest du Ownership der Datei uebernehmen und dann die Rechte so setzen, dass du sie loeschen kannst.

Mackhack 13. Apr 2007 18:36

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Bitte die Infos net aus der Nase ziehen, das kribbelt so.

Also das ganze lief so ab.

Neuer Rechner gebaut, neue Platte rein Windows installiert. Alte Plate wo Windows drauf war und auch Program Files als Slave drin. Alles geloescht bekommen ausser 2 Ordner. Im Program Files\Adobe\Acrobat7\ActiveX\ hocken 4 Files drin die sich nicht loeschen lassen.

AcroIEHelper.dll
AcroPDF.dll
GbDetect.dll
pdfshell.dll

In Windows\System32\Macromedia\Flash\ gibts noch Files die sich ebenfalls nicht löschen lassen. Warum wie gesagt weis ich nicht!

Flash9b0.ocx0
FlashUtil9b0.exe0

Helfen diese Daten weiter?

CCRDude 14. Apr 2007 19:30

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
War nur ne medizinische Maßnahme, zuviele Infos in der Nase sollen verdammt ungesund sein ;)

Sind trotzdem noch Fragen offen, bzw. es ist unklar, welche Hinweise Du denn beachtet hast, und welche nicht. Hast Du etwa mal in die Sicherheitseinstellungen der Dateien geschaut, worauf Olli hingedeutet hat? Hast Du mit ner Boot-CD versucht, die Dateien zu löschen, oder nicht? Hast Du mal Spybot mit genannter Methode benutzt, um die Dateien loszuwerden zu versuchen? Hast Du auch mal die wininit.ini-Methode probiert? Ansonsten noch der Tipp, mal zu versuchen die Dateien umzubennen und dann zu löschen? Und jetzt hab ich keinen Bock mehr, das alles zu wiederholen ;)

Mackhack 14. Apr 2007 22:24

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Hallo,

erstmal vielen Dank fuer all die Hinweise von euch. Ich komme leider erst jetzt dazu die ganzen Tips mal durchzunehmen. Aber an dich CCRDude habe ich nochmal ne Frage da ich das noch nicht ganz durch habe. Wenn MoveFileEx das NICHT immer in den besagten Registry Schluessel schreibt wo dann?

Denn ich habe im prinzip an der MoveFileEx Zeile nichts veraendert gehabt jedoch drum herum kleinere kosmetische Aenderungen vorgenommen gehabt und habe das Tool insgesamt 5 mal gestartet gehabt und somit hatte ich 5 mal eine der Files im Registry Schluessel drinstehen gehabt. Geloescht wurde sie leider trotzdem nicht.

Olli 16. Apr 2007 12:45

Re: MOVEFILE_DELAY_UNTIL_REBOOT: Ins löschen einklinken
 
Zitat:

Zitat von Mackhack
erstmal vielen Dank fuer all die Hinweise von euch. Ich komme leider erst jetzt dazu die ganzen Tips mal durchzunehmen. Aber an dich CCRDude habe ich nochmal ne Frage da ich das noch nicht ganz durch habe. Wenn MoveFileEx das NICHT immer in den besagten Registry Schluessel schreibt wo dann?

Auf der NT-Plattform tut es das meines Wissens nach immer. Jedoch war in frueheren Versionen mal ein REG_MULTI_SZ verantwortlich, heute geht es wohl auch mit "normalen" Stringwerten unterhalb des besagten Schluessels.

Bitte probiere mal den Process Explorer aus. Damit kannst du nach Handles zu Dateien suchen. Alternativ, wenn da nicht klappt, koenntest du mal mein CMDasSYS ausprobieren. Mit etwas Glueck reichen dann die Rechte auf die Datei aus. Beispielsweise koenntest du einen Dateimanager (nicht Windows Explorer) aus der geoeffneten Konsole heraus starten und dann versuchen die Dateien zu loeschen oder mindestens die ACLs anzuschauen (CACLS).


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz