[C/C++] - Programme verschlüsseln

Noeden

Erfahrenes Mitglied
Hallo Leute!

Ich lerne im Moment C und C++ um nen Programm zu schreiben, was unter Umständen kommerziell vertrieben werden soll. Da frage ich mich doch, ist es möglich das Programm zu verschlüsseln? Denn sonst kann ja jeder meinen Quellcode klauen oder? Oder ist das nicht einfach möglich wenn das Programm gelinkt ist, den kompletten Maschinencode rückzucompilen ;)

Die gleiche Frage gilt für die Datenbank, die enthalten sein wird.

Danke Leute! :)
 
Ich habe zwar keine Ahnung von C/C++ aber wenn du dein fertiges Programm kompiliert hast ist es eigentlich nicht mehr möglich an den Quellcode zu kommen.

Eigentlich deshalb weil mit entsprechender "krimineller" Energie und der entsprechender Software ist es sicher möglich des Quellcode wieder zu entschlüsseln.
Doch ich begaupte mal das dein Programm nicht so "wichtig" sein wird das du dir deshalb Sorgen machen musst.

Was die Datenbank(en) angeht. Diese kannst du ja mit einem entsprechend kompliziertem Passwort versehen. Dann ist es so einfach auch nicht möglich an die Daten zu kommen.

Gruß Thomas
 
Es gibt einige Programme, die können aus einer EXE C-Code herstellen, allerdings ist der völlig unstrukturiert und fast nicht zu gebrauchen.

Was du dagegen tun kannst:
  • Bei einigen Compilern gibt es Optionen bzw. Schalter, die den Maschinencode mehr effizienter machen. Aktiviere sie oder schalte z.B. den Debug-Modus aus.
  • Es gibt sogenannte Obfuscators, die können die kompilierte Anwendung nochmals verschleiern.

Guck mal hier: Wikipedia - Reverse Engineering
 
Wobei man bei C/C++ in den meisten Fällen auch keinen Obfuskator mehr braucht, weil alles so durcheinander ist...
Wenn es um viel Geld geht, gut, aber sonst reicht der Compiler meistens auch.

Bin nicht mehr ganz am neuesten Stand, was Decompiler angeht, aber damals entsprach "von einem Programm automatisch generiert" ca. folgendem:

C++:
//----- (00401718) --------------------------------------------------------
FILE *__cdecl sub_401718()
{
  FILE *result; // eax@2
  int v1; // [sp+4h] [bp-4h]@6

  byte_40E400 = 1;
  byte_40E450 = 1;
  while ( 1 )
  {
    result = File;
    if ( File->_flag & 0x10 )
      break;
    while ( byte_40E450 % 17 && !(File->_flag & 0x10) )
    {
      --File->_cnt;
      if ( File->_cnt < 0 )
        v1 = _filbuf(File);
      else
        v1 = *File->_ptr++;
      dword_40E478 = v1;
      dword_40E478 = -dword_40E478;
      dword_40E478 += byte_40E400;
      if ( byte_40E411[0] == 1 )
      {
        byte_40E410 = Str[byte_40E450 % strlen(Str)];
        while ( byte_40E410 >= 0 )
        {
          --byte_40E410;
          ++dword_40E478;
        }
        if ( dword_40E478 > 127 )
          dword_40E478 -= 255;
      }
      fprintf(dword_40E408, "%c", dword_40E478);
      ++byte_40E450;
    }
    byte_40E450 = 1;
    if ( byte_40E400 == 1 )
      byte_40E400 = 5;
    if ( byte_40E400 == 5 )
      byte_40E400 = 6;
    if ( byte_40E400 == 6 )
      byte_40E400 = 3;
    if ( byte_40E400 == 3 )
      byte_40E400 = 7;
    if ( byte_40E400 == 7 )
      byte_40E400 = 2;
    if ( byte_40E400 == 2 )
      byte_40E400 = 4;
    if ( byte_40E400 == 4 )
      byte_40E400 = 1;
  }
  return result;
}
Compiler auf Release mit Geschwindigkeitsoptimierungen, kein Obfuskator.

