Scripte

WinHex & X-Ways

Scripte

 

Ein Teil der Funktionalität von WinHex kann in automatisierter Weise verwendet werden, z. B. um wiederkehrende Routineaufgaben zu erledigen oder um bestimmte Tätigkeiten an nicht beaufsichtigten Computern im Netz ferngesteuert auszuführen. Die Möglichkeit, andere als die mitgelieferten Beispielscripte auszuführen, ist Besitzern von professionellen und höheren Lizenzen vorbehalten. Scripte können vom Start-Center oder von der Kommandozeile aus gestartet werden. Wenn ein Script ausgeführt wird, können Sie die Esc-Taste drücken, um es abzubrechen. Scripte lösen aufgrund ihrer umfangreicheren Möglichkeiten die von früheren Versionen von WinHex bekannten Routinen ab.

 

WinHex-Scripte sind Textdateien mit der Namensendung ».whs«. Sie können mit jedem Texteditor bearbeitet werden und bestehen einfach aus einer Folge von Befehlen. Es wird empfohlen, pro Zeile nur einen Befehl einzugeben, um die Übersichtlichkeit zu wahren. Abhängig vom jeweiligen Befehl müssen dahinter ggf. Parameter angegeben werden. Die meisten Befehle wirken sich auf die Datei oder den Datenträger im aktuell aktiven Editierfenster aus.

 

Groß- und Kleinschreibung spielt bei den Scriptbefehlen keine Rolle. Kommentare dürfen überall in einem Script eingefügt werden. Zu ihrer Kenntlichmachung müssen ihnen zwei aufeinanderfolgende Schrägstriche vorangestellt werden. Parameter dürften max. 255 Zeichen lang sein. Sollten Sie im Zweifel sein, weil sowohl Hex-Werte als auch Zeichenketten (oder auch Zahlen) als Parameter akzeptiert werden, können Sie Anführungszeichen benutzen, um die Interpretation eines Parameters als Text zu erzwingen. Anführungszeichen sind zwingend erforderlich, wenn eine Zeichenkette oder ein Variablenname eines oder mehrere Leerzeichen enthält, damit alle Zeichen innerhalb der Anführungszeichen als ein Parameter erkannt werden. Wenn der Text innerhalb von Anführungszeichen ein definierter Variablenname ist, wird die Variable als Parameter verwendet.

 

Wo immer numerische Parameter erwartet werden, ermöglicht der integrierte Formel-Parser die Verwendung mathematischer Notation. Solche Ausdrücke müssen in Klammern angegeben werden. Sie dürfen keine Leerzeichen enthalten. Sie dürfen zuvor deklarierte Variablen verwenden, die als Integer-Werte interpretiert werden können. Unterstützte Operationen sind die Addition (+), Subtraktion (-), Multiplikation (*), Integer-Division (/), Modulo-Division (%), bitweises AND (&), bitweises OR (|) und bitweises XOR (^). Gültige mathematische Ausdrücke sind zum Beispiel (5*2+1), (MyVar1/(MyVar2+4)), oder (-MyVar).

 

Im Folgenden finden Sie Beschreibungen aller gegenwärtig unterstützten Scriptbefehle, incl. Beispiel-Parameter.

 

Create "D:\My File.txt" 1000

Erzeugt die angegebene Datei mit einer anfänglichen Dateigröße von 1000 Bytes. Wenn die Datei bereits existiert, wird sie überschrieben.

 

Open "D:\My File.txt"

Open "D:\*.txt"

Öffnet die angegebene(n) Datei(en). Geben Sie "?" als Parameter an, um den Nutzer die zu öffnende Datei wählen zu lassen.

 

Open C:

Open D:

Öffnet das angegebene logische Laufwerk. Opens the specified logical drive. Geben Sie "?" als Parameter an, um den Nutzer das zu öffnende logische Laufwerk oder den physischen Datenträger wählen zu lassen.

 

Open 80h

Open 81h

