Schrift
[thread]8218[/thread]

Hexcode einer Datei ändern



<< >> 5 Einträge, 1 Seite
gORDon_vdLg
 2006-08-05 22:19
#68553 #68553
User since
2006-06-29
35 Artikel
BenutzerIn
[default_avatar]
Hi leutz!

Ich möchte einen skript schreiben der den Hexcode einer Datei ändern kann.
Also ich habe eine Datei die ich mit dem skript patchen möchte, was sonst nur mit einem Hexeditor geht. Ich möchte nun das der skript das tut, es soll im skript fest vorgegeben sein was geändert wird.
Ein Beispiel währe das offset ff von 00 auf 08 geändert wird.
esskar
 2006-08-05 22:40
#68554 #68554
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
if(open(FILE, "+> diedatei.bin")) {
binmode FILE;
syswrite FILE, 0x08, 1, 0xFF;
close FILE;
}
pq
 2006-08-06 16:02
#68555 #68555
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
hab mal den sinnfreien termin aus dem posting rausgenommen.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem
gORDon_vdLg
 2006-08-06 19:33
#68556 #68556
User since
2006-06-29
35 Artikel
BenutzerIn
[default_avatar]
1. Habs gestern brobiert und es ging nicht. Die Datei wurde mit einer 0 Byte Datei überschrieben. Trotzdem thx.
2. Welcher sinnfreie Termin?
3. Gibt es die Perl Dokumentation eigentlich auch in Deutsch?
Dubu
 2006-08-07 00:04
#68557 #68557
User since
2003-08-04
2145 Artikel
ModeratorIn + EditorIn

user image
@esskar:
- Der Mode "+>" löscht eine existierende Datei immer. Wahrscheinlich meinst du "+<".
- Der Offset-Parameter von syswrite() gibt den Offset im Skalar an, nicht in der Datei.

@gordon:
1. Versuch's mal hiermit:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#!/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"

2. Man kann bei einem neuen Thread ein Datum dazu angeben. Das war bei diesem Thread wohl der Fall.
3. Wiki:Teilweise.
<< >> 5 Einträge, 1 Seite



View all threads created 2006-08-05 22:19.