Vernünftiger C++/DLL Obfuscator

03/21/2014 15:49 X3enox#1
Moin,

habe schon viel darüber gelesen, dass C++ schon eine extreme Sicherheit vor dem decompilieren bietet, allerdings sehe ich teilweise trotzdem va Hacks, die in C++ programmiert wurden und geknackt wurden.

Jetzt mal meine Frage:
Gibt es irgend einen euch bekannten, wirklich vernünftigen Obfuscator für DLLs in C++? Wie wäre es zB mit Themida?

Gruß
03/21/2014 15:51 Tyrar#2
Themida ist schrott.
Arbeite mit übermäßig vielen Klassen und Vererbungen.
Wenn du es richtig schön übertreibst haste hinterher schönen Assemblercode den niemand mehr reversen will. Dann noch etwas in Richtung Themida drauf und gut ist.
Das wird trotzdem keine 100% Sicherheit bieten, die hast du niemals.
03/21/2014 16:11 Dr. Coxxy#3
quatsch.
Obfuscatoren machen bei C/C++ nur begrenzt sinn.

C/C++ bietet tatsächlich "schutz" vor dekompilieren, dieses aber vor allem durch den nicht verlustfreien kompilierungsprozess in dem der C/C++ code in maschinensprache umgewandelt wird und optimierte compiler nur noch so wenig informationen von dem ursprünglichen C/C++ code übrig lassen, dass dieser normalerweise nicht wiederherstellbar ist.
Das bietet dabei aber keine sicherheit vorm disassemblen, wobei der vom compiler erzeugte maschinencode in assembler angezeigt wird, der dann in meist mühsamer kleinarbeit reversed werden kann.
wenn man dabei weiß wonach man suchen muss und z.b. durch die WinAPI eine bestimmte bekannte schnittstelle hat, kann man den bereich den man reversen muss jedoch sehr stark eingrenzen.
eine mittelgroßes C++ projekt kompilat wieder in komplett lauffähigen C++ code zu reversen ist praktisch kaum möglich.

schutz vor disassemblern bieten z.b. packer wobei der gesamte, oder auch nur teile des codes erst zur laufzeit in maschinencode entpackt werden.
obfuscaten macht in c++ nur wenig sinn, da viel vom compiler wieder rausoptimiert wird oder einer der hauptgründe überhaupt eine native sprache zu benutzen, nämlich die laufzeit, massiv beeinträchtigt werden kann.
außerdem muss man zum cracken meist nur einen sehr kleinen bereich des programms untersuchen, nämlich der in dem die registrierung überprüft wird, da hat es keinen sinn das ganze programm zu obfuskieren, da sollte man eher manuell gucken, dass die registrierungscheckroutine ausreichend gesichert ist bzw. das programm selbst geschützt ist, z.b. indem das programm erst nach erfolgreicher serverauthentifizierung vom server gestreamt wird.
03/21/2014 16:23 X3enox#4
Hm, und was wären so gängige Packer?

Zum Compilen benutze ich eben den Standard von VC++ Express 2010, oder gibts da auch bessere Alternativen?
03/21/2014 16:30 Dr. Coxxy#5
der ist ok, solltest als release kompilieren, in den projekteinstellungen das erstellen von debug informationen deaktivieren und keinesfalls die .pdb datei aus dem compile ordner mit ausliefern.
packer hab ich net soviel ahnung, benutz die meist um die größe zu verkleinern und nicht als disasm schutz, wie z.b. UPX.
Ansonsten kenn ich themida und armadillo, die afaik mehr auf schutz ausgelegt sind.
aber wie gesagt ist das auch der falsche ansatz, du solltest eher gucken, dass du dein programm sicherer machst anstatt zu versuchen dich vorm disassemblen zu schützen.
03/21/2014 16:57 X3enox#6
Tyrar findet Themida ja nicht so toll, wie er schrieb.
Da würde mich mal die Kontraargumente interessieren @Tyrar.