Open 9Eh

Öffnet den angegebenen physischen Datenträger. Die Numerierung von Floppy-Laufwerken beginnt mit 00h, die fest eingebauter und Wechseldatenträger mit 80h und die für optische Laufwerke mit 9Eh.

 

Optional können Sie einen zweiten Parameter mit dem Open-Befehl angeben, der den Editier-Modus angibt, in dem die Datei oder der Datenträger zu öffnen ist ("in-place" oder "read-only").

 

CreateBackup

Erzeugt ein WHX-Backup der aktiven Datei in seinem aktuellen Zustand.

 

CreateBackupEx 0 100000 650 true "F:\My backup.whx"

Erzeugt ein WHX-Backup der aktiven Platte, beginnend mit Sektor 0 bis Sektor 1.000.000. Die Backup-Datei wird automatisch in Stücke von 650 MB segmentiert. Komprimierung ist aktiv ("true"). Die erzeugte Datei ist der letzte Parameter.

 

Wenn die Backup-Datei nicht segmentiert werden soll, geben Sie 0 als dritten Parameter an. Um Komprimierung abzuschalten, übergeben Sie "false". Um vom Backup-Manager automatisch einen Namen zuweisen zu lassen und die Datei im Verzeichnis für Backup-Dateien ablegen zu lassen, geben Sie "" als letzten Parameter an.

 

Goto 0x128

Goto MyVariable

Bewegt die aktuelle Cursor-Position zur hexadezimalen Adresse 0x128. Alternativ kann auch eine existierende Variable (bis zu 8 Bytes groß) als numerischer Wert interpretiert werden.

 

Move -100

Bewegt die aktuelle Cursor-Position um 100 Bytes (dezimal) zurück.

 

Write "Test"

Write 0x0D0A

Write MyVariable

Schreibt die vier ASCII-Zeichen "Test" oder die zwei Hexadezimal-Werte "0D0A" an die aktuelle Position (im Überschreiben-Modus). Kann auch den Inhalt einer als Parameter angegebenen Variablen schreiben. Bewegt die aktuelle Cursor-Position entsprechend der Anzahl geschriebener Bytes vorwärts. Um das sicherzustellen, wird, falls das Ende der Datei erreicht wird, ein Nullbyte hinten angehängt. Das ist nützlich, damit weitere Write-Aufrufe nicht das letzte vom vorherigen Write-Aufruf geschriebene Byte wieder überschreiben.

 

Write2

Identisch zu Write, aber hängt kein Nullbyte an, wenn das Ende der Datei erreicht wurde. Daher darf man sich nicht darauf verlassen, daß Write2 die aktuelle Position um die Anzahl der geschriebenen Bytes vorwärts bewegt.

 

Insert "Test"

Arbeitet genau wie der "Write"-Befehl, jedoch im Einfügen-Modus. Darf nur mit Dateien benutzt werden.

 

Read MyVariable 10

Liest 10 Bytes von der aktuellen Position aus in die Variable namens "MyVariable". Wenn diese Variable noch nicht existiert, wird sie erzeugt. Bis zu 48 verschiedene Variablen sind erlaubt. Eine andere Art, eine Variable zu erzeugen, ist der "Assign"-Befehl.

 

ReadLn MyVariable

Liest von der aktuellen Position in eine Variable namens "MyVariable" bis das nächste Zeilenende-Zeichen gefunden wird. Wenn die Variable bereits existiert, wird ihre Größe entsprechend angepasst.

 

Close

Schließt das aktive Fenster ohne es zu speichern.

 

CloseAll

Schließt alle Fenster ohne zu speichern.

 

Save

Speichert die Änderungen an der Datei oder dem Datenträger im aktiven Fenster.

 

SaveAs "C:\New Name.txt"

Speichert die Datei im aktiven Fenster unter dem angegebenen Namen und Pfad. Geben Sie "?" als Parameter an, um den Nutzer das Ziel selbst auswählen zu lassen.

 

