Kann man "zurückcompilieren" [was: Frage]



  • Wenn man Programme disassemblieren will, sollte man sich schon ein wenig mit der Assemblersprache der verwendeten Prozessor-Architektur auskennen. Ich denke, wenn man einfach (und auch das geht nicht "einfach"!) von einer Binary nach C++ übersetzen lässt, wird sich die entstandene Source von der originalen so unterscheiden, als ob man ein Gedicht mit einem zweitklassigen Internet-Übersetzungstool in zwei andere Sprachen übersetzten lässt und dann wieder zurück in die Originalsprache.

    /*edit: Ich sehe gerade dieser sinnlose Kommentar war bereits mein 300. in diesem Forum! */



  • (komisch, alle anderen auch ;))

    Also Decompiler haben, wie elise schon meinte, das Problem, daß beim Kompilieren sämtliche Namen weg sind.

    Wenn ein Decompiler es denn schafft, ein Programm zu erstellen, würdest ungefähr sowas erhalten:

    int main (int variable1, char **variable2)
    {
         char variable3[32];
         cout << "Wie heißen Sie?";
         cin >> variable3;
         cout << "Hallo " << variable3 << "\n";
         return 0; 
    }
    

    Möglicherweise nichtmal das.
    Ich hatte mal einen C-Decompiler und der hatte dann aus dem "printf ()" nen "function_call("string"); " gemacht. seeehr aussagekräftig das.

    Wenn du Software lesen willst, lern Assembler. Das ist deine einzige Chance..



  • Nen guter Decompiler (generiert C-Code) ist Boomerang, aber ich weiß nicht wie C++ Code mit dem dann aussieht (wegen Konstruktoren usw.).



  • elise schrieb:

    in java ja, in c++ ... na ja, alles ist realtiv.

    die namen sind aufgelöst, heißt: du hast nach dem decompilieren im grunde nur adressen.. sprich: zahlen.. (mal ganz grob gesprochen)

    also erwarte nicht, dass der quellcode in reinform wieder hergestellt wird.

    ps: du fragst nach einem programm.. hmm hier die richtung, weiter googlen
    http://de.wikipedia.org/wiki/Disassembler

    hi wieso kann man für die adressen nicht einfach wieder namen generieren?? 😕



  • Der Disassembler kann ja nicht wissen wie die einzelnen Adressen vor der Compilierung benannt waren. Er muß den Adressen dann selber Namen übergeben und die werden nicht sehr aussagekräftig sein können.



  • ja aber ist doch übersichtlicher wenn man im source code ein namen a hat als 0x12345678 ß?? 😕



  • aber kann man aus so einem disassembler code überhaupt wieder c machen?? das geht doch bestimmt ned so gut??? 😕



  • Einen Namen kann man zuweisen. Es ist halt keiner der Dir was über den Zweck der Adresse sagt.

    Prinzipiell kann man wieder C daraus machen. Nur halt ein sehr kompliziert zu lesendes Programm. Der Decompiler kann nichts über den Zweck des Programmes wissen und übersetzt es deshalb so wie er es vorfindet. Also so wie es der Compiler umgesetzt hat.
    Vieles dazu findest Du hier:
    http://www.program-transformation.org/Transform/DeCompilation



  • console33 schrieb:

    ja aber ist doch übersichtlicher wenn man im source code ein namen a hat als 0x12345678 ß?? 😕

    Aber nicht aussagekräftiger.

    aber kann man aus so einem disassembler code überhaupt wieder c machen?? das geht doch bestimmt ned so gut???

    Ding ding, du hast das Problem erkannt. Schon alleine die Tatsache, dass aus jeder Schleife gotos gemacht werden macht eine rückcompilirung schwer bis unmöglich.

    Eine Ausnahme gibt es aber : Wenn ein Program mit Debuginformationen übersetzt wurde dann können die sehr helfen. Zum Beispiel werden sie wahrscheinlich die original Namen enthalten und weggeinlined ist auch nichts.



  • Aloha,

    Du kannst alle Disassemblierer vergessen. Das ist mehr oder minder alles Schrott, was Du geliefert bekommst und zwecks weiterverarbeitung absolut unnütz.
    Ist auch völlig egal ob Debug oder Release.

    Wozu benötigst Du denn eine Decompilation ???

    Grüße

    BOA



  • Wozu benötigst Du denn eine Decompilation ???

    *lol*
    "Da kommen immer so doofe Aufforderungen wie: Geben Sie Ihren Reg Code ein! Das Feature brauche ich aber nicht und wollte es entfernen;-) "

    greetz
    Gaunt



  • Das Thema hatten wir schon so oft, daher gibt es ja den FAQ Eintrag. 🙄



  • Gaunt schrieb:

    Wozu benötigst Du denn eine Decompilation ???

    *lol*
    "Da kommen immer so doofe Aufforderungen wie: Geben Sie Ihren Reg Code ein! Das Feature brauche ich aber nicht und wollte es entfernen;-) "

    greetz
    Gaunt

    Dafuer brauchst du doch nicht gleich Disassemblieren 🙄
    das schaffst du im Normalfall mit Bankkonto & e-banking 🙂



  • BOA schrieb:

    Aloha,

    Du kannst alle Disassemblierer vergessen. Das ist mehr oder minder alles Schrott, was Du geliefert bekommst und zwecks weiterverarbeitung absolut unnütz.
    Ist auch völlig egal ob Debug oder Release.

    Wozu benötigst Du denn eine Decompilation ???

    Grüße

    BOA

    Schau dir mal die Disassemblys von Softice an, dann sagst du so etwas nicht mehr :p

    Naja also die heutigen Disassembler können schon viele Standardfunktionen identifizieren und haben oft auch die Möglichkeit, dass man sie mit Debugsymbolen füttert.

    Selbst dumpbin das bei meinem VC mitgeliefert ist produziert sehr gute Disassemblys die man auch noch wirklich verstehen kann.



  • @User---
    Wenn die Funktionen nicht statisch gelinkt sind, kannst du sie ja auch identifizieren, da eine dynamische Library ja eh die Symbole (Namen) der Funktionen exportieren muss 🙂

    Mit einem Debugger, der einen Disassembler integriert hat, kann man definitiv gut reverse engineern. Zumindest um sich bestimmte Code stellen gefügig zu machen 😉


Anmelden zum Antworten