Confuser is Confusing
Der Confuser, welchem dieser Post gewidmet wird, ist ein Open Source Obfuscator für .NET Assemblies. Der allzu bekannte DeObfuscator De4Dot unterstützt Confuser nicht, und wird es auch in Zukunft nicht. Ein Alternativprojekt namens DeConfuser ist zwar vorhanden, allerdings deckt es nur wenige Funktionen ab und funktioniert (zumindest bei mir) in der aktuellen Version überhaupt nicht.
Dieser Blogpost wird, ähnlich wie schon beim InterCafe RE, eine Gedankensammlung und Writeup sein. Denn wie schon Kleist in seinem Aufsatz “Über die allmähliche Verfertigung der Gedanken beim Reden” meint:
Probleme, die nicht durch Meditation lösbar sind, sind dadurch zu lösen, indem Man mit anderen darüber spricht
Genug des Exkurses, gehen wir ans Reversen. Das Problem sind zunächst die unleserlichen Strings. So sieht eine Crypto-Funktion z.B. so aus:
Im Normalfall könnte man mit dem EasyAssemblyRenamer das alles umbenennen, was im Normalfall auch kein Problem darstellt, aber wir stoßen hier auf das Problem des Proxy-Systems.
Ein Proxy-System ist schonmal bei CLISecure besprochen worden. Alle Funktionen liegen nur als Delegates (Funktionszeiger) vor und werden zur Laufzeit befüllt. Hier z.B. der .cctor (Typeninitialisierer, nicht mit .ctor, dem Konstruktor zu verwechseln) eines normalen Delegates:
L_0000: ldtoken class AAAA::BBBB:C L_0005: call void ::ResolveFieldFunctionObfuscator(valuetype [mscorlib]System.RuntimeFieldHandle) L_000a: ret |
Die Funktionen und Feldnamen sind natürlich umbenannt. Es wird auf jeden Fall dieses sog. RuntimeFieldHandle ausgelesen und an folgende Funktion übergeben:
Die Klasse RuntimeFieldHandle hat als einziges Feld ein Member namens “Value”. Diese wird, sobald die Assembly mit Mono.Cecil neu gebuilded wurde null. Extremst uncool, ja. Wer soweit noch folgen konnte weiß auch was das Bedeutet. Es kann kein Feld (bzw Methode) abgerufen werden, sondern es kommt zu einer Exception.
Meine Idee ist nun die ganzen RuntimeFieldHandles zu Dumpen und “hardcoded” eintragen, dann sollte die Assembly modifizierbar sein. Und ob das funktioniert wird dann ihm nächsten Post erläutert ^^
Greez Easy
Moin !, generell sei gesagt das das confuser Projekt von jemand anderen aufgenommen wurde bzw der Code wurde übernommen und ein Deconfuser 2 wurde erstellt -> http://deconfuser2.codeplex.com/
Erstmal danke für die Info! Hab mir grad Confuser2 angeschaut, scheint in die richtige Richtung zu gehen. Confuser2 entfernt jeweils die .cctor-Funktionen, dann kommt es zu einer Exception :/ Ich denke da viel mit dem Proxysystem in .cctor gemacht wird kommt Confuser2 damit (noch) nicht klar. Mal schauen, bin auf jeden Fall weiter dran