Woran erkennt man, in welcher Programmiersprache ein Programm/eine App geschrieben wurde?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Ich muss den anderen widersprechen, dass man einer EXE-Datei nicht mehr ansehen kann, mit welcher Sprache sie entwickelt wurde. Das geht sehr wohl, und ist nicht mal sonderlich schwierig.

An einer gestrippten EXE-Datei (also ohne jegliche Debuggingsymbole) erkennt man als erfahrener Reverser folgendes:

  • die Programmiersprache (z. B. C, C++, Pascal, wasauchimmer)
  • die Version der Programmiersprache (C89, C18, C++11, C++17, ...)
  • den verwendeten Compiler (GCC,, Clang, MS, ICC, ...)
  • die Version des Compilers (GCC 8.3, GCC 9.1, etc.)
  • das verwendete Optimierungslevel (-O1, -O2, -Ofast, -Osize, ...)
  • die verwendeten Compilerflags (-g, -Werror, usvm.)
  • usw. usf.

Genau genommen braucht man dafür nicht mal eine ganze EXE-Datei, sondern es reichen relativ kurze Auszüge des Disassemblats. (einige zich Zeilen reichen oft völlig aus)

Das liegt daran, dass unterschiedliche Compiler mit unterschiedlichen Flags völlig unterschiedliche CPU-Instruktionen erzeugen:

  • Anhand der generierten Stackframes, kann man Optimierungslevel ableiten.
  • Anhand von RVO kann man Compiler und Version erkennen.
  • Anhand des Aufbaus von Strukturen und Objektpointern, kann man den Polymorphismus und damit C++ / ObjectPascal unterschieden, inkl. Version.
  • Anhand von Inlining UND zusätzlichem Vorhandensein bestimmter Funktionen, kann man genau sehen, ob eine Funktion als "static" markiert war, oder nicht.
  • Anhand von Sprunginstruktionen und deren Reihenfolge der erwarteten Fälle kann man ebenfalls Compiler, Optimierung, und Version der Programmiersprache erkennen.

All das funktioniert nur in Kombination miteinander und zeigt natürlich immer nur Tendenzen auf. Aber aus Erfahrung weiß ich, dass man damit wirklich zu 99,9% aller Fälle richtig liegt.

Zum Reversing-Üben habe ich mir ein Skript gebaut, welches mir kurze Codeschnipsel mit unterschiedlichsten Compiler- / Flag-Kombinationen übersetzt und diese im Anschluss automatisch disassembliert.

Mit der Methode lernt man am meisten, und man bekommt recht schnell ein Gefühl dafür, wie eine Software gebaut wurde, wenn man nur einen Disassemblat-Schnipsel vor der Nase hat.

Aber um deine Frage zu beantworten: Den Quelltext kannst du i. d. R. nicht aus einer EXE-Datei extrahieren. (Es sei denn, wir reden von AutoIT, VB 5.x, primitiven Python-Packern, usw.)

Grundsätzlich kannst du jeden Code disassemblieren (nicht zu verwechseln mit dekompilieren!), und wenn man das lesen kann, dann weißt du natürlich auch, was die Software macht.

Aber Reversing ist kein Kinderspiel! Es braucht viel Erfahrung und Zeitaufwand, um damit weiter zu kommen.

Woher ich das weiß:Berufserfahrung

Im zweifelsfall kann man das genauso machen. Du musst aber nicht alle Programmiersprachen kennne. Es gibt da so einige die recht gebräuchlich sind es reicht also die häufigsten zu kennen.

Einige Programmiersprachen haben auch bestimmte Dateiformate/Endungen woran man das erkennen kann. Und je nachdem was gemacht wird gibt es sozusagen "übliche verdächtige" die meistens für bestimmte zwecke genutzt werden.

codinghelp  17.04.2020, 21:52

Du kannst doch nicht einfach den Source Code von beliebigen Programmen anschauen... Da sieht du doch nicht die rohen Dateien mit .c, .cs, .class, ...

0
Asporc  17.04.2020, 21:54
@codinghelp

Bei allem möglichen was Webdesign und Datenbankdesign angeht kann man in den Code schauen.

0
codinghelp  17.04.2020, 21:56
@Asporc

Das ist aber kein Programm und auch keine App...

Wenn ich dir meine .exe geb kannst du sicher nicht in den Code schauen, wäre ja auch super dumm.

