Ich möchte nicht, dass Reverse-Engineers den Klartext von hartcodierten Strings in meiner Anwendung lesen. Die triviale Lösung dafür ist eine einfache XOR-Verschlüsselung . Das Problem ist, ich brauche einen Konverter und in meiner Anwendung wird es so aussehen:
%Vor%Gibt es die Möglichkeit, sauberen Code zu erhalten, indem Sie ein Konstrukt wie
verwenden %Vor%Es sollte auch für ziemlich lange Strings funktionieren (1000 Zeichen? :-)). Vielen Dank im Voraus
Dieser Blog bietet eine Lösung für das Übersetzen von String-Hashing in C ++. Ich denke, das Prinzip ist das gleiche. Leider muss man für jede Stringlänge ein Makro erstellen.
Perfekte Lösung existiert, hier ist es.
Ich dachte auch, das war nicht möglich, obwohl es sehr einfach ist, haben Leute Lösungen geschrieben, wo Sie ein benutzerdefiniertes Werkzeug brauchen, um die erstellte Datei danach zu scannen und nach Strings zu suchen und die Strings so zu verschlüsseln, was nicht schlecht war Ich wollte ein Paket, das von Visual Studio kompiliert wurde, und es ist jetzt möglich!
Sie benötigen C++ 11
(im Lieferumfang von Visual Studio 2015 Update 1)
Die Magie passiert mit diesem neuen Befehl constexpr
In diesem #define
Es entschlüsselt den XorString nicht während der Kompilierung, nur zur Laufzeit, aber er verschlüsselt den String nur während der Kompilierung, so dass die Strings nicht in der ausführbaren Datei erscheinen
%Vor% Es wird "this string is hidden!"
gedruckt, aber Sie finden es nicht in der ausführbaren Datei als Zeichenfolgen !, überprüfen Sie es selbst mit Microsoft Sysinternals Strings
Programm Download-Link: Ссылка
Der vollständige Quellcode ist ziemlich groß, könnte aber leicht in eine Header-Datei eingefügt werden. Aber auch ziemlich zufällig, so dass die verschlüsselten String-Ausgaben immer jede neue Kompilierung ändern, der Seed wird basierend auf der Zeit geändert, die er benötigt hat, ziemlich solide, perfekte Lösung.
Erstellen Sie eine Datei namens XorString.h
Meine bevorzugte Lösung:
%Vor%Und dann verwenden Sie Ihre bevorzugte Skriptsprache, um diese eine Quelldatei zu generieren, in der Sie die "verschlüsselten" Ressourcen speichern.
Ich denke, Sie müssen etwas tun, was bei der Verwendung von gettext (i18n) gemacht wird:
Für gettext verwenden Sie das Makro _ (), das zum Generieren des i18ned-String-Dictionary verwendet wird und die gettext-Funktion aufruft.
Übrigens musst du auch i18n verwalten :), du brauchst etwas wie:
%Vor%Sie müssen das mit Ihrem Build-System verwalten, um es wartbar zu machen. Ich mache das mit gettext ...
Meine 2 Cent
Wenn Menschen durch einfache String-Verschlüsselung interessiert sind. Ich schrieb ein Codebeispiel, das die Entschlüsselung und Markierung von Zeichenfolgen mit einem MACRO beschreibt. Ein externer Kryptorcode wird bereitgestellt, um die Binärdatei zu patchen (so werden die Zeichenfolgen nach der Programmkompilierung verschlüsselt). Die Strings werden jeweils einzeln im Speicher entschlüsselt.
Dies verhindert zwar nicht, dass die Umkehrung mit einem Debugger die Zeichenketten findet, aber es verhindert, dass Zeichenketten von einer ausführbaren Datei und einem Speicherauszug aufgelistet werden.
Ich kann das nicht kompilieren, der Compiler wirft unzählige Fehler, ich suchte nach anderen Lösungen für die schnelle Stringverschlüsselung und erfuhr von diesem kleinen Spielzeug Ссылка (war nicht schwer, erstes Ergebnis in Google für String-Verschlüsselung Schlüsselwort).
So funktioniert es:
Beispielstring "StackOverflow ist super!", der Ausgabecode (jedes Mal erzeugt er etwas anderen Code). Es unterstützt sowohl Zeichenfolgen vom Typ ANSI (char) als auch UNICODE (wchar_t)
ANSI-Ausgabe:
%Vor%UNICODE-Ausgabe:
%Vor%Jetzt weiß ich, dass es vielleicht nicht die perfekte Lösung ist, aber es funktioniert für mich und meinen Compiler.
Dies ist eine späte Antwort, aber ich bin mir sicher, dass es eine bessere Lösung gibt.
Bitte beachten Sie die akzeptierte Antwort hier .
Im Grunde zeigt es, wie man die ADVobfuscator -Bibliothek verwendet, um Strings so einfach wie:
zu verschleiern %Vor%Tags und Links macros c++ encryption reverse-engineering