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; |
|