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

|