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

 

    

Schützen einer Anwendung

  Vorab

Egal welche Bemühungen man auch unternimmt, einen 100% Schutz gegen unerwünschte Nutzung wird man nie hinbekommen. Eigentlich geht es nur darum, wie leicht man es einem Hacker macht.
Wenn man selbst noch keine Software gehackt hat, dann glaubt man nicht wie schnell eine If...Then Abfrage, welche die Software schützen soll ausgehebelt ist. 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 nach Meldungen wie "Die Software ist nicht freigeschaltet und läuft im Demo-Modus". Danach sucht man nach der Sprunganweisung welche diese Ausgabe veranlasst. Dies könnte z.B. ein JNE (Jump if not equal) sein und tauscht diese einfach 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 gleich null... Um das Hacken an dieser Stelle nicht zu einem Kinderspiel werden zu lassen, sollte man die Ausgabe solcher Meldungen und die eigentliche Freigabe (oder auch Programmabbruch) trennen. Auch sollte man keineswegs einen Produkt-Schlüssel irgendwo im Quellcode als String stehen haben, dieser wird im Disassembler in Reinschrift zu sehen sein. Im Grunde müsste man erst einmal selbst zum Hacker werden und zu sehen wie man es den Kollegen schwerer machen kann...
Wie auch immer, auf dieser Seite möchte ich ein paar Dinge ansammeln, die im Zusammenhang mit Software-Schutz und Freigabe nützlich sein könnten. 


 

  Windows ProductKey auslesen - benotigt Registry in Uses

Eine Freischaltung der eigenen Software könnte man z.B. an den Windows-Schlüssel koppeln. Dazu mal ein Code-Beispiel zum Auslesen des Windows ProductKey.

  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;
 

Aufruf:

  ShowMessage := GetWinProductKey;
 

 

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

[letzte Aktualisierung 09.10.2006]