Ich möchte fragen, welche Art von Codierung verwendet wird, um ausführbare Linux-Dateien, z. B. hexadezimal, binär oder irgendetwas anderes, zu erstellen. Wie wird es konvertiert? Gibt es eine Möglichkeit, den ursprünglichen Code aus dieser ausführbaren Datei wiederherzustellen?
Hier ist ein bisschen Code, den ich habe:
ELF���������>�����%|�����@�������������������@�8��@���������������������@�������@�����7<�����7<������� ������������������f�����f���������������������� ������[�UPX!L
h�h�8����������?�E�h=��ڊ̓�N� 4���9ISloB�q�w�]ȉ.��,ς��Q䝦����#e��-�N����/�b,���d<��'��-E��6E�s�/�U���ly�V�Y2]"a��S�.�hU�|�S�J�I�2���X}
�G0�;���5d�$���.)
Was soll das heißen?
14.04
command-line
compiling
iptables
executable
Redchief
quelle
quelle
strings
Filterprogramm sehr nützlich sein kann, um zu identifizieren, was ein bestimmtes Binärprogramm ist oder tut, da es alle eingebetteten Textzeichenfolgen ausgibt, die länger als eine angegebene Länge in a sind Binärdatei und das Betrachten der Meldungen in einem Programm sagt manchmal viel darüber aus, was es ist und was es tut.Antworten:
Es ist binär. Der Quellcode wurde kompiliert. Sie können es in einem Editor anzeigen (ein Hex-Editor wie
bless
könnte genauere Änderungen bewirken), aber Sie müssen wirklich wissen, was Sie tun. Es ist wahrscheinlich nur zum Ändern von Zeichenfolgen geeignet.Für etwas Hardcore können Sie beginnen, die Binärdatei in Assembler- Code umzuwandeln. Dies wird oft als die vom Menschen analysierbare Computersprache der untersten Ebene angesehen.
Aber es wird auch eine Menge Compiler-Quatsch enthalten. Wenn Sie beispielsweise das Einfachste
helloworld.cpp
mit G ++ kompilieren und es dannobjdump
ausführen, erhalten Sie 226 Zeilen (208 Zeilen) Yuck. Sie könnten eine "Hallo Welt" in nur 15 Zeilen Assembler schreiben , kompilieren undobjdump
es, aber das blüht noch in 166 Zeilen (gestrippt).Wenn Sie mit Baugruppen gut genug umgehen können, erhalten Sie möglicherweise genügend Zugriff, um zu verstehen, was gerade passiert, und können sogar Änderungen vornehmen ... Um jedoch Ihre ursprüngliche Frage zu beantworten:
Sie können kompilierten Code nicht in den ursprünglichen Quellcode zurückverwandeln .
Es tut uns leid. Es handelt sich um eine Einwegtransformation, die Informationen (Kommentare, Formatierungen, lesbare Algorithmuskonzepte usw.) verliert, statisch mit anderen Dingen verknüpft und im Allgemeinen so optimiert ist, dass sie nur für die besten und erfahrensten Programmierer verständlich ist.
Um Ihnen einen Überblick über das Ausmaß des Problems zu geben, verfügt die gesamte Idee der Reverse Engineering-Software über eine eigene Stack Exchange-Site .
quelle
Ich habe nicht genug Rufpunkte für einen Kommentar, daher ist dies eine Antwort:
Nein, es ist nicht möglich, es "zurück" zu konvertieren. Sie erwähnen upx packer, haben Sie jemals das Handbuch von upx gelesen?
Wenn Sie die Quelle verloren haben oder keinen Zugriff auf den Code einer anderen Person haben, ist dies einfach nicht möglich.
Die ausführbare Binärdatei wurde mit einem Compiler erstellt. Glauben Sie nichts, was auf dieser Site angegeben ist. Lesen Sie einfach das Handbuch dieses Compilers. Dann können Sie hier hinzufügen, in welcher Sprache der Originalcode geschrieben wurde, welcher Compiler verwendet wurde, und sich dann selbst merken, dass diese Schritte (Vorverarbeitung, Kompilieren, Verknüpfen, möglicherweise Packen) nicht als Ganzes umgekehrt sind, sondern nur analysiert werden, was der ursprüngliche Autor beabsichtigt haben könnte, und geschrieben.
quelle
Dies ist wahrscheinlich eine Binärdatei (eine ELF-Datei), wie hier beschrieben:
https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
Wenn Sie es mit einem normalen Texteditor geändert und Ihre Änderungen gespeichert haben, war dies keine gute Idee und Sie haben es möglicherweise zerstört.
quelle
Wie Oli bereits in seiner Antwort betont hat, kann man nicht den ursprünglichen Quellcode einer ausführbaren Datei erhalten.
Während der Kompilierung eines Quellcodes (Kompilierung, die in ihrer typisch breiteren Akzeptanz beabsichtigt ist, daher als der gesamte Prozess, der einen Quellcode in eine ausführbare Datei "umwandelt"), gehen viele Informationen verloren.
Der C-Präprozessor führt unter anderem Folgendes aus:
#
Anweisungen) interpretieren, ausführen und entfernenAndererseits ist das, was bei der Kompilierung des Quellcodes nicht verloren geht, technisch auf einen funktional äquivalenten Quellcode zurücksetzbar.
Das ist weil:
Es gibt Tools, die als Decompiler bezeichnet werden und versuchen, eine ausführbare Datei auf einen funktional äquivalenten Quellcode zurückzusetzen. Das Ergebnis ist jedoch in der Regel etwas weit vom ursprünglichen Quellcode entfernt (und in der Regel auch nicht kompilierbar).
Betrachten Sie dieses Programm:
Durch das Kompilieren in eine ausführbare Datei und das erneute Dekompilieren in einen Quellcode erhalten Sie mehr oder weniger das, was Sie normalerweise zurückbekommen (in diesem speziellen Fall habe ich
gcc
/ Boomerang verwendet ):Wie vorhergesagt:
// address: 0x80483fb
, die vom Dekompiler hinzugefügt wurden)Dies ist auch ein ziemlich gutes Ergebnis; Es kommt nicht selten vor, dass Inline-Assembly-Anweisungen in den Code eingefügt werden:
Die Quintessenz ist (wie bereits in den anderen Antworten erwähnt): Sie können nicht die ursprüngliche Quelle einer ausführbaren Datei * erhalten.
* Jedoch auf die ausführbare Datei und auf Ihr Glück abhängig, Sie könnten der Lage sein , etwas mit einem Decompiler zu bekommen.
quelle
Ausführbare Dateien sind normalerweise binär, wenn es sich um kompilierte Programme handelt. Weitere Informationen finden Sie unter
file path/to/executable
. Sie können ausführbare Binärdateien hexadezimal anzeigen, indem Sie z. B. verwendenhexdump -C path/to/executable | less
(was auch immer Sie tun würden). Wenn Sie es "wieder in seine ursprüngliche Form konvertieren" möchten, müssen Sie einen entsprechenden Dekompiler verwenden, siehe diesen Beitrag. Dies würde jedoch zu einem unlesbaren Code führen, der nicht dem Original entspricht, aus dem es kompiliert wurde. Wenn es sich nicht um eine kompilierte Binärdatei handelt, handelt es sich um eine Art ausführbares Skript, das in jedem Texteditor leicht lesbar sein sollte. Was Sie uns hier gezeigt haben, ist wahrscheinlich eine kompilierte ausführbare Datei. ELF bedeutet "Ausführbares und Verknüpfendes Format", ein auf Linux / Unix-Systemen gebräuchliches Binärformat. Dort'strings path/to/executable
, wenn du das brauchst.quelle