Stringliterale in einer .exe verschleiern?
-
Hello!
Ich würde gerne sämtliche Stringliterale in meiner .exe verschleiern, zwecks "security through obscurity".
Wie könnte ich das am besten anstellen?
Geht es auch so, dass zB. der Debugger "OllyDbg" gar keine "String references" findet? Oder dass diese wenigstens verschlüsselt sind?Danke euch im Voraus!
MfG
-
Du verschlüsselst vorher deine Stringliterale von Hand. Da es wie du schon selbst bemerkt hast, security through obscurity ist, ist es den Aufwand nicht Wert etwas besseres als beispielsweise ROTx zu verwenden. Dann schreibst du eine Entschlüsselungsprozedur für dein Programm und an jeder Stelle, an der ein Stringliteral benutzt wird, verwendest du stattdessen Entschlüsselungsprozedur("verschlüsseltes Literal").
-
Veraschlüsseln zum Beispiel:
"Achtung Pseudocode!" string decrypt(char const* orig){ string result=orig; for(int i=0;i!=result.count();++i) result-=28; }
Mußt halt mit +28 deine Stringliterale bauen.
Stringliterale verstecken geht auch.
Statt
char bla[]="bla";
float blaf[]={'b','l','a','\0'};
-
Ich hatte gerade Zeit und Lust, deshalb hier ein vollständiges C++ Beispiel:
#include<string> // Für das angenehme Arbeiten mit Stringliteralen #include<iostream> // Für die Testausgabe std::string entschluesseln(const std::string& verschluesselt){ std::string entschluesselt; for(std::string::const_iterator i = verschluesselt.begin(); i < verschluesselt.end(); ++i){ entschluesselt.push_back(*i + 1); } return entschluesselt; } int main(){ std::cout<<entschluesseln("Chdrhrsdhmf`myfdgdhldqSdws Akn�mhbgsvdhsdqr`fdm")<<std::endl; }
edit: Ich sehe gerade, dass da was mit der Codierung nicht stimmt, wodurch das verschlüsselte 'ß' im Beispiel nicht richtig angezeigt wird. Das ist aber eine Sache der Anzeige auf dieser Seite und kein genereller Fehler im Verfahren. Verschlüsseln kannst du deine texte natürlich, indem du im Beispiel einfach + mit - tauscht und die Funktion dann auf den Klartext anwendest.
-
Mhm, daran hatte ich auch schon gedacht. Allerdings ist das kompliziert und unübersichtlich für den Code.
Ich dachte da an vllt. nachträgliches Patchen der .exe.Gibt es keine Möglichkeit, dass man gar keine Strings findet, und es trotzdem möglichst unkompliziert bleibt?
Bei verschlüsselten Strings schaut man sich einfach die Stelle an und merkt, dass immer dieselbe Funktion aufgerufen wird. Das ist dann ja fast so einfach wie gar keine Verschlüsselung.Hmm...
Trotzdem danke.
MfG
-
Strings in einer Datenstruktur (Liste, o.ä.) sammeln, diese nach Abschluß der Entwicklung ein für allemal in eine Datei schreiben, Datei verschlüsseln, Datei zur Laufzeit wieder einladen, entschlüsseln.
-
Gute Idee, danke.
Möchte aber eher auf eine externe Datei verzichten.Am besten wäre es halt, wenn ich im Code nichts ändern müsste, die Strings einfach nackt stehenbleiben.
-
Spätestens bei den Funktionsaufrufen müssen die Strings unverschlüsselt vorliegen - von daher hilft dir jegliche Verschlüsselung nur gegen absolute newbies. Wie auch immer, eine Möglichkeit wäre es die .data-section mit einer billigen xor-Verschlüsslung zu verschlüsseln. Während der Startup-Phase deines Prog. muss diese dann halt entschlüsselt werden ... danach wären die Strings aber "sichtbar".
Am einfachsten wäre es wohl wenn du einen PE-Packer wie z.B. UPX verwendest – schnell, einfach und umsonst.
-
Hmm, was sind denn die Nachteile bei einer mit UPX gepackten .exe?
Irgendwann hab ich den nicht mehr verwendet, weil ich gelesen habe, dass der Nachteile (Kompatibilitätsprobleme) mit sich bringt.
Und... die Strings werden dann ja trotzdem sichtbar, wenn man die .exe mit OllyDbg attached, nicht?
-
Nachteile wüsste ich jetzt kein. Die Strings werden erst sichtbar, wenn das Prog. einpackt ist. Wenn die Strings auch während der Laufzeit verschlüsselt sein sollen, musst du sie halt entsprechend einzeln verschlüsseln und entschlüsseln.
Ansonsten google mal nach "anti debug tricks"
-
Danke, sehr gute Suchergebnisse.
-
xor schrieb:
Nachteile wüsste ich jetzt kein.
Ich kenne zwei:
1. Bei UPX ist Entpacken genauso einfach wie das Packen. Schutz = 0, selbst Newbs hält man damit nicht auf
2. UPX-komprimierte Dateien triggern false positives in Virenscannern