Hallo,
also wie es aussieht, gibt es keinen kostenlosen Code Obfuscator für .NET 2.0, außer dem Dotfuscator, der beim VS 2005 dabei ist. Allerdings funktioniert der nicht. "Skater .NET Obfuscator Light Edition" (Freeware) sieht genauso "mächtig" aus, funktioniert aber auch nicht. In beiden Fällen lässt sich das Ergebnis nicht mehr starten. Dumm, jeder Compiler wird besser getestet und arbeitet zuverlässiger.
Was mich aber nun interessiert ist, manche Obfuskatoren werben damit, Methoden/...-Namen nicht mit dem üblichen "asdfg1" zu ersetzen, sondern mit "?" oder "$". Außerdem haben in den gezeigten Screenshots alle Bezeichner den gleichen Namen, weshalb sich das Ergebnis auch nicht wieder rekompilieren lassen soll. Dadurch werden Bezeichner nicht mehr identifizierbar und eine Code-Analyse wird (bei gleicher Methodensignatur) vollends unmöglich (im Gegensatz zu "asdfg1", wo eine Analyse nur erschwert wird).
Wie soll das funktionieren? Wenn alle Bezeichner den selben Namen bekommen, kann doch auch IL-Code nicht mehr funktionieren. Oder gibt's da einen Trick? Eigentlich sollte es doch keine große Zauberei sein, mit .NET-Mitteln ein Assembly zu laden, die Bezeichnernamen zu verändern und das ganze wieder zu speichern. Hat sich schonmal jemand an sowas versucht? Ich hab mit dieser Art von Reflection (?) leider noch keine praktische Erfahrung und muss daher etwas in Blaue hineinraten. Aber so ein einfacher "$ifyer" wär schonmal ein interessantes Projekt.
Hallo LonelyPixel,
die meisten deiner Fragen sollten in der FAQ beantwortet sein: [FAQ] .net Assembly vor Disassembling schützen
Wie es geht, dass die Bezeichner gleich lauten, habe ich schon mal gelesen, kann mich aber leider nicht mehr erinnern. Es geht jedenfalls. 🙂
herbivore
Ich hab mir jetzt die Mühe gemacht, alle im FAQ angegebenen Quellen auszuwerten. Zusammenfassend geht es darum, was Obfuscating ist, kann, nicht kann, und dass es kein kostenloses Produkt gibt (außer Dotfuscator CE), das bei mir aber nun nicht funktioniert.
Von der Möglichkeit, gleiche Bezeichnernamen mehrfach zu verwenden, wodurch Obfuscating erst richtig interessant wird, ist dort nirgendwo etwas erwähnt. Das Programm nLite wird als ein solcher Fall erwähnt, und es hat tatsächlich (laut .NET Reflector) keine lesbaren Bezeichner. Hat hier jemand Ahnung davon, wie sowas funktioniert? Oder hat sich jemand generell schonmal damit beschäftigt, wie solche Programme funktionieren? Lösungen, die den Code verschlüsseln, unportabel übersetzen oder komprimieren, finde ich jetzt nicht so interessant, da sie teilweise wieder erhebliche Nebenwirkungen haben.
Overload induction is Preemptive Solutions' name for its patented technique of changing variable names in the intermediate code (Obfuscators never touch source code, nor even need to reference it.) It takes advantage of the fact that the same identifier name can be used for classes and methods with different signatures. And within different namespaces, variables can use the same name without colliding. Dotfuscator exploits these lexical features to rename as many items as possible to the letter 'A.' The company claims that on some code 33% of references can be renamed to A and another 10% to B. This transformation makes disassembled code extremely hard to understand. http://www.devx.com/MicrosoftISV/Article/11351
Erfahrungswert aus der Praxis, wenn z.B. die Methodennamen gleich heißen sollen oder die Variablen, ist normalerweise immer "Preserve" (beibehalten) als entsprechende Option auszuwählen.
Seit der Erkenntnis, dass der Mensch eine Nachricht ist, erweist sich seine körperliche Existenzform als überflüssig.
Naja, 33% "A" und 10% "B" ist nicht ganz das, was ich meinte.
Ich hab jetzt nochmal mit dem .NET Reflector in nLite reingeschaut und die ganzen einzelnen Rechtecke (die 100% der Bezeichner ausmachen) rauskopiert, um sie im Hex-Editor anzuschauen. Das Ergebnis hätte simpler nicht sein können: Die Bezeichner erhalten ASCII-Werte ab 1 beginnent, also heißt der erste Namespace 0x01, der nächste heißt 0x02, usw. Mit den Methodennamen ist es wohl ähnlich. D.h. dass sich diese Umbenennung vieler Methoden auf vermeintlich den gleichen Namen mit Obfuscator-Technik auch wieder in sichtlich unterscheidbare Namen ändern ließe, was den zunächst enorm scheinenden Vorteil wieder relativiert. Aber der Effekt ist dennoch gut, und auf die Schnelle haben es auch Gedächtniskünstler schwer, den Code nachzuverfolgen.