Ich hab mich mal an einem Decompiler versucht. Das bisherige Resultat ist im Anhang.
Funktionsweise:
Grob gesagt wird erstmal "irgendeine" Übersetzung gesucht und diese dann immer mehr aufgehübscht.
Zuerst wird mit Mono.Cecil den IL-code eingelesen. Dann wird dieser in eine Zwischendarstelung überführt und gotos durch Referenzen und Vorgänge auf dem Stack durch Hilfsvariablen (nicht zu knapp) ersetzt. Dann werden Kostrukte wie ifs und trys gesucht. Danach werden soviele Hilfsvariablen wie möglich entfernt und kleinere verbesserungen durchgeführt. Am Schluss wird das ganze dann in einem Rutsch als Code ausgegeben.
Dieses Vorgehen hat den Vorteil, dass es auchnoch Code übersetzen kann, der sich so in c# garnicht schreiben lässt beziehungsweise so obfuskiert ist, dass Reflector einfach aufgibt, allerdings bleiben in solchen Fällen dann entsprechend viele Hilfsvariablen stehen, was die Sache nichtgrade übersichtlich macht.
Code wird oft etwas freier/kreativer übersetzt und ich habe vieles nochnicht implementiert ( ? , ?? ,++, +=,-=, etc). Das soll nicht heißen, dass diese Ausdrücke garnicht oder falsch übersetzt werden, sondern dass sie umständlicher als nötig geschrieben werden. (z.B. der ?-operator als if m it hilfsvariablen und ++ als einfache addition, oft mit hilfsvariable)
[Edit] 27.2.2011 Version aktualisiert
Screenshot
Der Begriff "Jade" taucht auch in den Namen anderer Projekte im Netz auf, ohne dass hier zwangsläufig ein Bezug bestehen muss. Es wird sich vielmehr meistens um eine zufällige Gleichheit des Namensbestandteils "Jade" handeln.
Respekt, das Ding ist echt sehr gelungen 😃
Was mir nach einem 5 Minuten Test als einziges aufgefallen ist und gefehlt hat:
Wenn man eine Klasse auswählt (keine Member davon), dass diese KOMPLETT dargestellt wird 😉
Aber ansonten echt Klasse Tool, gefällt mir irgendwie sogar mehr als Reflector... 😃
Weiter machen 😉
Klasse Tool!
Nur etwas ist mir aufgefallen:*this
ist bei dir kein Keyword.
*Wenn man Felder im TreeView auswählt, werden die nicht im Code angezeigt.
*Das springen mithilfe der Links im Code funktioniert nicht
Gefällt mir trotzdem sehr gut, das Tool!
Gruß, Christian.
Hab etwas weiter gearbeitet:
-Klammern werden jetzt korrekt gesetzt
-Felder werden jetzt auch im Code angezeigt
-Suche nach Typen eingebaut (erst oben die Lupe, doppelklick auf gewünschten Eintrag)
-Bestimmte Kombinationen aus Schleifen und Ifs verursachen keine Endlosschleife im decompiler (aufhängen) mehr.
-Updater eingebaut
@TheBrainiac
this ist bei dir kein Keyword.
Ich führe es bisher als gewöhnliche Variable, is doch ned so schlimm, wenn es in schwarz statt blau steht^^
Das springen mithilfe der Links im Code funktioniert nicht
Bei mir schon. Ich wette bei dir kam ne Warnung wegen Javascript und du hast es deaktiviert 😭
Wow tolles Tool!
Danke^^
So, ich hab mal ein neues update (über den updater, einfach ein altes jade.exe starten) rausgehauen:
Update V 3:
[Edit 21.3.2011]
Update V 4:
Der richtige ToolTip der Lupe fehlt noch. (Essentiell) 😛
Update 5 (1.0.0.5):
-Abbruchbedingung wird jetzt in den Schleifenkopf geschrieben, falls moeglich, statt des if(..)break;
-Arrayinitialisierungen aus Blobs
-Magic Numbers werden jetzt durch die entsprechenden Konstanten und im Falle von Enums auch Flags ersetzt.
-Constructoren von Delegaten werden jetzt besser angezeigt, falls moeglich. (Arbeite grade daran, dass es auch für generische Delegaten geht)
-Wenn möglich wird der Fragezeichen-Operator (cond?a:b) benutzt.
-Diverse Bugs behoben, sodass es keine Abstürtze mehr gibt beim komplettem Decompilieren von diversen Assemblies. (u.a. der Konkurrenz)
Ich hab mal ne Kommadozeilenversion erstellt, die komplette Assemblies auf die Platte dumpt. (Ich finde 1200 Methoden/sec für mscorlib kann sich sehen lassen.) Dieses Feature werde ich wahrscheinlich in die offizielle Gui-Version einbauen, in der nächsten Version.
Schick, schick...!
Ist auch geplant, den Quellcode zu veröffentlichen?
Was mir aufgefallen ist:*Der Updater wollte beim ersten Mal nicht so richtig. Es kam eine Meldung, dass er die aktuellen Dateien nicht ersetzen kann, weil sie gerade benutzt werden. Ich habe mehrmals "Retry" probiert und bin schließlich zu "Ignore" übergegangen. Danach war Jade viermal gestartet.
Nach dem zweiten Start ging's dann aber.
*Vielleicht könntest du die WebBrowser.ScriptErrorsSuppressed-Eigenschaft auf "true" stellen (bei mir sind Scriptfehler aufgetreten). *Warum nimmst du als Icons nicht die "originalen" aus der Visual Studio-Bildbibliothek? *Die Anzeige von Attributen wäre nicht schlecht.
Besten Gruß,
dN!3L
Schick, schick...!
Ist auch geplant, den Quellcode zu veröffentlichen?
Nutz doch Jade.NET um Jade.NET zu decompilieren 😃
Ist auch geplant, den Quellcode zu veröffentlichen?
Oder eine Zusammenarbeit mit dem SharpDevelop-Team an ILSpy?
Oder eine Zusammenarbeit mit dem SharpDevelop-Team an ILSpy?
genau, schließe dich dem Team an und supporte ILSpy. So wird das Wissen gebundelt und so macht nicht jeder etwas eigenes.
Hallo Floste,
ich würde mir noch eine Funktion wünschen, um ein decompiliertes Programm direkt als Projekt abzuspeichern... wäre das irgendwie (und irgendwann) mal möglich (oder ist es das sogar schon und ich find diese Funktionalität einfach net?)?
so far
Karill
Nutze Jade.NET seit einigen Wochen intensiv bei meiner Arbeit. Klasse Tool.
Kriegt man die switch-Anweisungen noch schöner hin? Das ist in der 1.0.0.7 goto-Salat 😃