VS 2015 Compilereinstellungen

Quadfahrer

Grünschnabel
Hallo, ich bin neu in diesem Forum und habe gleich mal meine erste Frage.

Ich benutze Visual Studio 2015 und Programmiere mit C++

Ich habe eine kleine dll mit C++ geschrieben und möchte diese gegen Codeklau absichern, da mir das schon einmal passiert ist.
Wie finde ich heraus ob mein Compiler Assembler oder Maschinencode ausgibt und welche Einstellungen kann ich in Visual Studio ändern, damit mein Code sicherer ist?
Der Code sollte weiterhin auf allen gängigen Windowsrechnern laufen (Win XP bis Win 10)

Ich hoffe ihr könnt mir weiter helfen.

Gruß Chris
 
Hi und Willkommen bei tutorials.de,

Wie finde ich heraus ob mein Compiler Assembler oder Maschinencode ausgibt
Die Frage macht nicht wirklich Sinn. Das ausführbare Programm besteht im wesentlichen aus Maschinencode (sonst wäre es nicht startbar). Aber: Bevor der C++ - Code vom Compiler/Linker in fertigen Maschinencode umgewandelt ist gibt es Assembler (zumindest etwas Assembler-artiges) als Zwischenergebnis. Diese Assemblerversion kann man sich je nach Einstellungen auch separat in eine Datei speichern lassen und anschauen. Für die normalen Benutzer des Programms ist sie dann aber nicht weiter wichtig (nur manchmal für den Programmierer).

möchte diese gegen Codeklau absicher
C++ - Programme rückübersetzen ist von Haus aus schon relativ schwer, jedenfalls viel schwerer als es bei zB. Java, C# usw. ist. Geschwindigkeitsoptimierungen im Compiler machen es noch schwerer, aber diese Optimierungen werden normalerweise sowieso gemacht, ohne dass man speziell was einstellen muss (Um sicherzugehen, den Unterschied Debug/Release kennst du?)

Das alles macht das Umkehren aber nur "schwerer", nicht unmöglich. Der, der den Code kennen will, wird mehr Zeit brauchen, aber das ist dann alles: Ein wirkliches Unmöglich gibt es nicht. Solange jemand dein Programm verwenden kann, kann er es auch zerlegen.

Je nach Zweck vom Programm könnte man einen Webdienst daraus machen: Das Programm selber läuft nur auf einem Server, auf den die Benutzer nur übers Internet Zugriff haben. Dann wäre der Code immerhin solang sicher, bis jemand den Server hackt (und gegen Internetangriffe kann man sich deutlich besser wehren als gegen Codeklau am Programm direkt)

Zusätzlich hilft auch die Legislation. Wenn man jemanden erwischt, verklagen.

da mir das schon einmal passiert ist.
Visual Studio hat die (***) Eigenschaft, auch eine andere Programmiersprache "C++" zu nennen, obwohl es keins ist. Außerhalb von VS ist die Sprache als C++/CLI bekannt, und dieses ist einfacher zu zerlegen als das echte C++. ... Es gibt immer wieder Leute, die C++/CLI schreiben und denken, dass es C++ ist. Bist du dir wirklich sicher ...? Wenn ein "System::" im Code vorkommt ist es ziemlich sicher C++/CLI.

PS.
Nicht wirklich relevant, aber was sehr gut möglich ist: Nachweisen, ob eine ausführbare Programmdatei original von dir ist oder von jemandem verändert wurde (Kryptographische asym. Signaturen)
 
Zuletzt bearbeitet:
Hallo, vielen Dank für die ausführliche Antwort.

Ob ich C++ oder C++/CLI habe, kann ich nicht zu 100% sagen. Ein System kommt bei mir so viel ich weiß nicht vor. Ich werde es heute Abend aber auf jedenfall nachschauen.

Mein Projekt steht bereits auf Release. Was stelle ich am besten bei der Optimierung ein?

Ich habe bereits einen Teil als Webdienst ausgelagert, kann aber leider nicht alles auslagern. Ich werde versuchen, den Anteil zu erhöhen.

Was mir noch aufgefallen ist. Wenn in meinem Quellcode ein "Hello World" vorkommt und ich meine dll mit einem Texteditor öffne, dann sehe ich dieses "Hello World". Bei der geklauten Version sehe ich es nicht. Was ich allerdings hinzu sagen muss, ist dass meine Version 2 Sprachig ist und über den Webdienst die richtige Sprache gewählt wird. Die geklaute Version ist nur 1 Sprachig, da der komplette Webdienst entfernt wurde.

Gruß Chris
 
Optimierung: Je höher desto besser.

Die HelloWorld-Sache: Ist das jetzt als String gemeint, zB.
Code:
printf("Hello World");
oder als Funktionsname in einer DLL
Code:
void helloworld() {}
doer was Anderes im Code, wie
Code:
void meinefunktion() { int helloworld; }
?
Möglichkeit 3: Das sollte definitv nicht passieren. Wenns das ist,
bitte sagen, dann kann das Thema weiterverfolgt werden.

Möglichkeit 2: Das ist normal, und nötig damit die Funktionen aus der DLL aufgerufen werden können. Wenn man solche Namen verstecken will hat man einen der wenigen Fälle, wo ein (klassischer) Obfuskator in C++ nützlich ist: Ein Programm, das vor Kompilieren den Code bearbeitet (bitte nur auf eine Kopie des Code anwenden), und Namen etc. durcheinanderbringt. Statt helloworld bekommt man dann func00001 oder mj98djk3 oder irgendsowas. (Besser nicht am Originalcode weil sonst alles unverständlich wird. Und den selben Effekt kann man natürlich auch händisch erreichen, dauert nur länger.)

