Edited at

Perlでバイナリいじるときの備忘録


Windows(とか)でPerlを使えるようにする

ActivePerlをサイトから入手


コマンドプロンプトで試す

いい方法がわからんかった。

非Unixシステムで実行1とPerlデバッガー2のあたりを参考にした。


こんな感じで試す

# 簡単に試したい場合はperl -e [command]で実行

perl -e "print 'Hello, world!';"
# もうちょっと色々試したい場合はPerlデバッガを起動
perl -d -e 42


バイナリをいじる

とあるファイルのバイナリを編集しようと思って、どのプログラムが簡単だろうとネットを眺めてて、決め手となったのがこのページ3


5C がバイナリの16進表記であると仮定して、

#perl -p -i.back -e 's/\x5C\x5C/\x5C/g' FILENAME


上記のようにお手軽にバイナリいじることができるって分かってのでPerlにすることにした。

Packについては、変数使っていると意図通りに動かなかったので、そういった部分についてはこのサイト4を参考にして個別でPackした。


バイナリ

$suuji = 1;# 数字だよ

$packedSuuji = pack(H2,0.$suuji);#'03'(文字型)をPackしないと想定どおり動かないぞ
$contents =~ s/00\x02/00$packedSuuji/g;#Perlでは「.」で結合するけどここではいらないよ(深く考えない)
# \x30 \x30 \x01 って扱いになる

$missPackedSuuji = pack(H2,$suuji);
$missContents =~ s/00\x02/00$missPackedSuuji/g;
# \x30 \x30 \x0xxx って扱いになる



ファイル入出力

Qiitaの記事とかその他を読んでそれっぽくやった。


Optionについて

わかりやすいサイトがあったのでその記事5 6を参考に作る。

これを使うと勝手に短めのオプション指定もできるらしい(オプションの頭文字がかぶったら特定できる部分まで書けばOK)。

とくにEmptyPage.jp様の記事[^1]はとてもわかりやすく、感謝の気持ちでいっぱいになった。


test.pl -no=2 -type=others

test.pl -n=2 -t=others

test.pl -n 2 -t others

test.pl --n 2 --t others

↑どれもおなじ意味だよ



test.pl

# モジュールの読み込みと関数のインポート

use Getopt::Long 'GetOptions';

# デフォルト値設定
my $no = 1;
my $type = 'default';

# オプション受け取り
GetOptions(
'no=i' => $no,
'type=s' => $type
);