C ++: Wie können Strings zur Kompilierzeit verschlüsselt werden?

9

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.

    
Newbie 04.11.2010, 23:25
quelle

8 Antworten

11

Sie können es mit Makros verschlüsseln oder Ihren eigenen Präprozessor schreiben

%Vor%     
tga 05.11.2010, 00:08
quelle
4

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

geschieht dies durch Magie %Vor%

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

%Vor%     
SSpoke 24.01.2016 20:24
quelle
1

Sie können Strings (String-Literale) nicht mit einem С ++ - Compiler oder Präprozessor verschlüsseln, aber Sie können ein Pre-Build-Tool schreiben, das Ihren Quelltext analysiert und Strings verschlüsselt.

Oder Sie können versuchen, boost :: mpl :: string zu verwenden.

    
Abyx 04.11.2010 23:37
quelle
1

Über die einzige Möglichkeit, genau zu tun, was Sie vorschlagen, ist ein wirklich schreckliches Makro zu schreiben. Aber hier sind einige Alternativen.

  1. Speichern Sie die verschlüsselten Zeichenfolgen in einer Datendatei.
  2. Sammeln Sie die Strings in einer einzigen Quelldatei, dann im Build, vor dem eigentlichen Kompilieren, gehen Sie mit einem Werkzeug darüber, das sie verschlüsseln wird (z. B. sed). Sie können diesen Schritt automatisieren.
  3. Verwenden Sie einen leistungsstarken Editor, mit dem Sie die Zeichenfolgen mühelos während der Arbeit verschlüsseln / entschlüsseln können.
Beta 04.11.2010 23:40
quelle
1

Wenn Sie nur versuchen, die Zeichenfolgen zu verstecken, dann könnten Sie einfach versuchen, Ihre ausführbare Datei mit etwas wie UPX zu komprimieren.

>     
gwell 04.11.2010 23:56
quelle
0

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.,

    
Cheers and hth. - Alf 04.11.2010 23:38
quelle
0

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.

    
Mark Storer 04.11.2010 23:52
quelle
0

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).

    
Toby Speight 03.11.2017 09:56
quelle

Tags und Links