#!/usr/bin/perl use strict; use warnings; use Fcntl qw/:seek/; my $dateiname = 'dateizupatchen'; my $offset = 0xff; my $bytes_zu_schreiben = 1; my $alte_bytes = "\x00"; my $neue_bytes = "\x08"; my $vorhandene_bytes; # Datei oeffnen open my $dateihandle, '+<', $dateiname    or die "Kann $dateiname nicht oeffnen: $!\n"; # Daten binaer lesen und schreiben! binmode $dateihandle; # Position aufsuchen seek $dateihandle, $offset, SEEK_SET    or die "Kann nicht in Datei $dateiname auf Position $offset setzen: $!\n"; # Alten Inhalt einlesen my $bytes_gelesen = sysread $dateihandle, $vorhandene_bytes, $bytes_zu_schreiben; # Fehler aufgetreten? if (!defined $bytes_gelesen) {    die "Kann nicht aus Datei $dateiname lesen: $!\n"; } elsif ($bytes_gelesen != $bytes_zu_schreiben) {    die "Kann nur $bytes_gelesen Bytes aus $dateiname lesen.\n"; } # Alten Inhalt vergleichen if ($vorhandene_bytes ne $alte_bytes) {    die "Voriger Inhalt der Datei stimmt nicht, breche ab!\n"; } # Alte Position wieder aufsuchen seek $dateihandle, $offset, SEEK_SET    or die "Kann nicht in Datei $dateiname nochmals auf Position $offset setzen: $!\n"; # Daten ueberschreiben my $byteswritten = syswrite $dateihandle, $neue_bytes, $bytes_zu_schreiben; # Fehler aufgetreten? if (!defined $byteswritten) {    die "Kann nicht nach $dateiname schreiben: $!\n"; } elsif ($byteswritten != $bytes_zu_schreiben) {    die "Kann nur $byteswritten Bytes nach $dateiname schreiben.\n"; } # Alles okay, Bestaetigung ausgeben print STDERR "$bytes_zu_schreiben Bytes in $dateiname an Position $offset geaendert.\n"