Das mit den Klassen werde ich wohl auf jeden Fall mal machen, lässt sich bei mir einfach strukturieren.
Verschachtelungen...müsste ich wohl mal sehen, wie ich die passend einbauen kann.

Ansonsten werde ich mich wohl noch auf Google informieren müssen, aber danke für die Infos^^

Und noch was, was meinst du genau mit der Registrierung?
03/21/2014 17:08 Dr. Coxxy#7
na, wenn man etwas crackt umgeht man ja normalerweise den registrierungsvorgang, bzw. die prüfung, ob ein programm rechtmäßig registriert ist, als entwickler solltest du diesen prozess gesondert schützen.
dass dein programm wieder zu C++ code dekompiliert werden kann brauchst du dir, wenn das projekt net gerade winzig ist normalerweise keine sorgen drum machen.
03/21/2014 17:40 X3enox#8
Achso...dann habe ich mich vermutlich falsch ausgedrückt.
Wie das geht, weiß ich.

Mir ging es nur allgemein ums decompilern ^^
03/21/2014 17:50 .SkyneT.#9
Quote:
Originally Posted by X3enox View Post
Mir ging es nur allgemein ums decompilern ^^
Dann kann man meistens davon ausgehen das - falls keine Weltneuheiten
in dem Programm enthalten sind - keiner in absehbarer Zeit ein größeres
Projekt komplett reversen wird.
03/21/2014 17:55 MrSm!th#10
Quote:
Originally Posted by X3enox View Post
Achso...dann habe ich mich vermutlich falsch ausgedrückt.
Wie das geht, weiß ich.

Mir ging es nur allgemein ums decompilern ^^
Bist du dir sicher, dass du weißt, wie du diese Routine sicher gestaltest?
Eine Textdatei auf einem Web oder gar Ftp Server ist es nicht.
Sofern du eine sichere Authentifizierungsarchitektur hast (Beispiel: der eigentliche Hack wird live übera Netzwerk gestreamt und liegt nicht auf der Festplatte des potenziellen Angreifers), kann dir das ohnehin unmögliche Decompilen und auch das Debuggen relativ egal sein.
100%ige Sicherheit gibt es nie.
03/21/2014 18:11 X3enox#11
Das mit der Textdatei sicherlich nicht, da gäbe es ja u.a. Wireshark...
Habe mich dazu auch bereits im Internet informiert, aber das mit dem Netzwerk wäre ein interessanter Ansatz Da wäre ein kleiner vServer vermutlich sinnvoll, die meisten Webspaceanbieter finden das vermutlich nicht ganz so toll, was die Belastung angeht(, oder?)
03/21/2014 18:47 Tyrar#12
Allgemein sollte man sich für das streaming nen eigenes und ausreichend verschlüsseltes Protokoll einfallen lassen. Sonst kann da auch jeder mit Wireshark ran, die Datei so vom Server laden und dann drin rum schauen.

Zu Themida: das unpacken ist einfach relativ leicht, das sollte denke ich als Argument schon reichen. Ist dennoch besser als überhaupt nichts!
03/21/2014 19:37 Shadow992#13
Quote:
Originally Posted by Tyrar View Post
Zu Themida: das unpacken ist einfach relativ leicht, das sollte denke ich als Argument schon reichen. Ist dennoch besser als überhaupt nichts!
Ne ehrlich Themida ist, auch in meinen Augen, Schrott genau so wie die ganzen anderen "super Sicherheitspacker". Es gibt doch schon genug Tuts wie man sogar als Noob Themida u.ä. per Hand "entpackt".

Ein Packer kann ansich nicht schaden, wenn dann würde ich aber einen nehmen, der sehr wenig Viren-Warnungen erzeugt (UPX beispielsweise). Das macht das ganze ein klitze klein wenig schwerer und verringert zusätzlich die Größe des Kompilats.
Auf Themida o.ä. würde ich hingegen nicht setzen, ist in meinen Augen nur Geldmacherei.

