Tech-Ecke / Delphi Inhalt / Schützen einer Anwendung

 

    

Schützen einer Anwendung

  Vorab

Egal welche Bemühungen man auch anstellen wird, einen 100% Schutz gegen unerwünschte Nutzung wird man wohl nie hinbekommen. Eigentlich geht es nur darum, wie schwer man es einem potenziellen Hacker machen kann.
Um die Problematik im ganzen angehen zu können muss man wissen wie ein Hacker vorgeht. Im Grunde teilt sich die Hackerszene in zwei Lagern. Die eine Hälfte betreiben dies als Sport und betrachtet es als Herausforderung einen Schutzmechanismus zu entschlüsseln und wartet dann mit einem sogenannten Keygenerator auf, um der Welt zu zeigen, dass sie den Schutz entschlüsselt haben. Die andere Hälfte hingegen knackt nach der Brecheisenmethode. Dabei ist jedes Mittel recht, Hauptsache die Anwendung läuft hinterher ohne Einschränkung. Daraus ergeben sich zwei Angriffspunkte die es so gut wie möglich zu schützen gilt.
Der erste Punkt ist die Erkennung ob die Software legal benutzt wird oder nicht. Hier ist wohl die Abfrage eines Freischaltschlüssels, welcher einer bestimmten Logik folgt eine der einfachsten Möglichkeiten. Dies bedeutet jedoch, dass jeder der an einen Schlüssel rankommt, beliebig viele Installationen freischalten kann. Auch das hinzuziehen eines Benutzernamens ändert an dieser Tatsache recht wenig, da auch dieser zusammen mit dem Schlüssel die Runde machen kann. Interessanter ist da schon ein PC-bezogener Schlüssel. Hierbei errechnet die Software zunächst eine ID aufgrund einer, für den PC mehr oder weniger eindeutige Erkennung, dazu könnte man z.B. das Installationsdatum des Betriebssystems, oder besser noch die ID einer Hardwarekomponente heranziehen. Diese ID wird dem Autor übermittelt und daraus wird dann letztlich der Schlüssel generiert...
Aber egal mit welchem Prinzip man nun die Legitimität abfragt, an einem Punkt im Programm muss man festlegen ob die Software nun uneingeschränkt ausgeführt werden soll oder nicht. Genau dieser Punkt ist die zweite wunde Stelle, die von den Brecheisen-Hackern attackiert werden kann. Wenn man es noch nicht gemacht hat, dann glaubt man nicht wie schnell man eine normale If...Then Abfrage ausgehebelt hat. Dabei spielt es keine Rolle in welcher Sprache die Anwendung geschrieben wurde, denn Hacker arbeiten CPU nah, bedienen sich Disassembler und Debugger und nehmen die nötigen Manipulationen direkt im Assemblercode vor. Im Assemblercode kann nach Textausgaben im "Klartext" gesucht werden. Dort sucht man also nach der entsprechenden Meldung die z.B. so aussehen könnte: "Die Software ist nicht freigeschaltet und läuft im Demomode". Dann sucht man nach der Sprunganweisung die diese Ausgabe veranlasst. Dies könnte z.B. ein JNE (Jump if not equal) sein und tauscht dies dann gegen ein JE (jump if equal). Hat man hier nun die Ausgabe der Meldung und den weiteren Programmverlauf (Freigabe) hinter dieser einen Abfrage stehen, so ist die Anwendung schon geknackt... Aufwand, schätzungsweise 3 Minuten... Um das Knacken an dieser Stelle nicht zu einem Kinderspiel werden zu lassen, sollte man die Ausgabe solcher Meldungen und die eigentliche Freigabe trennen. Auch sollte man keineswegs den Schlüssel irgendwo im Quellcode als reinen String stehen haben, dieser wird im Disassembler in Reinschrift zu sehen sein. Eine weitere kleine Hürde kann man auch schaffen wenn man einen EXE-Packer verwendet... aber wie schon zu Anfang erwähnt, einen 100% Schutz bekommt man auch so nicht hin ;-(
Wie auch immer, wenn man wenigstens einen kleinen Schutz haben möchte, so dass nicht jeder die Anwendung ohne weiteres nutzen kann, dann bekommt man das auch mit einem vertretbaren Aufwand hin. Hierzu möchte ich auf dieser Seite einmal ein paar Anregungen platzieren.


 

  Windows ProductKey auslesen - benotigt Registry in Uses

  function GetWinProductKey: string;
const
   Digits = 'BCDFGHJKMPQRTVWXY2346789';
var
   Reg: TRegistry;
   Value:
String;
   i,j,x: Integer;
begin
   Result := '';
   Reg := TRegistry.Create(KEY_READ);
try
   Reg.RootKey := HKEY_LOCAL_MACHINE;
   Reg.OpenKey('SOFTWARE\Microsoft\Windows NT\CurrentVersion', False);
   SetLength(Value, Reg.GetDataSize('DigitalProductID'));
  
if (Length(Value) >= 67) then
     
begin
         Reg.ReadBinaryData ('DigitalProductID', Value[1], Length (Value));
        
for i := 24 downto 0 do
           
begin
            x := 0;
           
for j := 14 downto 0 do
               begin
                  x := (x shl 8) + Ord(Value[53+j]);
                  Value[53+j] := Char(x div 24);
                  x := x mod 24;
              
end;
             Result := Digits[x+1] + Result;
            
if ( (i > 0) and ((i mod 5) = 0) ) then Result := '-' + Result;
         
end;
     
end;
finally
Reg.Free;
end;
end;
 

Aufgerufen wird das ganze z.B. so:

  ShowMessage := GetWinProductKey;
 

 

"Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !"

[letzte Aktualisierung 09.10.2006]