C++ Quellcode in Assembler übersetzen?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Und wozu soll das gut sein ?  Klar lässt sich jeder ausführbare Code in die Mnemonics des Assembler der entsprechenden CPU-Architektur übersetzen,  aber Sinn oder Unsinn eines solchen Features würde reichlich Diskussionsstoff liefern.  Einen Nutzen könnte es ällerhöchstens bei ganz einfachen Programmen, die nicht objektorientiert programmiert wurden und keine, oder wenigstens nur sehr wenige Systembibliotheken mit eindeutigen klar definierten Einsprungadressen verwenden.  Bei stark objektorientierten "großen" Anwendungen, vieleicht sogar noch für GUI, ist der Overhead und die Anzahl der geladenen Bibliotheken so monstös, dass ein ASM-Code eines solchen Programmes völlig nutzlos wäre.  Um damit etwas anfangen zu können, müssten alle Referenzen der Bibliotheken und APIs ebenfalls als dokumentierte ASM-Source zur Verfügung stehen.  Wenn nicht, dann sieht man zwar einen ASM-Code, mit dem man jedoch effektiv nichts anfangen kann. Wenn die C / C++ Compiler dann noch Codeoptimierungen (Laufzeit, Größe, Geschwindigkeit ) durchführen, wird der ASM-Code noch nutzloser.

Okay. Dann formuliere ich meine frage anders: Wie können Hacker die Source Code von ein Programm sehen und Schwachstelle finden ? Funktioniert das nicht mit Übersetzung von C / C++ / Perl nach Assembler ? Ich hoffe nicht denn ich habe paar Monate in C++ gesteckt, und ich hoffe das ich kein Assembler lernen muss.

0
@Gena221

Das ist der falsche Ansatz, die falsche Herangehensweise und ein falsches Verständnis für komplexe Zusammenhänge.

Wann brauche ich so was wie Dis-assemblierung ?  Für Entschlüsselung von "Geheimnissen", wie Code- und Seriennummerabfragen, Rahmen- und Integitychecks auszuhebeln in dem der Aufruf des Unterprogamms verhindert wird, für reverse Ingeneering, um eine Initialisierungsreihenfolge herauszufinden, um Laufzeitkomprimierungen zu entfernen.... Das Ziel solcher Aktionen ? Ein Treiber, ein Low-Level-Interface oder ein Kernelmodul für eine undokumentierte Hardware,  ein Crack für ein Spiel,  eine Lizenzabfrage abfangen / emulieren,  halt "reverse Engineering". Lernen und erforschen durch Auseinandernehmen.   Solche Techniken werden nur verwendet, wenn zu einem Programm KEIN Sourcecode und keine Dokumentation vorliegt.  In deinem Fall liegt aber ein voll dokumentierter Sourcecode des Programmes vor !  Wozu also die ganze Sache unnötig verkomplizieren und das in einen verworrenen, aufgeblasenen ASM-Code übersetzen ? Um ASM zu verstehen, ist es tatsächlich nötig das auch zu lernen !  Ich programiere ASM und mir ist die Plattform egal ob nun x86, x64, arm, avr, mcs51, z80, pic, ppc... der Assembler und der Assembler-Code ist für jeden anders.  Register, Adressierungsarten, Befehssatz und auch Syntax und Mnemonics unterscheiden sich. Das macht es ja auch so schwierig gegenüber Hochsprachen, wie z.B. C. Dazu kommt die totale Abstraktion auf Bit- und Registerebene und das begreifen viele nicht...

Die Hacker der modernen Zeit bedienen sich zur Findung von Schwachstellen ( meisst Exploits ) einer abgeschotteten, kontrollierten  Testumgebung und riesigen Fehlerdatenbanken und Extrem-  Penetrationstestsystemen z.B. http://www.metasploit.com/

Die meisten heutzutage gefundenen Schwachstellen werden nicht in den Anwedungen gefunden, sondern in schlecht oder nicht-dokumentierten Systembibliotheken, wodurch man dann wieder auf den Systemhersteller, im Fall Windows auf Micro$oft, angewiesen ist, das Exploit zu fixen.  Der Fehler war zwar schon immer da, tritt aber nur mit der getesteten Anwendung auf. Wenn die Anwendung einmal public und das Exploit bekannt, ist es nur eine Frage der Zeit bis es Schadsoftware gibt, die genau das aunutzt. Das zwingt indirekt die Betriebsystemhersteller zum Updatewahnsinn....

1

Das macht so ziemlich jeder Compiler. Alternativ kannst du auch einen Disassembler nehmen und eine exe in ASM Code umwandeln. Vorteil an der Compiler-Variante: Du bekommst den original Quellcode an der passenden Zeile als Kommentar

Visual Studio kann das z.B. mit /FAs

gcc bzw. g++ unter Linux machen das, wenn man Option "-S" mitgibt.