2011-01-06 8 views
0

Ich habe vor kurzem über Code-Verschleierung erfahren. Es ist eine nette Sache zu tun, wenn Sie Freizeit haben, aber ich habe andere Frage. Warum es tun?Verwendung von Code-Verschleierung in verschiedenen Sprachen

Erstens gibt es Sprachen, in denen ich sicher bin, dass es eine tolle Sache ist - interpretierte, wie PHP, JavaScript und vieles mehr. Da scheint es eine gute und sicherere Sache zu sein.

Zweitens gibt es Sprachen, in denen dies scheint keine wirkliche Wirkung für mich zu haben - alle kompilierten Sprachen nativen Code. Nimm zum Beispiel C. Wenn sie kompiliert werden, verschwinden alle Variablennamen, Funktionsnamen und die meisten Verschleierungstechniken. Wenn einige es in nativen Code machen können, wäre es Dinge wie Rekursion statt für Zyklen und so, aber disassemblierter Code wird sowieso anstelle von Namen einige Disassembler-generierte Identifikatoren haben, oder?

Und letzte Kategorie sind Sprachen, über die ich mir nicht ganz sicher bin. Und das ist der Hauptgrund, warum ich frage. Diese Sprachen wären Java, C# (.NET) und das letzte in WP7 verwendete Silverlight. Ich frage, weil ich einen Artikel gelesen habe, der besagt, dass Code-Verschleierung bei WP7-Apps dazu beiträgt, dass Code nicht gehackt wird. Aber ich dachte immer, dass Byte-Code den Standard-Assembler-Codes sehr ähnlich ist und daher auch keine Informationen über echte Variablennamen, Funktionsnamen usw. vor der Kompilierung enthält. Also, wo ist die Wahrheit?

+4

Die Wahrheit ist, dass Sie es nicht tun, es sei denn, Sie sind gelangweilt und in diese Art von Zeitvertreib oder sind ein Paranoiker, der denkt, dass die ganze Welt versuchen wird, ihre Super-Duper-innovative Ideen zu stehlen. Und die "Sicherheit", die es bringt, ist nicht da, es ist ein falsches Gefühl der Sicherheit, ähnlich dem, das von "Sicherheit durch Dunkelheit" beschrieben wird. – delnan

Antwort

2

Tun Sie es, wenn Sie wollen, aber erwarten Sie nicht, dass irgendeine entschlossene Person davon verschreckt wird. Es gibt De-Obfuscatoren, die Leute können auch verschleierten Code lesen (genauso wie es Leute gibt, die optimierte Assembly lesen und den ursprünglichen C-Code rekonstruieren können). Code-Verschleierung gibt Ihnen nur ein falsches Gefühl der Sicherheit und kann eine Person, die nur neugierig ist, abschrecken (anstatt diejenigen abzuhalten, die es ernst meinen mit dem Diebstahl Ihres Codes). Alles, was es dir gibt, ist ein falsches Gefühl der Sicherheit, aber kein wirkliches. Schneier nennt dieses "Sicherheitstheater" treffend.

Ja, viele moderne Sprachen, die mehr Informationen über die Quelle enthalten, können besser verschleiert werden als solche, die direkt mit Maschinencode kompiliert werden. Für Letzteres macht der Compiler bereits eine gute Arbeit mit der Optimierung. Ihre Vorstellung von Bytecode, die dem traditionellen Assembler ähnelt, ist hier etwas falsch. Vor allem .NET-Bytecode enthält genügend Metadaten, um die Originalquelle nahezu exakt zu rekonstruieren (siehe Reflektor). Was dort nicht beibehalten wird, sind die Namen der lokalen Variablen und Argumente der Methoden. Sie benötigen und behalten jedoch weiterhin die Methoden- und Klassennamen.

Ein weiteres Problem, das Sie beachten sollten: Wenn Sie Ihren Kunden eine verschleierte ausführbare Datei geben und Ihr Programm abstürzt, stellen Sie sicher, dass Sie eine Möglichkeit haben, den echten StackTrace statt des verschleierten zurückzubekommen. "Entschuldigung, ich kann die Ursache nicht bestimmen, warum mein Programm Stunden Ihrer Arbeit gekostet hat, seit ich beschuldigt habe, es zu verschleiern" wird es nicht schneiden, ich denke:

+0

Nun, zuerst danke. Ich bin eher ein "Student" als Entwickler. Ich interessiere mich hauptsächlich für HW als SW, und ich schreibe meistens in C oder Assembler von hochpräzisen MCU Timings. Ich musste hauptsächlich wissen, ob es wirklich Vorteile gibt, dies auf bytecodierten Plattformen zu tun. Und ich muss sagen, ich bin sehr überrascht von Ihrer Antwort, dass .net Metadaten speichert, um die ursprüngliche Quelle fast zu rekonstruieren. Warum? Ich tendiere immer dazu, nach dem logischen Zweck der Dinge zu suchen. Sie wissen, das Lesen von Assembly ist eine Sache, aber in der Lage zu sein, Code fast alles zu rekonstruieren ist anders. –

+0

@ B.Gen: Beachten Sie, dass der Bytecode nur der erste Schritt zum ausgeführten Code ist.Es gibt immer noch einen Just-in-Time-Compiler, der nativen Code erzeugt. Warum so viele Metadaten beibehalten werden, weiß ich nicht genau. Aber einige davon könnten für die Interoperabilität mit anderen .NET-Sprachen sein, einige könnten für die Debugging-Unterstützung (wie das Markieren von Compiler- oder Tool-generiertem Code) etc. sein. Reflector ist auch in der Lage, die Ausdrucksbäume von LINQ-Ausdrücken zu rekonstruieren Beim Bytecode bleiben nur statische Methodenaufrufe und Lambda-Funktionen erhalten. – Joey

0

Verschleierung ist eine übliche Technik für mobile Anwendungen, bei denen Sie Hardware-Beschränkungen haben. Verschleierter Code neigt dazu, kürzere Bezeichner und daher kleinere Binärdateien zu haben.

+0

Warte, wat? Wie bereits in der Frage, entfernt die native Kompilierung sowieso alle Kennungen. Plus, kommt nicht einmal annähernd auf die Frage zu beantworten. – delnan

+0

Java ist keine Muttersprache! – Navi