SaveAll

Speichert alle Änderungen in allen Fenstern.

 

Terminate

Bricht die Ausführung des Skripts ab.

 

Exit

Bricht die Ausführung des Skripts ab und beendet WinHex.

 

ExitIfNoFilesOpen

Bricht die Ausführung des Skripts ab, wenn aktuell keine Dateien in WinHex geöffnet sind.

 

Block 100 200

Block "My Variable 1" "My Variable 2"

Legt den aktuellen Block im aktiven Fenster fest beginnend bei Adresse 100 und endend bei Adresse 200 (dezimal). Alternativ können auch existierende Variablen (jede bis zu 8 Bytes groß) als numerische Werte interpretiert werden.

 

Block1 0x100

Legt den Anfang des Blocks auf die hexadezimale Adresse 0x100. Eine Variable ist ebenfalls als Parameter möglich.

 

Block2 0x200

Legt das Ende des Blocks auf die hexadezimale Adresse 0x200. Eine Variable ist ebenfalls als Parameter möglich.

 

Copy

Kopiert den aktuell definierten Block in die Zwischenablage. Wenn kein Block festgelegt ist, bewirkt der Befehl das gleiche wie der "normale" Kopieren-Befehl im Bearbeiten-Menü.

 

Cut

Schneidet den aktuell markierten Block aus der Datei aus und speichert ihn in der Zwischenablage.

 

Remove

Entfernt den aktuell markierten Block aus der Datei.

 

CopyIntoNewFile "D:\New File.dat"

CopyIntoNewFile "D:\File +MyVariable+.dat"

Kopiert den aktuell markierten Block in die angegebene Datei ohne die Zwischenablage zu benutzen. Wenn kein Block festgelegt ist, bewirkt der Befehl das gleiche wie der "normale" Kopieren-Befehl im Bearbeiten-Menü. Kann Datenträger-Sektoren genauso kopieren wie Dateien. Erlaubt eine unbegrenzte Anzahl von "+" Konkatenationen im Parameter. Eine Variable wird als Integer interpretiert wenn sie nicht größer als 2^24 (~16 Mio.) ist. Nützlich für Schleifen und Datenrettung.

 

Paste

Schreibt den aktuellen Inhalt der Zwischenablage an die aktuelle Position in einer Datei, ohne die aktuelle Position zu ändern.

 

WriteClipboard

Schreibt den aktuellen Inhalt der Zwischenablage an die aktuelle Position ein einer Datei oder auf einem Datenträger ohne die aktuelle Position zu verändern und indem es die Daten an der aktuellen Position überschreibt.

 

Convert Param1 Param2

Konvertiert die Daten der aktiven Datei von einem Format in ein anderes. Gültige Parameter sind ANSI, IBM, Binary, HexASCII, IntelHex, MotorolaS, Base64, UUCode, LowerCase, UpperCase und hiberfil, in den Kombinationen wie sie vom Konvertieren-Menübefehl bekannt sind.

 

AESEncrypt "My Password"

Verschlüsselt die aktive Datei oder den Datenträger oder einen davon ausgewählten Block mit dem angegebenen Schlüssel (bis zu 32 Zeichen lang) mit AES.

 

AESDecrypt "My Password"

Entschlüsselt die aktive Datei oder den Datenträger.

 

Find "John" [MatchCase MatchWord Down Up BlockOnly SaveAllPos Unicode Wildcards]

Find 0x0D0A [Down Up BlockOnly SaveAllPos Wildcards]

Sucht im aktiven Fenster nach dem Namen John bzw. dem Hexadezimal-Wert 0x0D0A und hält beim ersten Treffer an. Die anderen Parameter sind optional. Standardmäßig durchsucht WinHex die komplette Datei bzw. Platte. Die optionalen Parameter funktionieren wie von den WinHex-Suchoptionen bekannt.

 

ReplaceAll "John" "Joan" [MatchCase MatchWord Down Up BlockOnly Unicode Wildcards]

