Ist es wichtig, den C ++ - Anwendungscode zu verschleiern?

11

In der Java-Welt scheint es manchmal ein Problem zu sein, aber was ist mit C ++? Gibt es verschiedene Lösungen?

Ich habe darüber nachgedacht, dass jemand die C ++ - Bibliothek eines bestimmten Betriebssystems durch eine andere Version derselben Bibliothek ersetzen kann, aber voller Debug-Symbole, um zu verstehen, was mein Code tut. Ist es nicht gut, Standard- oder beliebte Bibliotheken zu verwenden?

Dies kann auch passieren, wenn eine DLL-Bibliothek unter Windows durch die "Debug-Version" dieser Bibliothek ersetzt wird. Ist es besser, statische Kompilierung zu bevorzugen? In kommerziellen Anwendungen sehe ich, dass sie für den Kern ihrer App alles statisch kompilieren und zum größten Teil die DLLs (dynamische Bibliotheken im Allgemeinen) verwendet werden, um einige Technologien von Drittanbietern wie Anti-Piraterie-Lösungen anzubieten (ich sehe dies in vielen Spielen ), GUI-Bibliothek (wie Qt), Betriebssystembibliotheken usw.

Entspricht die statische Kompilierung der Verschleierung in der Java-Welt? Ist es besser gesagt die beste und kostengünstigste Lösung, um Ihren Code zu schützen?

user827992
quelle
4
Denken Sie daran, was auch immer Sie tun, jemand mit zu viel Zeit wird in der Lage sein, es zu deobfuscieren / dekompilieren
Zavior
13
Viele Compiler verfügen über einen /OVerschleierungsschalter. Einige haben sogar mehrere Verschleierungsstufen, bis zu /O3;)
MSalters
@ MSalters Nein, g ++ hat -O3;)
BЈовић
@Zavior Oder einfach rückentwickeln, schlicht und einfach. Es erfordert nicht einmal die Binärdatei selbst, sondern nur eine gründliche Analyse der Software.
John Weisz

Antworten:

27

Verschwenden Sie Ihre Zeit nicht damit, Schlachten zu verlieren

Wie in vielen anderen ähnlichen Antworten für C ++ und andere Sprachen erwähnt, ist dies meistens nutzlos .

Weiterführende Literatur

Ausgewählte Lesungen zum Thema (nicht alle sind C ++ - spezifisch, es gelten jedoch die allgemeinen Grundsätze):

StackExchange-Antworten

Papiere

Berühmte Zitate zur Verschleierung:

Dann gibt es endlich diese Frage des Datenschutzes. Dies ist eine verlorene Sache. Es gibt keine Transformation, die einen entschlossenen Hacker davon abhält, Ihr Programm zu verstehen. Dies gilt für alle Programme in allen Sprachen. Dies gilt nur für JavaScript, da es in Quellform geliefert wird. Der durch die Verschleierung gewährte Datenschutzvorteil ist eine Illusion. Wenn Sie nicht möchten, dass andere Benutzer Ihre Programme sehen, trennen Sie den Server vom Computer. - Douglas Crockford


Noch nie?

Ich sage nicht, dass Sie niemals verschleiern sollten und dass es keine guten Gründe dafür gibt, aber ich bezweifle ernsthaft die Notwendigkeit in den meisten Fällen und die Kosteneffizienz.

Darüber hinaus gibt es Situationen, in denen eine Verschleierung de facto erforderlich ist. Wenn Sie beispielsweise Viren schreiben, ist eine Verschleierung (und vorzugsweise eine dynamische) für das Überleben Ihres Programms ebenso gut wie die Fähigkeit zur Replikation. Dies ist jedoch kaum ein "häufiger" Fall ...

Haylem
quelle
Wir haben einmal einen Hardware-Dongle verwendet, für den eine Lizenzierungsanforderung bestand, um alle Dongle-Funktionsaufrufe zu verschleiern - und sie haben ein Tool dafür bereitgestellt. Hat mich immer ein wenig misstrauisch gemacht in Bezug auf die Qualität ihres "Schutzes"!
Martin Beckett
@ MartinBeckett: ein bisschen komisch in der Tat.
Haylem
3

Nein, das ist die Mühe nicht wert und ich denke, es ist völlig unnötig. Die von Ihnen aufgerufenen Funktionen lassen sich wahrscheinlich anhand der von Ihnen bereitgestellten Funktionen erraten.

Der Grund, warum für Java Verschleierer existieren, liegt darin, dass die Zuordnung zwischen Java-Bytecode und Java-Quellcode ziemlich gut definiert ist und die Namen aller Funktionen und Elementvariablen im Bytecode gespeichert sind (unabhängig davon, ob sie öffentlich, privat oder geschützt sind ), so dass ein Java-Bytecode-Interpreter generisches Java darstellen kann, das die Struktur der ursprünglichen Quelle für eine nicht verschleierte Quelle ziemlich gut zeigt.

