Do You PHP はてブロ

Do You PHPはてなからはてブロに移動しました

PHP_Obfuscator 0.1.0をリリースしました

前回のPHP勉強会で発表した内容の続きです。
結局、PHP_Obfuscatorというありふれた名前にしちゃいましたが、とりあえずopenpear.orgからダウンロード/インストールできるようにしました。

インストール

PEAR::Console_CommandLineに依存してますので、-aオプションを付けてインストールしてください。

$ sudo pear install -a openpear/php_obfuscator-beta
$ 

インストール後、php-obfuscatorというコマンドがインストールされていることを確認してください。

$ php-obfuscator
Error: You must provide at least 1 argument.
Type "/usr/local/lib/php5/bin/php-obfuscator --help" to get help.
$ php-obfuscator --help
obfuscate php script.

Usage:
  /usr/local/lib/php5/bin/php-obfuscator [options] <file>

Options:
  --verbose                      turn on verbose output
  -t filter, --filter=filter     a list of filters. specify 'XXXX' if use
                                 PHP_Obfuscator_Filter_XXXXFilter
  -e encoder, --encoder=encoder  encoder names. specify 'XXXX' if use
                                 PHP_Obfuscator_Encoder_XXXXEncoder
  -h, --help                     show this help message and exit
  -v, --version                  show the program version and exit

Arguments:
  file  the script file name to obfuscate

$ 

前回のPHP勉強会のプレゼン資料にある『Filter』が『Encoder』という名称になりました。で、『Filter』は資料内の『ブロック』を作る部分になります。このFilterで、PhpLockIt!でいうアクセス元IPでの制限や有効期限などを設定することになります。
今のところ、利用できるEncoderは以下のとおりです。

また、利用できるFilterは。。。PHP_Obfuscator_Filter_ExpireRestrictionFilterクラスがありますが、今のバージョンではまだ利用できません>< 有効期限をどうやって指定するか、とかを含めて、もうちょっと考えさせてください。

とりあえずの使い方

たとえば、

$ cat date.php
hogehoge
<?php
echo date('Y/m/d H:i:s') . PHP_EOL;
$

というスクリプト

  • gzip圧縮して、
  • base64_encodeして、
  • strtrで文字を置換して

難読化する場合は、

$ php-obfuscator -e Gzip Base64 Strtr date.php

という感じになります。実行結果は標準出力に吐かれます。

$ php-obfuscator -e Gzip Base64 Strtr date.php
<?php $__n = __FILE__; eval(base64_decode("JF9fZiA9IGZvcGVuKCRfX24sICJyYiIpOyBmZ2V0cygkX19mKTsgZXZhbChnemluZmxhdGUoYmFzZTY0X2RlY29kZShzdHJ0cihmcmVhZCgkX19mLCA3NCksICdBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvJywgJzE5Nk1Cc1RSYWNnZWROSFpibTdyK1l6aHg1bC93UExRa0twV091alhHZlUyUzBpVjhJSnZDcXRBM0U0bkZEb3knKSkpKTs")); return; ?>
FSpe/5BdEj8LeXzSK+c0n1SqZxYwXPG5gafNBqmBndtqEfUTGh2uMqt8dVq3m6E6v4wpIA6l33$ 

なので、必要に応じてリダイレクトしてファイルに出力してください。

$ php-obfuscator -e Gzip Base64 Strtr date.php > tmp.php ; php tmp.php
hogehoge
2010/07/02 20:53:03
$ 

独自のEncoder、Filterの追加

独自のEncoderを追加する場合は、PHP_Obfuscator_Encoder_AbstractEncoderクラスを継承したクラスをinclude_pathが通ったディレクトリに配置してください。
Filter追加は、PHP_Obfuscator_Filter_Filterインターフェースを実装したクラスをinclude_pathが通ったディレクトリに配置します。

現時点での注意点

複数ファイルで構成されるライブラリの難読化は、別途1ファイルにまとめる必要があります。

まとめ

ニッチなパッケージと思いますが、要望などあれば。。。