Frage

Ich entwickle eine Bibliothek, die die Geschäftstätigkeit ein oder mehrere Helfer ausführbare Datei im Verlauf verwendet. Meine aktuelle Implementierung erfordert, dass der Benutzer die Helfer ausführbare Datei auf dem System in einem bekannten Ort installiert hat. richtig die Hilfsanwendung in der richtigen Position für die Bibliothek Funktion sein muss, und die richtige Version sein.

Ich möchte die Anforderung entfernt, dass das System in der oben beschriebenen Weise konfiguriert werden.

Gibt es eine Möglichkeit, die Helfer ausführbaren Datei in der Bibliothek so zu bündeln, dass es zur Laufzeit ausgepackt werden könnte, in einem temporären Verzeichnis installiert, und für die Dauer von einem Laufe verwendet? Am Ende des Laufs kann die temporäre ausführbare Datei entfernt werden.

habe ich als automatisch eine Datei zum Erzeugen eines unsigned char-Array enthält, die den Text der ausführbaren Datei enthält. Dies würde bei der Kompilierung als Teil des Build-Prozesses erfolgen. Zur Laufzeit würde diese Zeichenfolge in eine Datei geschrieben werden, damit die ausführbare Datei zu erstellen.

Wäre es möglich, eine solche Aufgabe zu tun, ohne die ausführbare Datei auf einem Datenträger zu schreiben (vielleicht eine Art von RAM-Disk)? Ich konnte bestimmte Virenscanner vorstellen und andere Sicherheits-Software zu einer solchen Operation widersprechen. Gibt es andere Bedenken, die ich sollte etwa Sorgen machen?

Die Bibliothek wird in C / C ++ für Cross-Plattform-Anwendung auf Windows und Linux entwickelt.

War es hilfreich?

Lösung

Sie können mit xxd eine Binärdatei in eine C-Header-Datei konvertieren.

$ echo -en "\001\002\005" > x.binary

$ xxd -i x.binary 
unsigned char x_binary[] = {
  0x01, 0x02, 0x05
};
unsigned int x_binary_len = 3;

xxd ist ziemlich Standard auf * nix-Systemen, und es unter Windows mit Cygwin oder MinGW verfügbar ist, oder Vim enthält es auch im Standard-Installationsprogramm. Dies ist eine extrem plattformübergreifende Art und Weise Binärdaten in kompilierten Code enthalten.

Ein weiterer Ansatz zu verwenden, ist objcopy anhängen Daten an das Ende einer ausführbaren - IIRC Sie können erhalten objcopy und es für PEs unter Windows.

Ein Ansatz mag ich ein wenig besser als das ist nur Rohdaten anhängen direkt auf das Ende Ihrer ausführbaren Datei. In der ausführbaren Datei, suchen Sie an das Ende der Datei und lesen in einer Anzahl, die Größe der angeschlossenen Binärdaten. Dann suchen Sie nach hinten, dass viele Bytes, und diese Daten fread und kopieren Sie auf das Dateisystem aus, in dem Sie es als eine ausführbare Datei behandeln könnte. Dies ist übrigens die Art und Weise, dass viele, wenn nicht alle, selbstextrahierende Programme erstellt werden.

Wenn Sie die binären Daten anhängen, es funktioniert mit Windows PE-Dateien und * nix ELF-Dateien -. Keiner von ihnen lesen vorbei an der „Grenze“ der ausführbaren Datei

Natürlich, wenn Sie mehrere Dateien anhängen möchten, können Sie entweder anhängen eine tar / zip-Datei auf Ihrem exe, oder Sie werden eine etwas voraus Datenstruktur müssen lesen, was angehängt worden ist.

Sie werden auch wahrscheinlich wollen UPX ausführbaren Dateien, bevor Sie sie anhängen.

Sie könnten auch interessiert sein in der LZO Bibliothek , die Berichten zufolge ist ein die am schnellsten Dekomprimieren Kompression Bibliotheken. Sie haben eine MiniLZO Bibliothek, die Sie für einen sehr leichten Dekompressor verwenden können. Allerdings lizenziert die LZO-Bibliotheken GPL, so dass Macht meinen Sie nicht, dass es in Ihrem Quellcode enthalten kann, wenn Ihr Code als auch Unterliegt der GPL ist. Auf der anderen Seite gibt es kommerzielle Lizenzen zur Verfügung.

Andere Tipps

  

"Eine kluge Person löst ein Problem. A   weise Person vermeidet es.“- Albert Einstein

Im Sinne dieses Zitats ich empfehlen, dass Sie einfach diese ausführbare Datei bündeln zusammen mit der Endanwendung.

Just my 2 cents.

etwas anderer Ansatz als einen unsigned char * Array ist die gesamte ausführbare Binärdatei als Ressource der DLL zu setzen. Zur Laufzeit können Sie die binären Daten als lokale temporäre Datei speichern und die App auszuführen. Ich bin mir nicht sicher, ob es einen Weg gibt, eine ausführbare Datei im Speicher auszuführen, though.

  

Für die Bibliothek ordnungsgemäß funktioniert   der Helfer-App im korrekt sein muß   Lage

Unter Windows, dass das Programmverzeichnis oder System32-Verzeichnis sein würde?