C ++ wird direkt in die Maschinensprache kompiliert. Es kann zerlegt werden, aber die Assemblersprache ist ziemlich mühsam zu handhaben. Die Dekompilierung ist viel schwieriger, da alle Optimierer während der Kompilierung Änderungen am Code vornehmen.

James McLeod
quelle
0

Wenn man darüber nachdenkt, gibt es verschiedene Arten der Verschleierung. Beginnen wir mit der Verschleierung des Quellcodes, was eine völlige Zeitverschwendung darstellt. es ist schwer genug zu verstehen ohne das! Konzentrieren wir uns stattdessen auf die Verschleierung des Lieferpakets und darauf, wie der Code an den Benutzer geliefert wird.

Kleinere Verschleierung

Es gibt eine geringfügige Verschleierung, um zu verhindern, dass der Gelegenheitsbenutzer seine Finger hineinsteckt und Dinge leicht zerbricht. Es hält den entschlossenen Hacker nicht fern, aber es ist wertvoll, um sicherzustellen, dass die Dinge, die Sie unterstützen sollen, das sind, was Sie tatsächlich geliefert haben. Das Schutzniveau, das für solche Dinge erforderlich ist, ist wirklich ziemlich niedrig; Das Lieferpaket muss lediglich nicht lesbar und bearbeitbar aussehen (ohne Spezialwerkzeuge), und das ist ziemlich gut genug.

Die Javascript-Minimierung ist ein Beispiel dafür, obwohl sie nicht als solche vermarktet wird. Niemand, der bei klarem Verstand ist, möchte eine minimierte JS-Datei lesen und bearbeiten, auch wenn dies technisch durchaus möglich ist, wenn Sie entschlossen / hartnäckig genug sind.

Ähnliches gilt für die Bereitstellung von Java-Anwendungen. Das bloße Packen des Codes in eine ausführbare JAR wird die meisten Dummheiten aufhalten, obwohl es die ganze Kraft eines höflichen "Please Keep Off The Grass" -Schilds in einem Stadtpark hat.

Selbst bei der Bereitstellung von C ++ - Code reicht es aus, die unnötigen Symbole aus der ausführbaren Datei zu entfernen, um als geringfügige Verschleierung zu gelten. Der Schlüssel ist, dass es umständlich ist , das Ergebnis als Benutzer zu lesen, aber kein Problem, es als Computer auszuführen.

Hauptverschleierung

Eine große Verschleierung besteht darin, den entschlossenen und sachkundigen Benutzer fernzuhalten. Es ist auch ein total verlorenes Spiel; Wenn ein Computer es ausführen kann, kann eine Person es auseinander nehmen und herausfinden, was es tut. Das Beste, was Sie bekommen könnten, wäre, das Programm dazu zu bringen, sich kontinuierlich zu entschlüsseln und das, was es zu einem Zeitpunkt tut, in eine völlig andere Sache umzuwandeln, die es zu einem anderen Zeitpunkt tut. Das Erstellen eines solchen Dings wäre ziemlich schwierig und würde einen wirklich guten Hacker immer noch nicht davon abhalten (obwohl sie am Ende wirklich ziemlich böse auf Sie wären, wenn der Aufwand erforderlich wäre, um all diesen selbstmodifizierenden Code zu entschlüsseln).

Es ist viel besser, in anderen Lösungen zu denken. Sie können beispielsweise die „Kronjuwelen“ des Codes auf Servern behalten, die Sie steuern, und nur Serviceanrufe zulassen, wodurch der Client zu einem im Wesentlichen kostenlosen Werbegeschenk wird, das ein Front-End für die wertvollen Teile darstellt. Oder Sie gehen den vertraglicheren / rechtlicheren Weg und übergeben ausführbare Dateien nur an Organisationen, die sich formell damit einverstanden erklären, nicht in Ihrem Code herumzustöbern oder Sie zu entschädigen, wenn sie dies tun (das wäre also eine Art NDA). Ziel wäre es, einen starken Anreiz für den Hacker zu schaffen, nicht zu hacken, und für die Benutzer, den Code von Hackern fernzuhalten, die nicht an die Vereinbarung gebunden sind.

Sie dürfen jedoch nicht davon ausgehen, dass Ihr Code niemals geknackt werden kann. Mit der Virtualisierung kann jeder Programmstatus einer Ausführung untersucht und verfolgt werden, und alles, was versucht, dies zu verhindern (z. B. die Verfolgung der Uhr zu einer externen Zeitquelle), verursacht mit größerer Wahrscheinlichkeit Probleme für legitime Benutzer als für Hacker. (In der Geschichte von DRM erfahren Sie, wie selbst sehr entschlossene Herausgeber von Informationen ihre Systeme nicht mehr schützen können, wenn der Code in den Händen ihrer Gegner liegt.) Es ist viel besser, sich darauf zu konzentrieren, legitime Benutzer tatsächlich glücklich zu machen. Die Verluste durch gelegentliche Risse sind nichts im Vergleich zu dem zusätzlichen Geld, das durch die ordnungsgemäße Zufriedenheit der Kunden eingebracht wird.

Donal Fellows
quelle