ReplaceAll 0x0A 0x0D0A [Down Up BlockOnly Wildcards]

Ersetzt alle Suchtreffer einer Zeichenkette oder eines Hexadezimal-Wertes in der aktiven Datei durch etwas anderes. Kann auf Laufwerke nur im In-Place-Modus angewandt werden.

 

IfFound

Ein boolescher Wert, der davon abhängt, ob die letzte Suchen- oder Ersetzen-Anweisung erfolgreich war. Setzen Sie Anweisungen, die ausgeführt werden sollen, wenn etwas gefunden wird, hinter die IfFound-Anweisung.

 

IfEqual MyVariable "Hello World"

IfEqual 0x12345678 MyVariable

IfEqual MyVariable 1000

IfEqual MyVariable MyOtherVariable

IfEqual MyVariable (10*MyOtherVariable)

Vergleicht entweder zwei numerische Integer-Werte (von denen jede ein konstanter Wert, eine Integer-Variable oder ein mathematischer Ausdruck sein kann) oder zwei Variablen, ASCII-Zeichenketten oder Hexadezimal-Werte auf binärer Ebene. Der binäre Vergleich zweier Objekte mit unterschiedlichen Längen liefert immer das Ergebnis »falsch«. Wenn die beiden Objekte gleich sind, werden die folgenden Befehle ausgeführt. If-Bedingungen dürfen nicht verschachtelt werden.

 

IfGreater MyVariable "Hello World"

IfGreater 0x12345678 MyVariable

IfGreater MyVariable 1000

IfGreater MyVariable MyOtherVariable

IfGreater MyVariable (10*MyOtherVariable)

Akzeptiert die gleichen Parameter wie IfEqual. Wenn der erste größer ist als der zweite, werden die folgenden Anweisungen ausgeführt. If-Bedingungen dürfen nicht verschachtelt werden.

 

Else

Darf nach IfEqual und IfFound auftreten. Setzen Sie Anweisungen, die ausgeführt werden sollen, wenn nichts gefunden wurde oder wenn die verglichenen Objekte nicht gleich sind, hinter die Else-Anweisung.

 

EndIf

Beendet die bedingte Befehlsausführung (nach IfFound, IfEqual, IfGreater).

 

ExitLoop

Beendet eine Schleife. Eine Schleife wird von geschweiften Klammern definiert. Der schließenden Klammer kann direkt ein Integer-Wert in eckigen Klammern folgen, der die Anzahl der Rundendurchläufe angibt. Dies kann auch eine Variable oder das Schlüsselwort "unlimited" (in diesem Fall kann die Schleife nur durch die Anweisung "ExitLoop" verlassen werden) sein. Schleifen dürfen nicht verschachtelt werden.

 

Beispiel für eine Schleife:

{ Write "Schleife" }[10] schreibt das Wort "Schleife" zehn Mal.

 

Label ContinueHere

Erzeugt ein Label mit dem Namen "ContinueHere"

 

JumpTo ContinueHere

Setzt die Ausführung des Skriptes mit der Anweisung, die dem Label folgt, fort.

 

NextObj

Springt zyklisch zum nächsten geöffneten Fenster und macht es zum "aktiven" Fenster. Wenn beispielsweise drei Fenster offen sind und das Fenster Nr. 3 aktiv ist, macht NextObj Fenster Nr. 1 zum neuen aktiven Fenster.

 

ForAllObjDo

Der folgende Block von Skriptbefehlen (bis EndDo auftritt) wird auf alle offenen Dateien und Laufwerke angewandt.

 

CopyFile C:\A.dat D:\B.dat

Kopiert den Inhalt von C:\A.dat in die Datei D:\B.dat.

 

MoveFile C:\A.dat D:\B.dat

Verschiebt die Datei C:\A.dat nach D:\B.dat.

 

DeleteFile C:\A.dat

Löscht überraschenderweise die Datei C:\A.dat.

 

InitFreeSpace

