-
Notifications
You must be signed in to change notification settings - Fork 2
/
scdupdatebinfile
executable file
·72 lines (56 loc) · 2.14 KB
/
scdupdatebinfile
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/usr/bin/perl
###############################################################################
# Copyright (c) 2011 by bgvanbur
#
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
###############################################################################
# replace part of a binary file with the contents of another binary file
###############################################################################
use strict;
use warnings;
if ( $#ARGV != 2 ) {
&Help();
}
my $updateFileName = $ARGV[0];
my $updateOffset = $ARGV[1];
my $replaceFileName = $ARGV[2];
if ( $updateOffset =~ m/^(\$|0x)([0-9A-F]+)$/ ) {
$updateOffset = hex($2);
}
my $replaceFileSize = -s $replaceFileName;
if ( $replaceFileSize <= 0 ) {
exit;
}
# TODO only replace part of the file as needed when I wanted to replace
# the SCD fun part of the ISO
# $replaceFileSize = 0x8000;
open( REPLACE, "<$replaceFileName" ) or die "Cannot read $replaceFileName\n";
my $replaceFileData = '';
if ( read( REPLACE, $replaceFileData, $replaceFileSize ) != $replaceFileSize ) {
die "Cannot read all of $replaceFileName\n";
}
close REPLACE;
open( UPDATE, "+<$updateFileName" ) or die "Cannot update $updateFileName\n";
seek( UPDATE, $updateOffset, 0 );
print UPDATE $replaceFileData;
close UPDATE;
sub Help {
die '
scdupdatebinfile <updatefile> <updateoffset> <replacefile>
[description]
Replace part of a <updatefile> with the contents from <replacefile> at byte
position <updateoffset>. Useful for overriding files in an ISO.
';
}