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