Ich möchte einige Strings in meiner .exe verstecken, damit die Leute nicht einfach einfach die .exe öffnen und alle Zeichenfolgen dort anschauen können. Mir ist die Stärke der Verschlüsselungsmethode egal, deshalb werde ich wahrscheinlich XOR usw. verwenden.
Wie kann ich dies zur Kompilierzeit machen? Auf diese Weise werden meine Strings nicht in der .exe gespeichert, sondern in den verschlüsselten Versionen. Dann würde ich jedes Mal meine Entschlüsselungsfunktion verwenden, um diese Zeichenfolgen auf dem Bildschirm anzuzeigen.
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
Über die einzige Möglichkeit, genau zu tun, was Sie vorschlagen, ist ein wirklich schreckliches Makro zu schreiben. Aber hier sind einige Alternativen.
Unabhängig von den Details Ihrer Lösung werden die Strings mit einem Verschlüsselungsprogramm verschlüsselt.
Sie könnten ein Skript schreiben, um Literale in Ihrem Quellcode zu verschlüsseln.
Oder für eine Windows-Exe können Sie Literale in einer [.rc] -Datei verschlüsseln, indem Sie die Strings als String-Tabellenressource in die exe einbetten.
Aber wahrscheinlich ist die beste Lösung, kein Verstecken auszuprobieren.
Als Microsoft versuchte, den XOR-Trick mit dem Windows-Code auszutricksen, der willkürlich davor warnte, dass Nicht-Microsoft-DOS-Dateien unzuverlässig und inkompatibel mit diesem und jenem seien, wurde es nur auf sie zurückgestoßen. Natürlich war die Idee, schlechte Dinge über Mitbewerber zu sagen und dieses Schimpfwort mit Windows zu bündeln, in erster Linie eine wirklich dumme Idee. Aber der Versuch, den Code zu verstecken, machte es zu einer öffentlichen Verlegenheit: Niemand hatte wirklich die Warnungen des Codes bemerkt, aber als die Leute "verschlüsselten" Code entdeckten, war ihre Neugier natürlich geweckt, sie mussten nur herausfinden, was es war und schreibe Artikel darüber.
Prost & amp; hth.,
Jede Crypto-Datei, die zur Kompilierzeit erstellt wird, muss auch in der rohen EXE-Datei rückgängig gemacht werden können (es sei denn, Sie tun etwas wirklich Seltsames). Und deine App läuft auf ihrer Hardware. Verdammt ... DRM gesperrt, was (in meinen Augen) böse ist.
Dies trifft wahrscheinlich nicht auf den uralten Compiler der Frage zu, aber auf moderneren C ++ - Implementierungen können wir eine Zeichenfolge literale Operatorvorlage verwenden, die mit constexpr
deklariert wird, um die Kompilierzeit zu implementieren Verschleierung. Dafür habe ich GCC 7.2.0 mit -std=c++17
(und selbstverständlich eine ganze Reihe von Warnoptionen) verwendet.
Zuerst definieren wir einen Typ, der unsere verschleierten String-Daten enthält, mit einem Konvertierungsoperator, um auf Anforderung eine Klartext-Zeichenkette zu erzeugen:
%Vor%Nun die literale Operatorvorlage zum Konvertieren eines Quelltextliterals in eine verschleierte Zeichenfolge:
%Vor%Um zu demonstrieren:
%Vor% Wir können den Objektcode mit dem Programm strings
untersuchen. Die Binärdatei enthält nirgendwo squeamish ossifrage
. stattdessen hat es rptd'lhri!nrrhgs'fd
. Ich habe dies mit einer Reihe von Optimierungsstufen bestätigt, um zu zeigen, dass die Konvertierung zurück zu std::string
nicht vorberechnet wird, aber ich rate Ihnen, Ihre eigenen Tests durchzuführen, wenn Sie Compiler und / oder Einstellungen ändern.
(Ich ignoriere absichtlich, ob dies eine ratsam Sache ist - lediglich eine technische Arbeitslösung zu präsentieren).
Tags und Links c++ windows visual-studio-2008