InitSlackSpace

Initialisiert den freien bzw. den Schlupfspeicher auf dem aktuellen logischen Laufwerk unter Verwendung der aktuellen Initialisierungs-Einstellungen. InitSlackSpace setzt das Laufwerk vorübergehend in den In-Place-Modus, womit alle noch anstehenden Änderungen gespeichert werden.

 

InitMFTRecords

Initialisiert alle unbenutzten MFT-FILE-Records auf dem aktuellen logischen Laufwerk, sofern es mit NTFS formatiert ist, unter Verwendung der aktuellen Initialisierungs-Einstellungen. Tut nichts auf anderen Dateisystemen. Die Änderungen werden unmittelbar auf die Platte geschrieben.

 

Assign MyVariable 12345

Assign MyVariable 0x0D0A

Assign MyVariable "I like WinHex"

Assign MyVariable MyOtherVariable

Speichert die angegebene Integer-Zahl, Binärdaten, ASCII-Text oder den Inhalt einer anderen Variable in eine Variable mit Namen "My Variable". Wenn diese Variable noch nicht existiert, wird sie erzeugt. Andere Methoden, eine Variable anzulegen, sind z. B. Read, GetUserInput, InttoStr. Bis zu 48 verschiedene Variablen sind erlaubt, d. h. können gleichzeitig existieren.

 

Release MyVariable

Specifically disposes an existing variable. Mandatory to invoke only when more than 48 variables with different names are to be used during the execution of a script, so that earlier variables that are not needed any more can be destroyed.

 

SetVarSize MyVariable 1

SetVarSize MyVariable 4

Setzt die zugewiesene Speichergröße einer Variablen ausdrücklich auf eine bestimmte Byte-Größe zu diesem Zeitpunkt. Dies kann hilfreich sein, z. B. um Variablen, die Integer-Werte enthalten und die aus einer Berechnung stammen, in eine binäre Datei mit einer fixen Struktur zu schreiben. Ohne Aufruf von SetVarSize dürfen keinerlei Annahmen über die Größe einer Variablen gemacht werden. Zum Beispiel könnte die Zahl 300 in einer beliebigen Zahl von Bytes größer als 1 gespeichert werden. Wenn die neue Größe mit SetVarSize kleiner ist als die bisherige, wird der zugewiesene Speicher abgeschnitten. Wenn die neue Größe größer ist, wird der zugewiesene Speicher ausgeweitet. In jedem Fall wird der Wert der verbleibenden Bytes beibehalten.

 

GetUserInput MyVariable "Bitte geben Sie Ihren Namen ein:"

Speichert den ASCII-Text oder die binären Daten (0x...), die der Nutzer zur Laufzeit des Skripts eingegeben hat (max. 128 Bytes), in einer Variablen mit Namen "MyVariable". Der Nutzer erhält ein Dialogfenster mit der Nachricht, die Sie als zweiten Parameter angeben. Wenn die Variable nicht existiert, wird sie erzeugt. Andere Möglichkeiten zur Erzeugung einer Variablen: Assign, Read.

 

GetUserInputI MyIntegerVariable "Bitte geben Sie Ihr Alter in Jahren ein:"

Funktioniert wie GetUserInput, akzeptiert und speichert aber nur Integer-Werte.

 

Inc MyVariable

Interpretiert eine Variable als Integer (sofern sie nicht größer als 8 Bytes ist) und inkrementiert sie um eins. Praktisch in Schleifen.

 

Dec MyVariable

Interpretiert eine Variable als Integer (sofern sie nicht größer als 8 Bytes ist) und dekrementiert sie um eins.

 

IntToStr MyStr MyInt

IntToStr MyStr 12345

Speichert die dezimale ASCII-Text-Repräsentation der Integer-Zahl, die als zweiter Parameter übergeben wird, in die Variable, die als erster Parameter angeben ist.

 

StrToInt MyInt MyStr

