PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Compile-Time String Encryption



s3rb31
22.01.2012, 21:27
Lange Zeit habe ich auf FH nicht gepostet, ich denke es gibt dazu keinen Grund mehr. Geschrieben für B2H.



Yessir, heute gleich zwei POCs aus dem Hause S3RB31! Der zweite folgt sogleich. Nun aber los:

String Verschlüsselung (oder in diesem Fall eher - in Ermangelung eines deutschen Wortes - obfuscation) ist eine Sache über die man sich Gedanken macht, wenn man nicht möchte das jemand weis was da alles im Programm drin steht. Häufig wird eine beliebige Verschlüsselung in Verbindung mit manuellem laden der WinAPI-Funktionen genutzt.

Doof ist aber das der String ja nun bereits vor dem kompilieren verschlüsselt vorliegen muss, jedenfalls war das so bevor C++0x kam. Als Beispiel will ich einmal die XorString Klasse der OGC Group nehmen welche relativ häufig benutzt wird:


XorStr<0xF5,18,0xA9BFF53A>("\xBC\x85\xB3\x9D\x9B\x8F\x9C\x9B\x98\x8C\xAF\x72\x 64\x71\x66\x6A\x71"+0xA9BFF53A).sWenn man das so liest dann fragt man sich doch, was das eigentlich heißen soll, nicht wahr? Dort oben steht IsDebuggerPresent. Erkennt man gar nicht oder? Das ist doof.

Man könnte natürlich ein Kommentar dahinter setzten, aber selbst dann müsste man jeden neuen String erst einmal verschlüsseln - mit einem dritten Programm oder Skript wohlgemerkt - und könnte dann erst weiter coden.

Wie kann man das also intuitiver gestalten? Man nehme eine Priese C++ und füge ein Stück 0x hinten an. Zu guter letzt gebe man dem Gemisch einen Compiler der 0x auch unterstütz bei und voila! Gesagt getan.

G++ - sollte hier jedem ein Begriff sein - unterstützt seit einiger Zeit die Option


-std=c++0xwelche eingeschränkten (?) Support für die neuen C++0x Funktionen aktiviert. Unter anderem werden nun auch variadische Templates unterstützt. Wenn wir uns nun daran erinner das Templates immer zur Compile-Time "dereferenziert" werden, dann kommt einem doch höchstwahrscheinlich die ein oder andere Idee mit der man String Verschlüsselung vereinfachen kann. Ich habe mich daran versucht und dabei ist eine meiner Meinung nach ziemlich coole Klasse raus gekommen. Bedient euch, aber vergesst nicht Credits zu geben! An dieser Stelle nochmal ein ausdrückliches Dankeschön an Weltensturm! :D

Hier also der Code:


http://codepad.org/XAz6ZHn8Und hier ein Beispiel zur Anwendung:



#include <windows.h>
#include <iostream>
#include "apicaller.hpp"

#define TO_STRING(x) #x
#define CHAR_TMPL_6(x) TO_STRING(x)[0] , TO_STRING(x)[1] , TO_STRING(x)[2] , TO_STRING(x)[3] , TO_STRING(x)[4] , TO_STRING(x)[5]

int main()
{
CryptString<char, CHAR_TMPL_6(S3RB31)> str_S3RB31_macro; //Macro - using multibyte charset
CryptString<wchar_t, L'S',L'3',L'R',L'B',L'3',L'1'> str_S3RB31_direct; //Direct - using unicode charset

std::cout << "C-String: " << str_S3RB31_macro.Value() << std::endl
<< "basic_string<char>: " << str_S3RB31_macro.ValueStlString() << std::endl;

std::wcout << L"C-String: " << str_S3RB31_direct.Value() << std::endl
<< L"basic_string<wchar_t>: " << str_S3RB31_direct.ValueStlString() << std::endl;
return 0;
}
In D kann man Strings auch komplett übergeben und zur Compile-Time verschlüsseln:


http://www.gamedeception.net/threads/10794-Encrypted-strings-using-compile-time-functions