2011-01-02 9 views
2

Alle,Ändern der Ressourceninhalte einer laufenden ausführbaren Datei

Ich speichere meine Anwendungseinstellungen in einer Ressource. Wenn mein Programm zum ersten Mal geladen wird, lese ich die angegebene Ressource mit WinAPI. Ich parse dann die abgerufenen Byte-Daten. Das funktioniert einwandfrei für mich.

Jetzt sagen wir, dass ein Benutzer eine Einstellung in meiner Anwendung ändert. Er/sie prüft ein Checkbox-Steuerelement. Ich möchte die aktualisierte Einstellung in meiner Ressource speichern. Es scheint jedoch, dass mein Aufruf von UpdateResource nicht funktioniert, während meine Anwendung ausgeführt wird. Ich kann meine Ressourcendaten nicht ändern, obwohl sie dieselbe Größe haben.

Erstens, ist es möglich, die Ressourcendaten eines laufenden Images zu ändern? Zweitens, wenn das nicht möglich ist, welche Alternativen habe ich, um Einstellungen intern in meiner Anwendung zu speichern?

HINWEIS: Ich muss die Einstellungen innerhalb meiner laufenden ausführbaren Datei haben. Sie können nicht auf der Festplatte oder in der Registrierung sein. Bitte schlagen Sie das nicht als Option vor.

+3

Warum möchten Sie das tun? Von der Stelle aus, an der ich sitze, weist diese Frage auf einen schwerwiegenden Fehler im Design Ihrer Anwendung hin. Das verdient eine vollständige Abhilfe, keine Pflaster-Lösung. –

+1

Ich würde vorschlagen, die Lösung für Ihr Problem, aber Sie haben ausdrücklich erklärt, dass Sie nicht wollen, dass jemand eine Lösung vorschlagen. Entschuldigung, dass ich nicht helfen kann. –

+2

Es wird normalerweise nicht funktionieren, auch wenn Ihr Bild nicht in einem Prozess geladen ist. Sie können keinen Schreibzugriff auf eine ausführbare Datei erhalten, wenn der Benutzer entsprechend eingeschränkt ist. UAC ist der übliche Fall. Schließen wir diese Frage, Sie sind nicht an einer echten Antwort interessiert. –

Antwort

5

Es ist 100% möglich, selbst modifizierenden Code zu schreiben. Es ist einfach nicht einfach.

Wenn Sie Ihre ausführbare Datei starten, wird diese im Windows-Fenster gespeichert. Dies sperrt im Wesentlichen die Datei und verhindert Bearbeitungen, während sie ausgeführt wird. Sie können Ihr Programm natürlich auflösen (indem Sie eine undokumentierte Funktion in ntdll verwenden). Wenn Ihre Datei nicht zugeordnet ist, können Sie Änderungen daran vornehmen.

Dies ist ein bisschen ähnlich dem, was Sie tun möchten: http://www.johnfindlay.plus.com/lcc-win32/asm/SelDelNT.htm

anstatt sie zu löschen, natürlich, wollen Sie Änderungen vornehmen. Die Idee hinter dem Wahnsinn ist die gleiche - Sie müssen die Datei entmapseln.

+0

@ddebug: Ich stimme zu, es ist eine gute Frage und das ist eine gute Antwort (+1). Es sollte mehr Offenheit geben wie Sie. –

+1

@ddebug, um die Geschichte zu vervollständigen, vielleicht können Sie auch erklären, wie man in eine Datei schreibt, wenn Sie nicht über ausreichende Rechte dazu verfügen –

+0

@David Heffernan, ich glaube nicht, dass ich verstehe, was Sie versuchen zu bekommen . Nein, in Mrwoiks Aussage hat er gesagt, er hätte keine Schreibberechtigung für seine ausführbare Datei. Er wollte sein Bild zur Laufzeit verändern. Windows sperrt Ihre Datei, wenn sie während der Ausführung verwendet wird. Sie können diese Sperre entfernen, indem Sie UnmapViewOfFile verwenden. Dies verhindert zwar eine weitere Codeausführung Ihrer ausführbaren Datei, aber der oben angegebene Link zeigt eine Umgehung dafür. Das könnte für deinen David zu weit fortgeschritten sein, aber wenn du die Ressource lest, die ich verlinkt habe, könntest du es verstehen. – ddebug

0

Haben Sie die MSDN (UpdateResource Function) gelesen? Es hat eine Liste von Dingen, die Ihre Änderungen nicht aktualisieren. Vielleicht versuchen Sie eine solche.

1
  1. Leider dass SelDelNT funktioniert nicht auf XP + - die Datei unmap kann, aber exe ​​Bild Griff 0x4 nicht mehr - in der Tat stdin Griff ist 0x3 und stdout Griff 0x7 ist, so seine wahrscheinlich, dass exe Griff wurde absichtlich unzugänglich gemacht (-1 oder etwas). später
  2. Eine Möglichkeit ist die exe (sein darf) umbenennen, kopieren Sie sie dann in die Datei mit ursprünglichen Namen und ändern Sie es, und verwenden Sie MoveFileEx mit MOVEFILE_DELAY_UNTIL_REBOOT (oder einem anderen Trick vielleicht) zu löschen.
  3. Eine offensichtlichere Version von [2] ist, die exe zuerst nach% TEMP% zu kopieren und von dort neu zu starten.
  4. VSS (http://msdn.microsoft.com/en-us/library/aa384645(v=VS.85).aspx) kann dies erlauben (über "Restore"), aber es ist sehr langsam und hat eine spürbare Seite Auswirkungen.
  5. A/SWAPRUN: NET-Linker/Editbin-Option scheint relevant zu sein.
  6. Hier ist ein Tutorial auf Ressourcen in der entriegelten exe Updating - http://www.codeproject.com/KB/DLL/Modify_UpdateResources_.aspx?msg=3307326
  7. Hier ist ein weiteres tutorial mit einer Liste von Selbst Löschen Methoden: http://www.catch22.net/tuts/selfdel Die letzte Methode (einen suspendierte Prozess mit zufälligen exe wie Explorer oder cmd.exe, wodurch dann hijacking es) klingt wie es würde auch für exe Änderung funktionieren - Sie können cmd.exe im suspendierten Zustand starten, kopieren Sie dann Ihre EXE-Bild in den Speicher dieses Prozesses und geben Sie Ihre ursprüngliche exe.
Verwandte Themen