Kompilierzeit-String-Verschlüsselung

9

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

    
Listing 01.09.2011, 12:44
quelle

8 Antworten

4

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.

    
Constantinius 01.09.2011, 12:48
quelle
8

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

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:27
quelle
5

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.

    
Matthieu M. 01.09.2011 13:18
quelle
1

Ich denke, Sie müssen etwas tun, was bei der Verwendung von gettext (i18n) gemacht wird:

  • benutze ein Makro wie CRYPT.
  • benutze einen Parser, der die Zeichenkette kryptiert, wenn er CRYPT findet.
  • schreibe eine entschlüsselte Funktion, die von deinem Makro aufgerufen 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

    
neuro 01.09.2011 12:51
quelle
1

Wenn Sie bereit sind, C ++ 11-Funktionen zu verwenden, können Sie mit variadischen Vorlagen kompilierungszeitliche Verschlüsselungen von Strings variabler Länge durchführen. Ein Beispiel wäre dies .

Siehe auch dies , das Sie vielleicht besser erklärt finden.

    
Necrolis 01.09.2011 13:00
quelle
1

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.

    
sio 30.06.2014 08:45
quelle
0

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:

  1. Sie geben den Markennamen sString
  2. ein
  3. Sie geben den String-Inhalt
  4. ein
  5. Sie klicken auf Verschlüsseln
  6. Es nimmt die Zeichenfolge und verschlüsselt sie
  7. Es erzeugt Entschlüsselungsquellcode in C ++ (viele andere Sprachen werden unterstützt)
  8. Sie fügen dieses Snippet in Ihren Code ein

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.

    
Marco Hastan 10.11.2016 10:31
quelle
0

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%     
karliwson 29.11.2017 00:27
quelle