0
PeterKremsner  17.04.2020, 22:05
@codinghelp
Wenn ich dir meine .exe geb kannst du sicher nicht in den Code schauen

Das geht natürlich schon.

Brauchst ja nur einen Decompiler nehmen und du bekommst Äquivalenten C Code. So funktioniert das Reverse Engineering von Programmen. Man kann zwar nicht sagen ob du in C C++ oder sonst einer Kompilierenden Sprache geschrieben hast, aber der C Code macht dann danach genau das selbe wie dein Programm.

Wenn die exe die JRE oder .NETRE aufruft kann man mit einem Java oder C# Decompiler den Quelltext sogar sehr gut nachbilden.

Du kannst das Reverse Engineering nur mit einem Obfuscator erschweren, aber nicht verhindern.

1
codinghelp  17.04.2020, 22:07
@PeterKremsner

Ja, so was ähnliches hab ich weiter unten auch geschrieben :) Hast natürlich recht, aber wie du schon sagtest: Die genaue Sprache findest du nicht immer heraus

0
Lamanini  18.04.2020, 00:52
@PeterKremsner
Brauchst ja nur einen Decompiler nehmen und du bekommst Äquivalenten C Code. So funktioniert das Reverse Engineering von Programmen. Man kann zwar nicht sagen ob du in C C++ oder sonst einer Kompilierenden Sprache geschrieben hast, aber der C Code macht dann danach genau das selbe wie dein Programm.

Äquivalenter Code != Quellcode!?

0
qivvwjq134 
Fragesteller
 17.04.2020, 21:52

welche sind denn die üblichen verdächtigen und wie öffnet man fen Sourcecode?

0
Asporc  17.04.2020, 21:55
@qivvwjq134

Du würdest damit eh nichts anfangen können. Wenn du wissen willst mit was ein bestimmtes Programm geschrieben wurde frage die Entwickler da kommst du schneller und zuverlässiger zu einem Ergebnis.

0
qivvwjq134 
Fragesteller
 17.04.2020, 21:55
@codinghelp

echt? also weiß man das nur von dem Devs? und ich dachte, viele hätten in Quellcodes bereits Leaks für zukünftige Updates gesehen

0
qivvwjq134 
Fragesteller
 17.04.2020, 21:56
@Asporc

und wenn jmd. eine Mod schreibt, muss das die gleiche Sprache sein?

0
Asporc  17.04.2020, 21:57
@qivvwjq134

Nein ich sagte du würdest es so am ehesten erfahren.

Ohne Programmierkenntnisse in Programmcodes zu schauen ist dasselbe als wenn du ohne Vokabelkenntnisse auf einmal versuchst Chinesisch zu sprechen. Das sagt dir absolut überhaupt nichts.

0
Asporc  17.04.2020, 21:58
@qivvwjq134

Was mods angeht dafür werden oft von den Spieleherstellern Mod-Entwicklungskits angeboten.

1
codinghelp  17.04.2020, 21:58
@qivvwjq134

Nicht nur, aber so einfach wie du es dir vorstellst ist es auch nicht. Eventuell kannst du was dekompilieren und so z.B. an den Code rankommen

1
qivvwjq134 
Fragesteller
 17.04.2020, 21:58
@Asporc

ich will das nur theiretisch wissen, ich will nur nachvollziehen können, ob Leute, die das scheinbar einfach so wissen einfach raten oder das wissen

0
qivvwjq134 
Fragesteller
 17.04.2020, 21:59
@codinghelp

was ist dekompilieren? ist das das zurückengineeren von Code?

0
PeterKremsner  17.04.2020, 22:12
@qivvwjq134

Man kann in einem Reverse Kompilierten Code schon einiges finden oder auch im reinen Maschinencode.

Je nachdem wie das Programm erstellt wurde finden sich darin nämlich zB Daten die nie verwendet werden oder die im normalen Spielfluss nicht auftauchen. Das kann dann unter Umständen ein Hinweis darauf sein, dass sich etwas entsprechendes in der Entwicklung befindet oder es handelt sich um Kontent der in letzter Minute wieder raus genommen wurde und daher noch im Quelltext drinnen ist.

Wenn das ganze sauber Released wird sollten diese überbleibsel natürlich verschwinden, aber wie immer haben die Entwickler einfach Zeitdruck und da rutscht dann schon teilweise sehr viel durch was eigentlich nicht in den Release Build kommen sollte.

