Zuerst habe ich bereits gegoogelt, aber nur Beispiele gefunden, bei denen eine komprimierte Datei (zB .tar.gz
) in ein Shell-Skript eingebettet ist.
Grundsätzlich, wenn ich ein C-Programm ( hello.c
) habe, das eine Zeichenfolge ausgibt, sage Hallo Welt! .
Ich kompiliere es, um eine ausführbare Binärdatei zu erhalten
%Vor% Jetzt habe ich ein Shell-Skript testEmbed.sh
Was ich frage, ist, ob es möglich ist, die Binärdatei ( Hallo ) in das Shell-Skript einzubetten, so dass ich
ausführen kann %Vor%es führt die zu druckende binäre Hallo Welt! aus.
Erläuterung : Eine Alternative ist, dass ich die ausführbare Datei in ein Archiv komprimiere und dann entziehe, wenn das Skript ausgeführt wird. Was ich frage ist, ob es möglich ist, das Programm ohne das Programm auszuführen.
Bis jetzt habe ich die Methode hier ausprobiert. Aber es funktioniert nicht für mich. Ich nehme an, der Autor verwendete eine andere Distribution für eine andere Architektur. Also, im Prinzip funktionierte das nicht für mich. : P
Wenn der Arbeitsablauf für ein C-Programm von einem Java jar
abweicht, möchte ich das auch wissen!
Ja, das kann gemacht werden. Es ist eigentlich sehr ähnlich im Konzept zu Ihrem verknüpften Artikel. Der Trick besteht darin, uuencode
zu verwenden, um die Binärdatei in ein Textformat zu codieren und sie dann an das Ende des Skripts anzuheften.
Ihr Skript wird dann so geschrieben, dass es uudecode
auf sich selbst ausführt, um eine Binärdatei zu erstellen, die Berechtigungen zu ändern und dann auszuführen.
uuencode
und uudecode
wurden ursprünglich für das Verschieben von binärem Inhalt auf dem Vorläufer zum Internet erstellt, der binäre Informationen nicht so gut handhabt. Die Umwandlung in Text bedeutet, dass es auch als Shell-Skript versendet werden kann. Falls sich Ihre Distribution aus irgendeinem Grund beschwert, wenn Sie versuchen, uuencode
auszuführen, bedeutet dies wahrscheinlich, dass Sie sie installieren müssen. Zum Beispiel unter Debian Squeeze:
ruft die relevanten ausführbaren Dateien für Sie ab. Hier ist der Prozess, den ich durchlaufen habe. Erstellen und kompilieren Sie zunächst Ihr C-Programm hello.c
:
Erstellen Sie dann ein Shell-Skript testEmbed.sh
, das sich selbst dekodiert:
Die erste rm
-Anweisung zeigt, dass die Datei hello
von diesem Skript neu erstellt wird und nicht von Ihrer Kompilierung übrig bleibt. Da Sie auch die Payload in der Datei benötigen, hängen Sie die codierte ausführbare Datei an das Ende der Datei an:
Danach, wenn Sie das Skript testEmbed.sh
ausführen, wird die ausführbare Datei extrahiert und ausgeführt.
Der Grund dafür ist, dass uudecode
in seiner Eingabe nach bestimmten Markerzeilen sucht ( begin
und end
), die dort von uuencode
gesetzt werden, also nur das codierte Programm entschlüsseln, nicht das gesamtes Skript:
Es gibt noch andere Dinge, über die Sie sich Gedanken machen sollten, wie zum Beispiel die Möglichkeit, dass Ihr Programm Shared Libraries benötigt, die auf dem Zielsystem nicht existieren, aber der obige Prozess ist im Grunde genau das, was Sie brauchen.
Der Prozess für eine JAR-Datei ist sehr ähnlich, außer dass die Art, wie Sie sie ausführen, anders ist. Es ist immer noch eine einzelne Datei, aber Sie müssen die Zeile ersetzen:
%Vor%mit etwas, das JAR-Dateien ausführen kann, z. B .:
%Vor% Der tragbare Weg, dies zu tun, ist mit dem Befehl printf
und oktalen Escapes:
um die Bytes 1, 2 und 3 zu drucken. Da Sie wahrscheinlich nicht alles von Hand schreiben möchten, kann der Befehl od -b
verwendet werden, um einen Octal-Dump der Datei zu generieren. co_de% script, um den Müll zu entfernen und die richtigen Backslashes an Ort und Stelle zu setzen.