Seite 3 von 3

Verfasst: 02.06.2006 08:24
von Karl
Ich hatte mal einen C-Dekompilierer. Soweit ich weiss ist es unmöglich in C++ zu dekompilieren. In einer Doktorarbeit wurde auch erläutert, warum das unmöglich ist. Alles andere sind nur Gerüchte.

Karl

Verfasst: 02.06.2006 09:27
von real
Decompiler sind - glaub ich - nicht wirklich verläßlich. Ich würde Assembler lernen und mittels Disassembler Informationen aus einem Binary ziehen, wenn ich sie bräuchte.

Zum Glück kenne ich keinen komplett funktionstüchtigen (also wirklich in die Originalsprache umwandelnden) Decompiler. Wäre ja noch schöner, wenn jedes Scriptkiddy meine Dateien durchwühlen könnte.

Verfasst: 02.06.2006 10:00
von Kaeru Gaman
ich kenne zwar die betreffende doktorarbeit nicht, aber ich teile die auffassung, dass es im prinzip unmöglich ist, compilate höherer programmiersprachen rück zu übersetzen.

> Wäre ja noch schöner, wenn jedes Scriptkiddy meine Dateien durchwühlen könnte.

:mrgreen: yo

vor zwanzig jahren haben wir sowas gemacht...
C64, game in den speicher geladen, vorne angefangen und nacheinander jeder Decrement durch ein Break ersetzt und ausgetestet, bis wir das richtige DEC gefunden hatten, dass die Leben abzieht... war fünf stunden geistloses gedaddele, und wohl auch eher Rainer Zufall, dass es funktioniert hat...

aber heute ist das x-mal komplizierter, weil auch die oberfläche viel empfindlicher ist. man kann nicht mehr einfach mit ner büroklammer resetten und 5 sec. später is die maschine wieder OK....

Verfasst: 02.06.2006 10:10
von Karl
Falls jemand Interesse an einem C-Decompiler hat, wird er hier fündig:

http://www.itee.uq.edu.au/~cristina/dcc/otherdcc.html

Das war glaube ich sogar das erste vernünftig beschriebene Dingens.

Gruß Karl

Verfasst: 02.06.2006 11:30
von Deeem2031
Kaeru Gaman hat geschrieben:
ts-soft hat geschrieben:Mit .NET solls wohl unter bestimmten Voraussetzungen noch einfacher sein,
da kriegste dann fast Original-Source wieder. (Nur Gerücht?) Habs mal
gehört oder gelesen.
was ja nur bedeuten kann, dass .NET garnicht optimiert,
sondern einfach geblockerten code erzeugt.
Da hat schonwieder einer nicht verstanden was JIT-Compiler tun :roll:
Man kann .Net Programme wesentlich einfacher decompileren als "normale" Programme, das liegt aber nicht daran das die Programme nicht optimiert werden, sondern das der ASM- bzw. Byte-Code wesentlich eindeutiger ist - da gibt es halt nur einen Befehl eine Variable auszulesen und nicht wie bei x86-asm hunderte Wege. Man kann sogar bei .Net die Variablennamen in dem Programm speichern, wodurch man dann praktisch den orginalen Sourcecode zurückgewinnen kann.
Aber es gibt auch Gegenmittel: Obfuscatoren - "verunstalten" den Code so das er unleserlich wird. Dann hat man ungefähr den selben Salat wie bei x86-Programmen ;)

Verfasst: 02.06.2006 14:16
von Michael Vogel
Damit man ein Gefühl kommt, wie schwer das Dekompilieren werden kann, schaut euch einmal euren in Assembler übersetzten PB-Source an:

also den Code ins Compiler-Verzeichnis kopieren und dort den Compiler mit der Option /Comment aufrufen, das Ergebnis ist interessant (da in vielen Bereichen verdammt gut optimiert wird) und komplex - wer will den wissen, wann der Speicherwert im Register eax die lokale Variable "i", wann die globale Variable "ganz-wichtig.l" und wann als Pointer auf einen String verwendet wird?

Entsprechend ist lediglich zu erwarten, dass automatisiert nur relativ kleine Module in "verständlichen" Assembler rückübersetzbar sind, ein Transformation in funktionstüchtige (nicht notwendigerweise "lesbare") Sourcen aller Art ist jedoch kein Problem.

Verfasst: 03.06.2006 20:23
von ZeHa
Das mit C++ kann man sicher auch ohne Doktorarbeit erklären :) eigentlich ja ganz einfach, der maßgebliche Unterschied zwischen C und C++ ist ja die Objektorientierung - und das ist so gesehen keine programmiertechnische Sache, sondern eine rein konzeptionelle und logische. Und woher will so ein Decompiler wissen, wie er die ganzen Objekte anlegen und hierarchisch ordnen soll? Auch Sachen wie Polymorphie sind für ein nicht humanes Etwas ein Ding der Unmöglichkeit. OOP ist ja rein eine Sache für den Programmierer, letztendlich ist alles, was mit OOP gemacht wird, auch irgendwie ohne OOP realisierbar. Vielleicht nicht immer ganz einfach aber es geht. Aber ein Programm kann natürlich (ohne "Vorwissen") niemals auf die Ideen der objektorientierten Struktur kommen und das dann alles wieder so rückübersetzen.

Verfasst: 06.06.2006 08:33
von Karl
@ZeHa: Sicher, aber bis dahin war es lediglich eine Vermutung. :)

Gruß Karl