バイナリファイルを読む練習。
ファイルの先頭部分を読み込んで、GZIPのヘッダ(0x1F,0x8B,0x08,0x00)を探し、その先頭位置を出力するプログラム。
#!/usr/bin/perl use strict; use warnings; my $size=32768; open( my $fh, $ARGV[0] ) or die("open"); binmode($fh); read( $fh, my $buf, $size ) or die("read"); my @d = unpack( "C*", $buf ); for( my $i=0; $i<$size-4; $i++ ){ if( $d[$i]==0x1f && $d[$i+1]==0x8b && $d[$i+2]==0x08 && $d[$i+3]==0x00 ){ print "$i\n"; exit 0; } } exit 1;
$ ./sentou.pl /boot/vmlinuz-2.6.32-5-amd64 14953
binmode はあってもなくてもちゃんと動く。 readして即unpackするようなときはバイナリモードとか関係ないってことか?
vmlinuz を解凍するための 1f 8b 08 00 | Apribase
これをやるために作った
$ K=/boot/vmlinuz-2.6.32-5-amd64 $ A=`./sentou.pl $K` $ dd if=$K bs=1 skip=$A 2>/dev/null | zcat -q | strings | grep "Linux version" Linux version 2.6.32-5-amd64 (Debian 2.6.32-35) (dannf@debian.org) (gcc version 4.3.5 (Debian 4.3.5-4) ) #1 SMP Tue Jun 14 09:42:28 UTC 2011