Möglichkeit 1: Das ist auch normal, ja. Warum es im geklonten Programm nicht ist weiß ich zwar auch nicht, dürfte für das Sicherheitsproblem ziemlich unwichtig sein. Wenn man seine eigenen Strings nicht geich direkt lesbar machen will kann man im Programm einen "Keystring" haben, mit irgendeinem Unsinn drin, den zur Verschlüsselung der eigentlichen Texte verwenden, und zur Laufzeit mit einer Funktion wieder entschlüssen bevor man den Stringinhalt verwendet. Methoden zB. XORen jedes Bytes oder auch AES (besser) oder ...
Natürlich ist auch das mit genug Zeit umkehrbar, der Angreifer muss nur rausfinden welche Bytes der Key sind, welche Bytes der Text sind (weil nach zB. AES alles unlesbarer Müll ist), und welche Methode eingesetzt wurde. Um die Keysuche ohne vollständige Codezerlegung noch zu erschweren, absichtlich "nicht" zufällige schwer zu erratende Bytes nehmen, sondern etwas, das zB. wie ein Teil vom ausführbaren Code ausschaut. Zufällige schwer zu erratende Bytes, also Daten mit hoher Entropie, sind in Exes/DLLs nämlich kaum vorhanden, der Key würde sich vom Rest deutlich abheben.
(Teilweise können Obfuskatoren auch bei der Stringsache hier helfen)

Für die generelle Erschwerung der Zerlegung:
Nach den Compileroptimierungen gibt es schon noch weitere Möglichkeiten, die händisch zu machen ist aber als Einzelprogrammierer ein unverhältnismäßiger Aufwand. Bzw., es kommt drauf an wie wichtig einem der Schutz ist. VMs, selbstmodifizierende Programme, usw. Kommerzielle Produkte, die einem das erleichtern, existieren. (Themida...)
 
Zuletzt bearbeitet:
Mit "Hello World" habe ich einen String gemeint, also Beispiel 1
Bei der Optimierung habe ich auf "Vollständgie Optimierung" umgestellt.
Allerdings habe ich noch die Einstellmöglichkeiten "Größe oder Geschwindigkeit bevorzugen" da dann "kleinen Code bevorzugen"?
Stringpooling auch aktivieren oder?

Vielen Dank für die Hilfe und die vielen Anregungen!
 
Eher nach Geschwindigkeit optimieren, für schwer zerlegbaren Code.

Stringpooling in VS meint nur, dass beim Kompilieren untersucht wird, ob der selbe String mehrmals
an verschiedenen Codestellen vorkommt, und ggf. nur einmal im fertigen Programm abspeichert.
 
Hallo

Ich habe eine kleine dll mit C++ geschrieben und möchte diese gegen Codeklau absichern, da mir das schon einmal passiert ist.
Aus reiner Neugier: Wie kommst du darauf, dass der Code geklaut wurde bzw. dass der Code tatsächlich aus dem Kompilat extrahiert worden ist und nicht etwa aus der Codedatei selbst kopiert wurde?
Wie sheel schon sagte:
C++ - Programme rückübersetzen ist von Haus aus schon relativ schwer[...]
Daraus lässt sich schliessen, dass es grosse (kriminelle) Energie erfordert, zurückzurechnen. Was macht dein Programm, das es so interessant macht? Finanzen? Forschung? Medien?

Möglichkeit 2: Das ist normal, und nötig damit die Funktionen aus der DLL aufgerufen werden können. Wenn man solche Namen verstecken will hat man einen der wenigen Fälle, wo ein (klassischer) Obfuskator in C++ nützlich ist: Ein Programm, das vor Kompilieren den Code bearbeitet (bitte nur auf eine Kopie des Code anwenden), und Namen etc. durcheinanderbringt. Statt helloworld bekommt man dann func00001 oder mj98djk3 oder irgendsowas. (Besser nicht am Originalcode weil sonst alles unverständlich wird. Und den selben Effekt kann man natürlich auch händisch erreichen, dauert nur länger.)
Mein Senf dazu: Manche Virenscanner drehen da (zu recht) durch: Obfuscation wird vor allem bei Schadprogrammen sehr gerne genommen, um den Zweck zu verschleiern und da durch die Zufallskomponente jeder Obfuscation neue Namen generiert werden können, sodass die Hashes nicht mehr übereinstimmen.
Schlussendlich hilft das aber nur, die grobe API und die Funktionsdefinitionen zu verschleiern.
Wenn du mit Code Algorithmen meinen solltest, dann hilft diese Methode wenig.

Natürlich ist auch das mit genug Zeit umkehrbar
Das ist der grösste Knackpunkt. Man kann immer die Hürde noch einige cm höher stellen, doch C++ mit dem Standardoptimizer stellt sie direkt auf 3m, sodass der zusätzliche Effekt marginal ist.

Ich würde sheel hierbei zustimmen:
Zusätzlich hilft auch die Legislation. Wenn man jemanden erwischt, verklagen.

Ich nehme an, dass du nicht mehr Informationen geben kannst, was das Programm macht. Aber der Aufwand, der durch all die zusätzlichen Verschleierungsmassnahmen entsteht, ist nicht proportional zum Ertrag. Hinter einem Webserver verstecken ist da noch die günstigste Methode, allerdings musst du dann ja auch einen Webserver bezahlen. Es wird nicht günstig.

Gruss
cwriter
 

Neue Beiträge

Zurück