Speichert die Binärcodierung der Integer-Zahl, die als dezimaler ASCII-Text als zweiter Parameter übergeben wird, in die die Variable, die als erster Parameter angegeben ist.

 

StrCat MyString MyString2

StrCat MyString ".txt"

Hängt eine Zeichenkette an eine andere an. Der zweite Parameter kann eine Konstante oder eine Variable sein. Der erste Parameter muss eine Variable sein. Das Ergebnis wird in der Variablen gespeichert, die als erster Parameter übergeben wurde, und darf nicht länger als 255 Zeichen sein.

 

GetClusterAlloc MyStr

Kann auf ein logisches Laufwerk angewendet werden. Holt eine textuelle Beschreibung der Zuordnung der aktuellen Position, z. B. welche Datei im aktuellen Cluster gespeichert ist, und speichert diese Beschreibung in der angegebenen Variablen.

 

GetClusterAllocEx IntVar

May be applied to a logical volume. Retrieves an integer value that indicated whether the cluster at the current position is allocated (1) or not (0), and saves that description in the specified variable.

 

GetClusterSize IntVar

May be applied to a logical volume. Retrieves the cluster size and saves that value in the specified integer variable.

 

InterpretImageAsDisk

Behandelt ein Roh-Image oder ein Evidence-File wie eine echte physische Platte oder Partition. Erfordert eine Specialist- oder forensische Lizenz.

 

CalcHash HashType MyVariable

CalcHashEx HashType MyVariable

Berechnet einen Hashwert wie es aus dem Extras-Menü bekannt ist und speichert ihn in der angegebenen Variablen (die erzeugt wird, wenn sie nicht existiert). Der HashType-Parameter muss einer der folgenden sein: CS8, CS16, CS32, CS64, CRC16, CRC32, MD5, SHA-1, SHA-256, PSCHF. CalcHashEx zeigt den Hashwert zusätzlich in einem Dialogfenster an.

 

MessageBox "Caution"

Zeigt ein Dialogfenster mit dem Text "Caution" an und bietet einen OK und einen Cancel-Knopf. Durch Drücken von Cancel wird der Skriptdurchlauf abgebrochen.

 

ExecuteScript "ScriptName"

Führt ein anderes Skript aus einem laufenden Skript heraus aus am aktuellen Punkt der Skriptausführung, z.B. abhängig von einer Bedingung. Aufrufe an andere Skripte dürfen verschachtelt sein. Wenn der Aufruf des Skripts beendet ist, wird das ursprüngliche Skript mit dem nächsten Kommando weiter ausgeführt. Diese Funktion ermöglicht eine bessere Strukturierung Ihrer Skripte.

 

Turbo On

Turbo Off

Im Turbo-Modus werden die meisten Bildschirm-Elemente zur Laufzeit des Skripts nicht aktualisiert und es ist nicht möglich, das Skript abzubrechen (beispielsweise durch Drücken von Esc) oder zu pausieren. Dies beschleunigt das Skript um bis zu 75%, wenn sehr viele einfache Befehle wie Move oder NextObj in einer Schleife ausgeführt werden.

 

Debug

Alle folgenden Befehle müssen vom Nutzer einzeln bestätigt werden.

 

UseLogFile

Fehlermeldungen werden in die Log-Datei "Scripting.log" im Verzeichnis für temporäre Dateien geschrieben. Diese Meldungen werden nicht in einem Dialogfenster angezeigt, das Nutzerinteraktion verlangt. Nützlich insbesondere um Skripte unbeaufsichtigt auf einem Rechner laufen zu lassen.

 

CurrentPos

GetSize

unlimited

sind Schlüsselworte, die als Platzhalter fungieren und die benutzt werden können, wo numerische Parameter erwartet werden. Zur Skriptlaufzeit steht CurrentPos für die aktuelle Adresse im aktiven Datei- oder Laufwerksfenster und GetSize für seine Größe in Bytes. unlimited steht tatsächlich für die Zahl 2.147.483.647.