Compile-time string encryption
Will ich nicht reverse-Ingenieure zu Lesen, die nur-text-der die Saiten in meiner Anwendung. Die triviale Lösung ist die Verwendung eines einfachen XOR-Verschlüsselung. Das problem ist ich brauche einen Konverter und meine Bewerbung wird wie folgt Aussehen:
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = XStr( 0x06, 0x15, 0x9D, 0xD5FBF3CC, 0xCDCD83F7, 0xD1C7C4C3, 0xC6DCCEDE, 0xCBC2C0C7, 0x90000000 ).c();
Gibt es die Möglichkeit zu pflegen, clean code, indem es etwas zu konstruieren wie
//Before (unsecure)
char * cString = "Helllo Stackoverflow!";
//After (secure)
char * cString = CRYPT("Helllo Stackoverflow!");
Sollte es auch für sehr lange strings ( 1000 Zeichen? 🙂 ). Vielen Dank im Voraus
- Gut funktioniert es, wenn Sie es versuchen?
- Natürlich nicht. Die Frage ist ganz klar: gibt es einen Mechanismus, evtl. mit Makros, damit es funktioniert? Keine blöde Frage an alle – soweit ich weiß, gibt es keine genaue Lösung, aber man kann ziemlich nahe mit Vorlagen.
- Bitte beachten Sie, dass diese Art der Verschlüsselung ist trivial zu brechen; den Inhalt von "cString" werden dann unverschlüsselt, wenn Ihr Programm startet und sichtbar für jedermann mit Zugang zu Ihrem RAM. Diese noch nicht einmal eingerechnet, dass die XOR-trivial zu brechen in und von sich selbst.
- Ich weiß, aber Sie finden nicht den string mit einem debugger, weil es nicht trennbar von den gewöhnlichen Speicher. Das ist schon alles, was ich will.
- Leider ist C++ nicht vollständig Abhängige Arten, so dass strings nicht abgebaut werden kann durch die template-Mechanismen (und natürlich auch Sie können nicht durch den Präprozessor, da es keine split-Token). Ihre beste Wette ist, haben Sie Sie extern definiert, die in einer generierten Datei.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser blog bietet eine Lösung für compile-Zeit-string-hashing in C++. Ich denke, das Prinzip ist das gleiche. Leider müssen Sie erstellen ein Makro für jede string-Länge.
CRYPTnnn
das kann man verkraften jede der tausend verschiedenen string-Längen und auch diese Datei in jedem .cpp-Datei, die benötigt compile-time string encryption. Würde es etwas langsam-compilation, sondern der generierte code wäre davon unberührt.constexpr
Methoden, die Ihnen erlauben würden reguläre Methoden verwenden, für diese; es gibt einige Einschränkungen auf, was Sie tun können, aber Verschlüsselung (ohne random-Werte) sollten innerhalb Ihrer Reichweite.Perfekte Lösung existiert, hier ist es.
Außerdem dachte ich, dass dies nicht möglich war, obwohl es sehr einfach ist, Leute schrieb-Lösungen, wo müssen Sie ein benutzerdefiniertes tool zum Scannen der integrierte Datei anschließend und führen Sie einen scan strings und verschlüsseln Sie die Zeichenfolgen, wie das, was war nicht schlecht, aber ich wollte ein Paket zusammengestellt, die von Visual Studio, und es ist jetzt möglich!
Was Sie brauchen, ist
C++ 11
(Visual Studio 2015 Update 1 out of the box)die Magie passiert mit diesem neuen Befehl
constexpr
Durch Magie passiert in diesem
#define
Es nicht entschlüsseln XorString zur compile-Zeit, nur zur Laufzeit, aber es verschlüsselt die Zeichenkette nur im compile-Zeit, also die Zeichenfolgen werden nicht in die Ausführbare Datei
Wird es drucken Sie
"this string is hidden!"
aber Sie werden nicht finden, es in die Ausführbare Datei als strings!, prüfen Sie es selbst mitMicrosoft Sysinternals Strings
Programm-download-link: https://technet.microsoft.com/en-us/sysinternals/strings.aspxDen vollständigen source-code ist Recht groß, aber könnte leicht aufgenommen werden, in eine header-Datei. Aber auch eher zufällig, so dass die verschlüsselte Zeichenfolge Ausgänge immer wechselt mit jedem neuen kompilieren, das Saatgut wird geändert basierend auf der Zeit, die es dauerte, es zu kompilieren, ziemlich solide,perfekte Lösung.
Erstellen Sie eine Datei namens
XorString.h
Meine bevorzugte Lösung:
Und verwenden Sie dann Ihre Lieblings-Skriptsprache zu generieren, das eine Quelldatei, in dem Sie speichern Sie die "verschlüsselte" Ressourcen.
Dies ist eine späte Antwort, aber ich bin mir sicher, dass es eine bessere Lösung gibt.
Plese beziehen sich auf die akzeptierten Antworten hier.
Grundsätzlich, es zeigt, wie der ADVobfuscator lib zur Verschleierung von strings so einfach wie:
Ich glaube, Sie haben etwas zu machen, was getan wird, bei der Verwendung von GNU gettext (i18n) :
Für gettext verwenden Sie die _() makro, das verwendet wird zum generieren der i18ned string dictionnary und rufen Sie die "gettext" - Funktion.
Durch die Art und Weise, die Sie verwalten i18n zu :), dann brauchen Sie etwas wie :
Haben Sie zu verwalten, die mit Ihrem build-system, um es maintenable. Ich Mach das mit gettext...
My 2 cents
wenn Sie bereit sind, verwenden Sie C++11-features, variadic templates können verwendet werden, um compile-time-Verschlüsselung von Zeichenfolgen variabler Länge, ein Beispiel wäre diese.
Siehe auch diese, die Sie finden könnten besser erklärt.
Wenn die Menschen sich durch einfache string-Verschlüsselung. Ich schrieb ein code-Beispiel Beschreibung Zeichenfolge selbst-Entschlüsselung und-tagging mit einem MAKRO. Eine externe cryptor code wird bereitgestellt, zum patchen der Binärdatei (also die Saiten sind crypted nach Programm-Zusammenstellung). Die Saiten sind entschlüsselt, ein zu einer Zeit in der Erinnerung.
http://www.sevagas.com/?String-encryption-using-macro-and
Dies wird nicht verhindern, Reversierung mit einem debugger aus schließlich finden die strings, sondern es wird verhindert, dass strings Auflistung von ausführbaren und memory dump.
Kann ich nicht kompilieren, die der compiler wirft zahlreiche Fehler, ich war auf der Suche nach anderen Lösungen für die schnelle string-Verschlüsselung und fand heraus, über dieses kleine Spielzeug https://www.stringencrypt.com (war nicht schwer, 1. Ergebnis in Google für die string-Verschlüsselung Schlüsselwort).
Dies ist, wie es funktioniert:
Beispiel string "StackOverflow ist genial!", der output-code (jede einzelne Zeit es ist, generiert der code etwas anders Aussehen). Es unterstützt sowohl ANSI (char) und UNICODE (wchar_t) geben Sie Zeichenfolgen
ANSI-Ausgang:
UNICODE-Ausgabe:
Jetzt weiß ich, es ist vielleicht nicht die perfekte Lösung, aber es funktioniert für mich und mein compiler.