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 ("]");
 | 
						|
    }
 | 
						|
}
 |