Eigentlich war es eine ziemlich harmlose Funktion, liest aus einer Datei was aus und schreibt wieder irgendwas...
kompilieren und wieder zurück; wie man sieht ist das Ergebnis bewundernswert :D

Sprachen wie C# und Java kann man aber vergleichsweise gut dekompilieren, da sie nicht "echte" Programme erstellen, sondern ein eigenes, besser lesbares Binärformat haben.

Gruß

PS: Mir fallen gerade die if am Schluss auf...wtf ist das?
Ein
C++:
if(x>0&&x<8)x=1;
hätte es auch getan...
Dekompiler...
 
Zuletzt bearbeitet:
Hi,

C:
    if ( byte_40E400 == 1 )
      byte_40E400 = 5;
    if ( byte_40E400 == 5 )
      byte_40E400 = 6;
    if ( byte_40E400 == 6 )
      byte_40E400 = 3;
    if ( byte_40E400 == 3 )
      byte_40E400 = 7;
    if ( byte_40E400 == 7 )
      byte_40E400 = 2;
    if ( byte_40E400 == 2 )
      byte_40E400 = 4;
    if ( byte_40E400 == 4 )
      byte_40E400 = 1;

Das macht doch eigentlich gar nichts, oder? Hab mal alle byte_40E500 durch ein i ersetzt um das besser lesen zu können. Sobald die erste Bedingung wahr ist (also byte_40E400 == 1) dann werden alle folgenden Abfragen auch wahr und am Ende bekommt byte_40E400 den Wert 1.

Verstehe einer die Decompiler :D Ansonsten kann ich mich meinen Vorrednern anschließen, der Compiler übersetzt dein Programm und optimiert dieses, so dass man danach nur mehr schwer an den Code selbst kommt.

Hatte aber selbst schon mal nen Fall, wo jemand eine Seriennummer-Überrprüfung à la "richtig = true" über ollydbg dann ausgehebelt hat. Unmöglich ist nichts, nur die Frage ist ob sich der Aufwand lohnt und das Programm wirklich so viel wert ist ;)

Gruß
BK
 
Ja, versteh einer den Decompiler.

Wenn die Variable einen Wert von 1 bis 7 hat, kommt bei den if am Schluss immer eins raus.
Und man kann nicht wenigstens der Reihe nach von 1 bis 7 gehen, nein, man muss 1563724 überprüfen... :D

Und das mit dem Aufwand stimmt natürlich.
Man sollte sich immer fragen, wieviel Schaden ein Programmierer+Dekompiler bei den anderen Benutzern und bei dem Programmhersteller verursachen kann, und es demjenigen entsprechend schwer machen.

100% Sicherheit erreicht man sowieso nicht.
Wenn der Dekompilierer genug Freizeit und Motivation hat, hilft auch der beste Obfuscator und alles andere nichts.
 
Zuletzt bearbeitet:
Ein Decompiler kann ja nicht erkennen - wie wir Menschen - ob ein bestimmter Codeteil überflüssig ist oder nicht oder den Code von der Logik her beurteilen. Das können wir (jetzt zumindest) nur wir Menschen.

Wenn der Dekompilierer genug Freizeit und Motivation hat, hilft auch der beste Obfuscator und alles andere nichts.
Naja, ob man soviel Zeit in einen Dekompilierungsvorgang steckt?
 
:D Meinte den Mensch, der das Ergebnis des Dekompilers bekommt und verstehen soll.
Das Programm wird wohl kaum Freizeit und Motivation brauchen...

Und ob die if´s jetzt auf dem Mist des Compilers oder Decompilers gewachsen sind, ist ja auch nicht sicher.
Jedenfalls totaler Schwachsinn.

Es könnte ja noch Sinn machen, wenn die Variable zur Kommunikation mit einem anderen Thread ist, aber in dem Programm gibts nur den Hauptthread.
 
Zuletzt bearbeitet:
Zurück