Binärdateneditor: GNU poke 2.0 greift auf laufende Prozesse zu
Neben dem Zugriff über eine Prozess-ID bietet die zweite Hauptversion des interaktiven Editors eine Unterteilung von I/O-Bereichen.
- Rainald Menge-Sonnentag
Knapp ein Jahr nach der ersten stabilen Version ist nun GNU poke 2.0 erschienen. Der interaktive Editor zum Bearbeiten von Binärdateien bringt im aktuellen Release zahlreiche meist kleinere Neuerungen mit. Zu den größeren Ergänzungen gehört, dass er I/O-Bereiche in Unterbereiche unterteilen und auf laufende Prozesse zugreifen kann.
poke arbeitet kommandozeilenbasiert nach dem REPL-Prinzip (Read Eval Print Loop). Das Tool bringt seine eigene Programmiersprache mit, um Datenstrukturen zu beschreiben und zu bearbeiten. Auf der Kommandozeile bietet es zwei Arten von Befehlen: Reguläre Kommandos sind in der poke-eigenen Programmiersprache geschrieben, während Punktbefehle, die mit .
starten, in C verfasst sind.
Daneben gibt es Ausdrücke und Anweisungen. Erstere erzeugen eine interaktive Ausgabe. Anweisungen geben keine direkte Rückmeldung, können aber beispielsweise über printf
ihre eigenen Ausgaben erzeugen. Komplexere Aufgaben lassen sich als Funktionen schreiben.
Details zur Programmiersprache, die im Gegensatz zum interaktiven Editor mit großem "P" geschrieben wird, lassen sich der Dokumentation entnehmen. Der Name des im März 2021 erstmals veröffentlichten Tools dürfte als Reminiszenz an den Befehl POKE
zu verstehen sein, der in der Programmiersprache Basic zum Schreiben eines Werts an einer Speicheradresse dient.
Unterteilte Speicherbereiche
Version 2.0 führt den Punktbefehl .sub
ein, um einen Unterbereich eines I/O-Bereichs zu erstellen. Folgendes Beispiel aus den Release Notes erstellt einen Unterbereich mit einem Offset von 2:
(poke) .mem scratch
(poke) .info ios
Id Type Mode Bias Size Name
* #0 MEMORY rw 0x00000000#B 0x00001000#B *scratch*
(poke) .sub #0, 2, 16, lala
(poke) .info ios
Id Type Mode Bias Size Name
* #1 SUB rw 0x00000002#B 0x00000010#B sub://0/0x0/0x10/lala
#0 MEMORY rw 0x00000000#B 0x00001000#B *scratch*
Beim Schreiben dieser Meldung fand sich in der poke-Dokumentation noch keine Beschreibung des .sub
-Befehls.
Am offenen Herzen
Ebenfalls neu ist der Punktbefehl .proc
, der Zugriff auf einen laufenden Prozess gibt und dafür einen neuen I/O-Bereich erstellt. Er funktioniert allerdings wohl nur in GNU/Linux-Systemen:
(poke) .proc 30244
(poke) .info ios
Id Type Mode Bias Size Name
* #0 PROC rw 0x00000000#B 0xffffffffffffffff#B pid://30244
Mit dem ergänzenden Parameter /m
erstellt der .proc
-Befehl zusätzliche Unterbereiche für den Zugriff auf VM-Bereiche des Prozesses. Im Zuge des Zugriffs auf Prozesse und deren VM-Bereiche bekommt der dump
-Befehl eine Ergänzung: Er zeigt ??
für Bytes an, die nicht lesbar sind. Das kann beispielsweise beim Zugriffsversuch auf VM-Bereiche von Prozessen passieren, die nicht gemapped sind.
Als kleine Komfortfunktion lässt sich neuerdings die Erscheinungsweise des Editors je nach Hintergrund konfigurieren: --style-dark
ist die Standardeinstellung und zielt auf dunkle Konsolenfenster, wogegen --style-bright
auf helle Hintergründe ausgelegt ist.
Weitere Neuerungen lassen sich den Release Notes entnehmen. Der Sourcecode findet sich im Git-Repository in der Savanne von GNU. Die Dokumentationsseite bietet die poke-Anleitung in zahlreichen Formaten von reinem Text über HMTL und TeX bis zu PDF. Nach wie vor bietet die poke-Site inklusive der Dokumentation derzeit leider keine HTTPS-Verbindung an.
(rme)