Entwicklungsfortschritt: 100%
Fortschritt der Betatests: 100%
Die Entwicklung von Copy-Discovery 2000 2.50 ist abgeschlossen.
686 Softwareeinträge
884 Softwareeditionen
874 Discs
320 Dateien
Dieser Artikel beschreibt die Syntax von ProtectionScript.
Außerordentliche Methoden (RETURN, RETURNNOTHING, JUMP,
JUMPTRUE, JUMPFALSE, CLEARALL)
verfügen zwar in der Regel über Parameter, die vor dem Aufrufen gesetzt werden müssen, geben aber keine Werte zurück.
Beispiel RETURN:
PUSH SecuROM
PUSH2 7.34.0014
RETURN
Die außerordentliche Methode RETURN verwendet das erste und zweite String-Register als Parameter.
Aus diesem Grund müssen eben diese Register vor dem Aufruf der Methode mit den allgemeinen Methoden PUSH und PUSH2 gefüllt werden.
Mit RETURN wird der Script erfolgreich beendet und der gefundene Kopierschutz mit Version (wenn vorhanden)
an den ProtectionScript Interpreter übergeben.
Angenommen die Version des gefundenen Kopierschutz ist unbekannt, so muss der Wert des zweiten Stringregisters,
das für die Kopierschutzversion verwendet wird, auf Nothing gesetzt werden.
Dazu verwendet man die Konstante [Nothing], wie in folgendem Beispiel gezeigt:
PUSH Smarte
PUSH2 [Nothing]
RETURN
Allgemeine Methoden werden nur dazu verwendet, die Funktionsregister zu befüllen,
sprich die benötigten Parameter zum Ausführen einer Methode oder Funktion zu liefern.
Es gibt insgesamt 20 Funktionsregister, jeweils 5 String-, Byte-, Number- und Boolregister.
Jedes Funktionsregister hat ihre eigene allgemeine Methode, um ihr einen Wert zuzuweisen.
In der nachfolgenden Tabelle ist aufgelistet, welche allgemeine Methode zu welchem Funktionsregister gehört:
Allgemeine Methode | Funktionsregister | Beispiel |
---|---|---|
PUSH | 1. String-Register | PUSH Hello World |
PUSH2 | 2. String-Register | PUSH2 Ich bin ein C |
PUSH3 | 3. String-Register | PUSH3 ABCDEFGHIJKLM |
PUSH4 | 4. String-Register | PUSH4 Blabla blabla |
PUSH5 | 5. String-Register | PUSH5 Shanghai |
PUSHBYTE | 1. Byte-Register | PUSHBYTE 4A |
PUSHBYTE2 | 2. Byte-Register | PUSHBYTE2 FF |
PUSHBYTE3 | 3. Byte-Register | PUSHBYTE3 AD |
PUSHBYTE4 | 4. Byte-Register | PUSHBYTE4 10 |
PUSHBYTE5 | 5. Byte-Register | PUSHBYTE5 E3 |
PUSHNUMBER | 1. Number-Register | PUSHNUMBER 570A6E |
PUSHNUMBER2 | 2. Number-Register | PUSHNUMBER2 0 |
PUSHNUMBER3 | 3. Number-Register | PUSHNUMBER3 674367 |
PUSHNUMBER4 | 4. Number-Register | PUSHNUMBER4 53AE |
PUSHNUMBER5 | 5. Number-Register | PUSHNUMBER5 23 |
PUSHBOOL | 1. Bool-Register | PUSHBOOL True |
PUSHBOOL2 | 2. Bool-Register | PUSHBOOL2 False |
PUSHBOOL3 | 3. Bool-Register | PUSHBOOL3 False |
PUSHBOOL4 | 4. Bool-Register | PUSHBOOL4 True |
PUSHBOOL5 | 5. Bool-Register | PUSHBOOL5 True |
Die Parameter zum Ausführen einer Funktion oder Methode müssen immer vor dem Aufruf dieser angegeben werden.
Nehmen wir als Beispiel die außerordentliche Methode JUMP.
Diese Methode belegt als Parameter das erste Number-Register. In dieses Register muss die Zeilennummer stehen, in die gesprungen werden soll.
Um mit der Methode JUMP in die 20. Zeile zu springen, ist folgener Code nötig:
PUSHNUMBER 14
JUMP
In Zeile 000 wird die allgemeine Methode PUSHNUMBER mit
dem hexadezimalen Zahlenwert 14 (entspricht 2010) aufgerufen. Damit wird der Wert des ersten Number-Registers auf 14 gesetzt.
In Zeile 001 wird die außerordentliche Methode JUMP aufgerufen.
JUMP springt in die Zeile, dessen Nummer im ersten Number-Register angegeben wurde, in diesem Fall Zeile 1416.
Welche Methode/Funktion welche Parameter benötigt, kann in der ProtectionScript Referenz nachgeschlagen werden.
Allgemeine Methoden können drei verschiedene Arten von Werte in die Funktionsregister schreiben.
Direkt angegebene Werte:
PUSH Hello World
PUSHBYTE A0
PUSHNUMBER 23F3A
PUSHBOOL True
Werte aus Konstanten:
PUSH [Nothing]
PUSHBYTE [PE_NumberOfSections]
PUSHNUMBER [Size]
PUSHBOOL [IsPatched]
Beschreibungen der verwendeten Konstanten: [Nothing],
[PE_NumberOfSections],
[Size] und [IsPatched]
Und Werte aus Benutzerregister:
PUSH #R3
PUSHBYTE #R2
PUSHNUMBER #R5
PUSHBOOL #R1
Im Gegensatz zu Methoden geben Funktionen Werte zurück. Deshalb muss beim Aufrufen einer Funktion nicht nur dessen Parameter
angegeben werden, sondern auch ein Benutzerregister, in welches der Rückgabewert der Funktion geschrieben wird.
Beispiel ADD:
PUSHNUMBER 5
PUSHNUMBER2 8
ADD #R1
Die relativ banale Funktion ADD addiert zwei Zahlen, genauer gesagt die Zahlenwerte vom ersten und zweiten Number-Register.
In Zeile 000 und 001 werden die beiden zu addierenden Zahlenwerte in die entsprechenden Register geschrieben.
In Zeile 002 wird die Funktion ADD aufgerufen. Als Register für den Rückgabewert der Funktion wird
#R1, das erste Benutzerregister angegeben.
Mögliche Register für Rückgabewerte von Funktionen sind die fünf identischen Benutzerregister #R1,
#R2, #R3, #R4 und #R5.
Nachdem diese drei Codezeilen ausgeführt wurden, steht im 1. Benutzerregister (#R1) der hexadezimale Zahlenwert D.