C oder C ++: Wie funktionieren Loader / Wrapper?

8

Hier ist ein Beispiel, was ich meine ...

  • Der Benutzer führt das Programm LOADER.EXE
  • aus
  • LOADER.EXE lädt eine andere EXE herunter, speichert sie aber im Speicher, ohne sie auf der Festplatte zu speichern
  • Führt die heruntergeladene EXE-Datei so aus, als ob sie von der Festplatte ausgeführt würde, aber direkt aus dem Speicher

Ich habe einige Anwendungen wie diese gesehen, und ich habe nie ein Beispiel oder eine Erklärung dafür gesehen, wie es funktioniert.

Weiß jemand?

Ein anderes Beispiel ist eine verschlüsselte EXE, die in eine andere eingebettet ist. Es wird extrahiert und im Speicher entschlüsselt, ohne jemals auf der Festplatte gespeichert zu werden, bevor es ausgeführt wird.

Ich habe gesehen, dass man in einigen Anwendungen Piraterie verhindert.

Bearbeiten: Als eine Nebensache funktionieren Programme wie UPX so? Ich habe mir den Code angesehen, aber es ist schwer für mich zu entziffern, und ich frage hauptsächlich aus Neugierde, ich habe keine Notwendigkeit dafür.

    
guitar- 09.06.2010, 10:31
quelle

2 Antworten

4

Viele Programme, die das tun, werden einfach in% TEMP% dekomprimiert (ich weiß, dass ich das tue), aber die großen Jungs implementieren im Wesentlichen den ausführbaren OS-Loader neu, was:

  • Ordnen Sie die ausführbare Datei dem Speicher zu. Dies ist nicht so einfach wie es klingt, da die .exe mehrere "Abschnitte" enthält, die mit Seitenausrichtung geladen werden müssen (sie müssen an Adressen beginnen, die Vielfache von 4K sind) und sie haben jeweils spezifische Anforderungen - nur lesen, kopieren auf schreiben, Null initialisiert, etc ....
  • Befriedigen Sie statische Importe, indem Sie den Import-Tabellenabschnitt aktualisieren, normalerweise mit LoadLibrary () und GetProcAddress ().
  • Im Fall von dlls (die eigentlich fast identisch sind, besteht der wichtige Unterschied darin, dass sie sowohl Exporte als auch Importe haben), muss der Loader möglicherweise auch die DLL rebasen, wenn die Speicheradresse, zu der er kompiliert wurde, war bereits in Benutzung (was ziemlich üblich ist). Dies ist jedoch normalerweise für Exe nicht möglich, da sie nicht den Relocation-Abschnitt enthalten, der die Orte im geladenen Code auflistet, die aktualisiert werden müssen, da sie normalerweise als erstes in einen Prozess geladen werden und daher nicht blockiert werden können durch etwas. Das bedeutet, dass ein Loader eine ungewöhnliche Ladeadresse für seine eigene exe haben muss, die die geladene exe nicht blockiert.

Zusammenfassend: Das ist eine Menge Arbeit. Wenn Sie interessiert sind, sehen Sie sich die PE-Formatspezifikation an, die .EXE- und .DLL-Dateien beschreibt, und die Funktion VirtualAlloc() .

    
Simon Buchan 09.06.2010, 11:11
quelle
1

Nun, wenn Sie wissen, wo der Offset zum Einstiegspunkt einer ausführbaren Datei ist und Sie wissen, welche Parameter benötigt werden, müssen Sie nur die Funktion unter der Adresse "exeBase + entryPointOffset" mit einem Funktionszeiger aufrufen.

Es ist erwähnenswert, dass Betriebssysteme, zumindest auf x86-Systemen, es Ihnen nicht erlauben, Speicher auszuführen, der als Daten markiert ist. Unter Windows beispielsweise kann dies mit dem " Virtual ProtectEx "Funktion, um den Speicher als ausführbar zu markieren.

Tatsächlich war es in der guten alten Zeit ein allgemeines System, um Speicher zu sparen. Sie hätten " Overlays ", so dass Sie Speicherplatz sparen könnten, indem Sie den Code nach Bedarf ein- und auslagern.

    
Goz 09.06.2010 10:46
quelle

Tags und Links