78 lines
1.6 KiB
Perl
78 lines
1.6 KiB
Perl
#!/usr/bin/perl
|
|
|
|
# ips.pl
|
|
# version 0.01
|
|
#
|
|
# This is a quick hack to apply IPS patches. It is distributed under
|
|
# the terms of the GNU General Public License.
|
|
|
|
if (@ARGV != 1)
|
|
{
|
|
print "manger"
|
|
}
|
|
|
|
open PAT, "$ARGV[0]" or die "Can't open $ARGV[1]";
|
|
|
|
read PAT, $data, 5;
|
|
die "Bad magic bytes in $ARGV[1]" if $data ne "PATCH";
|
|
printf("'%s': {", $ARGV[0]);
|
|
my $first = 1;
|
|
while(1)
|
|
{
|
|
read PAT, $data, 3 or die "Read error";
|
|
if ($data eq "EOF")
|
|
{
|
|
printf("},\n");
|
|
exit;
|
|
}
|
|
if($first == 1) {
|
|
$first = 2;
|
|
} else {
|
|
printf(",\n");
|
|
}
|
|
# This is ugly, but unpack doesn't have anything that's
|
|
# very helpful for THREE-byte numbers.
|
|
$address = ord(substr($data,0,1))*256*256 +
|
|
ord(substr($data,1,1))*256 +
|
|
ord(substr($data,2,1));
|
|
|
|
read PAT, $data, 2 or die "Read error";
|
|
$length = ord(substr($data,0,1))*256 + ord(substr($data,1,1));
|
|
if ($length)
|
|
{
|
|
read(PAT, $data, $length) == $length or die "Read error";
|
|
|
|
my @chars = split("", $data);
|
|
|
|
printf ("0x%lX: [", $address);
|
|
for(my $i=0; $i < $length; $i++) {
|
|
printf ("0x%lX", ord($chars[$i]));
|
|
if($i != $length - 1) {
|
|
printf(",");
|
|
}
|
|
if(($i % 38) == 0 && $i != 0) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf ("]");
|
|
}
|
|
else # RLE mode
|
|
{
|
|
read PAT, $data, 2 or die "Read error";
|
|
$length = ord(substr($data,0,1))*256 + ord(substr($data,1,1));
|
|
read PAT, $byte, 1 or die "Read error";
|
|
|
|
printf ("0x%lX: [", $address);
|
|
for(my $i=0; $i < $length; $i++) {
|
|
printf ("0x%lX", ord($byte));
|
|
if($i != $length - 1) {
|
|
printf(",");
|
|
}
|
|
if(($i % 38) == 0 && $i != 0) {
|
|
printf("\n");
|
|
}
|
|
}
|
|
printf ("]");
|
|
}
|
|
}
|