def Anzahl_Vokale(wort):
    return len([v for v in wort.lower() if v in 'aiueoäöü'])

def Viele_Vokale(woerter, anzahl):
    return [w for w in woerter if Anzahl_Vokale(w) >= anzahl]

print(Anzahl_Vokale('bestimmt'))

print(Viele_Vokale('schreibe dann eine funktion viele_vokale, die zwei parameter hat'.split(), 4))
...zur Antwort

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.

...zur Antwort
Weitere Inhalte können nur Nutzer sehen, die bei uns eingeloggt sind.