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