Ist ein C++ Programm immer closed source?

6 Antworten

Bei C ist es größtenteils dem Compiler überlassen, inwieweit was wie wo optimiert wird.

C++ schreibt das hingegen zu großen Teilen im Sprachstndard fest.

Das hat zur Folge, dass ganze Seiten an Quelltext in teilweise nur eine einzige CPU-Instruktion eingedampft werden.

Und daraus kann man natürlich unmöglich den Originalquelltext ableiten ... im besten Fall muss man also "kreativ raten", wenn man wissen will, wie genau etwas implementiert wurde.

C++ ist die einzige mir bekannte Sprache, die laut eigenem Standdard ein so hohes Optimierungspotential hat.

Es ist durchaus nicht ungewöhnlich, dass 10 Seiten C++ Quelltext komplett "verschwinden" und im Kompilat überhaupt nicht mehr auftauchen, sodass nur noch ein zur Kompilierzeit vorberechnetes Ergebnis im Maschinencode steht, quasi als Konstante.

Wenn du jetzt eine EXE-Datei disassemblierst, erhältst du Assemblercode, der nur noch sehr wenig mit der ursprünglichen C++-Funktionalität zu tun hat.

Zum Vergleich: Bei C# oder Java & Co gibt es sogar Decompiler, die sehr gut lesbaren Quelltext generieren, der dem Original extrem Nahe kommt.

Bei C++ hingegen ist das technisch ausgeschlossen.

Ach so, und ... Wenn jemand den Quelltext von seinem C++ Programm z. B. auf GitHub oder einer anderen Website veröffentlicht, ist das dann natürlich OpenSource.

Das Kompilat am Ende - also eine EXE oder DLL Datei - ist nicht ausschlaggebend dafür, ob etwas Open- oder Closed-Source ist.

Open-Source bedeutet einfach nur, dass der Quelltext veröffentlicht wird.

Ob und wie gut man eine Binärdatei reversen kann, hat damit erst mal nichts zu tun. :)

Woher ich das weiß:Berufserfahrung
Aromapflege  25.07.2021, 20:52

Und C ist so ein Mittelding zwischen Java und C++ bezüglich der Optimierung ?

0
stdio  25.07.2021, 21:11
@Aromapflege

Ja, kann man so sagen.

Bei C bleibt sinngemäß viel mehr vom Original-Quelltext (indirekt!) übrig, als bei C++, aber auch viel weniger, als bei Java.

1

Ja,

das wird Maschinensprache.

Das kan keinvernünftiger Mensch zurücküberseten.

Mario

Liegt ein Programm nur als exe-File vor, kann man den Code in ein Assembler-Format umwandeln. Assembler entspricht der "Sprache" der ausführenden CPU. Je nach CPU-Type sind die Assembler-Formate unterschiedlich. Das im Gegensatz zu einer Hochsprache wie z.B. C oder C++.

Mit dem Assembler-Format ist es jedoch sehr schwierig herauszufinden,

  • welche Funktionen das Programm durchführt
  • mit welchen Methoden diese Funktion realisiert sind
  • an welchen Stellen diese Funktionen im Code lokalisiert sind

Alle Namen von Funktionen und Variablen, die man ursprünglich z.B. in C verwendet hat, sind im Assemblerformat unbekannt und werden durch eine willkürlich vergebene Nummer ersetzt.

Eine Wartung oder komplexe Erweiterung der Software auf Basis des Assembler-Formats ist so gut wie unmöglich. Relativ leicht machbar sind nur geringfüge Änderungen des Codes, so. z.B. die Bedingung für einen Sprung zu ändern oder bestimmte Codeteile durch den Einbau eines unbedingten Sprungs auszulassen.

jasmin8911 
Fragesteller
 25.07.2021, 16:50

Ok. Und ist dann immer der gesamte Quelltext in der exe Datei als Maschinensprache abgespeichert. Wenn ich z.b Windows Word hernehme ist dort dann der Gesamte Code in der exe Datei?

0
Rammstein53  26.07.2021, 09:53
@jasmin8911

Programme wie Word werden mit einer Hochsprache wie z.B. C++ entwickelt. Ein Compiler setzt die Anweisungen dieser Sprache in Assembler ( "Maschinensprache" ) um. Der so erzeugte Code steht im exe-File.

Der gesamte Code von z.B. Word befindet sich nicht nur in einer exe-Datei, sondern ist auch auf verschiedene DLL's verteilt. In den DLL's befindet sich ebenfalls ein Maschinencode. Die zusätzliche Verwendung von DLL's hat z.B. den Vorteil, dass man bestimmte Code-Teile durch den Wechsel der DLL auf einfache Weise verändern kann, ohne das exe-File austauschen zu müssen.

1

Das hat doch damit nichts zu tun.

"Closed Source" bedeutet einfach nur, dass es keine einfach so verfügbare Quellcodedistribution des Programms gibt.

Nein ist es nicht. Man kann das Programm disassemblieren und versuchen, die Funktionsweise zu rekonstruieren (Reverse Engineering). Ist aber relativ kompliziert. Lad dir mal ein Disassemblierer runter und schau dir das an. Du liest nur Maschinencode.

Aber einfach nachgucken geht natürlich nicht. Nachdem compilieren liegt in der exe-Datei ja nur noch Maschinencode vor. Da lässt sich kein Quellcode extrahieren. Nur mit obigen Verfahren.

Und jetzt kommt der Schlimme Teil:

Proprietäre Software steht oft unter einer  EULA, die das Disassemblieren sowie  Dekompilierenuntersagt. Dies ist jedoch in Deutschland nur in seltenen Fällen rechtlich bindend. Auch ist Reverse Engineering zur Herstellung von Kompatibilität mit der Software Dritter ausdrücklich gesetzlich gesichert erlaubt – und damit nicht durch einen Lizenzvertrag zu unterbinden

https://de.wikipedia.org/wiki/Disassembler?wprov=sfti1