1
qivvwjq134 
Fragesteller
 17.04.2020, 22:14
@PeterKremsner

und texturen muss man nicht extra dekompillieren oder? in android Spielen kann man da irgendwie darauf zugreifen

0
codinghelp  17.04.2020, 22:19
@qivvwjq134

Du kannst ja mal in die Ordner schauen, wo du Programme installiert hast. Da liegen viele Dateien rum

0
PeterKremsner  17.04.2020, 22:21
@qivvwjq134

Texturen sind an sich nicht kompiliert. Kompilieren ist das Übersetzen von Quelltext in einen ausführbaren Code. Texturen sind an sich kein ausführbarer Code sondern Datenmengen die dem Grafiktreiber gegeben werden der daraus dann die Figuren auf den Bildschirm bringt.

Es kann aber durchaus sein, dass die Texturen einem nicht gängigen Format vorliegen und daher zB nicht direkt in Blender geöffnet werden können. Dann braucht man entweder ein Programm dass diese Files öffnen kann oder man kann das Format entsprechend transkodieren.

Oftmals sind Texturefiles aber nur in Archivdateien verpackt, wenn man dieses Archiv entpackt kann man die Texturen direkt bearbeiten.

0
qivvwjq134 
Fragesteller
 17.04.2020, 22:25
@PeterKremsner

Also Quellcode !=Ausführcode?

Sind Programmiersprachen Quell oder Ausführcode? Die können ja ausgeführt werden, aber sind auch der Ursprung eines Programmes

0
codinghelp  17.04.2020, 22:36
@qivvwjq134

Du schreibst Quellcode.

if(Quellcode){
    Computer.MussCodeInMaschinenCodeÜbersetzten 
}

Dein PC versteht aber nur 0 und 1. Also wird der Quellcode so "umgewandelt", dass der PC damit arbeiten kann

1
PeterKremsner  18.04.2020, 00:53
@qivvwjq134

Dein Computer kann für gewöhnlich mit dem Quelltext in C oder irgendeiner anderen Sprache nichts anfangen.

Im Fall von Compilierten Sprachen wird also der Quelltext von einem Compiler zunächst in Assembler umgewandelt und anschließend in Maschinencode.

Aus dem Quelltext

b = a;

wird im Assembler

MOV r/m32, r32

und für deine CPU wird das dann

0x89

bzw Binär geschrieben

10001001

Also das Programm das ausgeführt wird hat bis auf das Verhalten nichts mehr mit dem Quelltext gemeinsam. So kann zB keiner aus diesem Bitmuster die Zeile b = a rekonstruieren. (Bei diesem einfachen Beispiel schon noch, aber bei komplexeren nicht mehr).

Die können ja ausgeführt werden, aber sind auch der Ursprung eines Programmes

Der Quelltext kann nicht ausgeführt werden. Er kann höchstens von einem Interpreter interpretiert werden. Das ist ein eigenes Programm was den Quelltext liest und ihn Zeile für Zeile abarbeitet. Aber die CPU versteht den Quelltext direkt nicht, daher muss er entweder zuerst von einem Compiler oder Interpreter in Maschinencode umgewandelt werden.

0

Wenn man den Quellcode kennt kann mans machen ja. Die meisten Sprachen kennt man auch leicht auseinander.

Wenn man den Quellcode nicht kennt und man nur das fertige Programm hat kann man nur eine Gewisse Familie von Programmiersprachen heraus bekommen aber nicht welche Programmiersprache genau verwendet wurde.

Das Programm welches beim Kompilieren von C Code entsteht ist zB nicht unterscheidbar von einem Kompilat in C++, Fortran oder anderen kompilierten Sprachen. Man kann höchstens Vermutungen aufgrund von Bibliotheken etc machen aber selbst da weiß man nicht ob nicht C und zB Fortran gemischt wurden.

Hingegen kann man ein C# Programm von einem Javaprogramm und von einem C Programm unterscheiden, da C# und Javaprogramme nicht in Maschinencode übersetz werden sondern in einen Bytecode der typisch für .NET oder Java ist.

Du kannst nicht einfach den Source Code von Programmen anschauen...

qivvwjq134 
Fragesteller
 17.04.2020, 21:52

wie macht man es dann?

0