Dies könnte ein Problem sein. Wenn eine Anwendung installiert ist, insbesondere in einer Unternehmensumgebung, es geschieht in der Regel in einem Zusammenhang mit administrativen Rechten. Unter Vista und später mit UAC aktiviert ist (Standardeinstellung), ist dies notwendig, um bestimmte Verzeichnisse zu schreiben. Und die meisten Unix-Varianten hatten vernünftige Einschränkungen wie das so lange, wie jemand erinnern kann.

Also, wenn Sie versuchen, es an der Zeit zu tun, die Host-Anwendung in Ihre Bibliothek aufruft, die möglicherweise nicht mit ausreichenden Rechten in einem Kontext sein, die Dateien zu installieren, und so würde Ihre Bibliothek Zwänge setzen auf der Host-Anwendung.

(Ein andere Sache, die ausgeschlossen wird aus ist Registry Änderungen oder Konfigurationsdatei-Updates auf den verschiedenen Unix-Varianten, wenn die Host-Anwendung nicht die Fähigkeit hat, den Prozess zu administrativer Ebene zu heben.)

Nachdem alles gesagt, dass, sagen Sie Sie in Betracht ziehen, die Helfer in ein temporäres Verzeichnis entpacken, so vielleicht das alles strittig ist.

Qt hat eine ausgezeichnete Methode, dies zu erreichen: QResource

„Das Qt-Ressourcensystem ist eine Plattform-unabhängige Mechanismus für die Binär-Dateien in dem ausführbaren speichern.“

Sie müssen nicht sagen, wenn Sie derzeit Qt verwenden, aber Sie sagen, „C ++ für Cross-Plattform-Anwendung unter Windows und Linux“, also auch wenn Sie es nicht verwenden, können Sie zu prüfen, zu starten.

Es gibt einen Weg in Windows eine ausführbare Datei aus Speicher auszuführen, ohne sie auf der Festplatte zu schreiben. Das Problem ist, dass durch moderne Sicherheitssysteme (DEP) ist dies wahrscheinlich nicht auf allen Systemen arbeiten und fast jeder Anti-Malware-Scanner wird es erkennen und den Benutzer warnen.

Mein Rat ist, einfach die ausführbare Datei in Ihre Distribution zu verpacken, ist es sicherlich der zuverlässigste Weg, dies zu erreichen.

Nun, mein erster Gedanke wäre: Was macht diese Helfer ausführbaren tun, dass nicht innerhalb Ihrer Bibliothek Code getan werden könnte, selbst, vielleicht einen sekundären Thread bei Bedarf verwenden. Dies könnte etwas zu prüfen.

Aber wie für die eigentliche Frage ... Wenn Sie Ihre „Bibliothek“ ist eigentlich als dll gebündelt (oder sogar eine exe) dann mindestens Windows relativ simpe Unterstützung hat zum Einbetten von Dateien in Ihrer Bibliothek.

Die Ressource Mechanismus, der Dinge wie Versionsinformationen und Symbole werden eingebettet in ausführbaren Dateien auch beliebige Stücke können von Daten ermöglichen können. Da ich weiß nicht, welche Entwicklungsumgebung Sie verwenden, kann ich nicht genau sagen, wie dies zu tun. Aber grob gesagt, würden Sie eine benutzerdefinierte Ressource mit einer Art von „FILE“ oder etwas vernünftig so, und richten Sie sie auf die exe Sie erstellen müssen einzubetten.

Dann, wenn Sie es extrahieren möchten, würden Sie so etwas wie

schreiben
HRSRC hResource = FindResource(NULL, MAKEINTRESOURCE(IDR_MY_EMBEDDED_FILE), "FILE");
HGLOBAL hResourceData = LoadResource(NULL, hResource);
LPVOID pData = LockResource(hResourceData);
HANDLE hFile = CreateFile("DestinationPath\\Helper.exe", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
DWORD dwBytesWritten = 0;
WriteFile(hFile, pData, SizeofResource(NULL, hResource), &dwBytesWritten, NULL);
CloseHandle(hFile);

(Füllung in Ihrem eigenen gewünschten Pfad, Dateinamen und jede geeignete Fehlerprüfung natürlich)

Danach besteht die Helfer exe als normale EXE-Datei und so können Sie es ausführen, aber Sie normalerweise tun würde.

Für die Datei nach dem Gebrauch zu entfernen, sollten Sie die Flaggen für CreateFile untersuchen, insbesondere FILE_FLAG_DELETE_ON_CLOSE. Sie könnten auch mit MoveFileEx aussehen, wenn der MOVEFILE_DELAY_UNTIL_REBOOT Flagge kombiniert mit NULL für die neuen Dateinamen übergeben. Und natürlich können Sie immer löschen Sie es in Ihrem eigenen Code, wenn Sie können sagen, wenn die ausführbare Datei beendet ist.

Ich weiß nicht genug über Linux ausführbare Dateien, so dass ich weiß nicht, ob ein ähnliches Merkmal dort verfügbar ist.

Wenn Linux bietet keinen geeigneten Mechanismus und / oder wenn diese Idee nicht Ihre Anforderungen in Windows anpassen, dann nehme ich Ihre Idee, einen unsigned char-Array aus dem Inhalt des Helfer exe zu erzeugen, wäre die nächst beste Weg, um die exe in Ihrer Bibliothek einzubetten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top