Viel Sinnvoller ist es seine Zeit in Anti-Reversing und Anti-Dumping Methoden zu investieren. Auch wenn es auf den ersten Blick nach einer sehr dummen Idee klingt, aber im Bereich "Sicherheit" kannst du dir einmal viele moderne (und gute) Viren anschauen (gibt ja ein paar Seminar/Bachelor/Master/Doktor - Arbeiten dazu). Diese haben sehr oft sehr ausgeklügelte Schutzmechanismen.

Dazu zählen u.a.:
- Runtime Code-Decryption
- Polymorphic Code Generation (jetzt nicht so wichtig aber kann auch helfen)
- Verschleierte WinApi-Calls
- usw.

Die guten Viren versuchen ja möglichst gut und lange sich vor den Antiviren-Systemen (und auch vor Menschen) zu verstecken und genau das willst du ja mit deinem Kompilat auch erreichen, wobei es hier weniger ums verstecken im Sinne von Rootkits geht sondern mehr ums Code verstecken/verschleiern.

Weitere mögliche Schutzmaßnahmen, die sehr leicht umzusetzen sind aber oft unterschätzt werden (deswegen sind sie auch selten irgendwo aufgeführt):

- Viele unnötige Ifs/Whiles/usw. in den C/C++ Code einbauen (die ein Compiler nicht einfach so wegoptimieren kann)
- Strings dynamisch zusammensetzen lassen (z.b. 3 Grundstrings nehmen und diese dann beliebig zu etwas "Neuem" und Sinnvollen kombinieren)
- Analysten auf viele falsche Fährten führen (z.B. irgendwo einen String benutzen, der als Inhalt "Lizenz-Key" hat, obwohl dieser String nichts mit dem Code außen rum zu tun hat).
- Funktionen inlinen
...

Und für mehr und auch fortgeschrittenere Methoden kannst du einfach einmal nach "Anti Debugging" oder "Anti Disassembling" oder "Anti Reversing" googlen, da findet man genug.
03/21/2014 19:43 X3enox#14
Na dann bedanke ich mich mal für eure Tipps, da habe ich ja auch nochmal ein paar gute Ideen bekommen ;)
03/21/2014 23:01 MrSm!th#15
Quote:
Allgemein sollte man sich für das streaming nen eigenes und ausreichend verschlüsseltes Protokoll einfallen lassen. Sonst kann da auch jeder mit Wireshark ran, die Datei so vom Server laden und dann drin rum schauen.
Wobei das prinzipiell auch mit einem Webspace geht (falls du dich auf die Frage nach dem vServer bezogen hast).

Quote:
Ein Packer kann ansich nicht schaden, wenn dann würde ich aber einen nehmen, der sehr wenig Viren-Warnungen erzeugt (UPX beispielsweise). Das macht das ganze ein klitze klein wenig schwerer und verringert zusätzlich die Größe des Kompilats.
Im Gegensatz zu Themida macht es UPX nicht einmal im Ansatz schwerer.

Quote:
- Runtime Code-Decryption
- Polymorphic Code Generation (jetzt nicht so wichtig aber kann auch helfen)
- Verschleierte WinApi-Calls
- usw.
Wow, das macht übrigens auch jeder bessere Packer und das voll automatisiert. Wenn übrigens wer die Themida VM anschmeißt, kannste in den meisten Fällen einpacken. Lohnt sich nicht für viele Ziele, sich damit rumzuschlagen.

Ne, da gibt's schon deutlich bessere und sicherere Ansätze. Wie gesagt, die Sicherheit in die Hand des Servers zu legen ist z.B. ein guter Ansatz, den man noch mit anderen kombinieren kann.

Quote:
Viele unnötige Ifs/Whiles/usw. in den C/C++ Code einbauen (die ein Compiler nicht einfach so wegoptimieren kann)
Den Kampf verlierst du. Noch dazu ist es Unsinn.