PHP ソースの難読化

ストリームを作る

PHP5 がリリースされたんでアレコレ見ていたら、勝手ストリームを作ると面白そうだったので難読化ストリームなるものを作ってみました。 ストリームを作ることのメリットは、fopen ラッパーとして通常のストリーム関数が使えるだけでなく、include や require にも使えるところでしょうか。 つまり、難読化ストリームを作ることにより、そのストリームで難読化した PHP ソースを include や require で読める…ということです。

2つの難読化ストリーム

難読化ストリームは、ファイルを扱うストリーム(jam://)だけでなく、変数に対するストリーム(jamvar://)も用意しています。 jamvar ストリームは include/require で扱えないスクリプト本体に対しても難読化を適用するためのトリックのために用意しました。 本当は、標準の file ストリームの乗っ取りをするほうがスマートな処理はできるのですが、乗っ取り方が分からなかったのと、できたとしても影響する範囲が大きいので、このような方法を取ることにしました。

コンパイルの方法

ソースファイルは、jam_stream-0.4.tar.gz をダウンロードしてください。 ソースコード展開後 jam_stream.c 中の JAMMING_CODE を変更することをお勧めします。サイズを変更する場合には JAMMING_CODE_LEN もあわせて変更してください。

コンパイルは、

# phpize
# configure
# make
# make install

の順で行います。PHP の開発環境が適切にインストールされていれば問題なくインストールできるでしょう。

インストールまで終われば、php.ini を編集します。php.ini に

□ php.ini
extension=jam_stream.so
jam_stream.server_name_mask = On
jam_stream.max_memory = 1M

を追加して再起動をしてください。

なお、JAMMING_CODE の内容は再コンパイルする時には変更しないように注意してください。難読化したファイルが読めなくなります。

PHP5 で利用される場合には、Fedora Core2/3 用の RPM パッケージを、「和彦さんちの yum レポジトリ」に置いていますのでご利用ください。

難読化ストリームの使い方

具体的な使い方は sctipts 中にある jam_conv.php を参考にしてください。 代替ファイルの作成や難読化ファイルの作成ができますので、代替ファイルの場合はそのままで、難読化した場合には include/require のファイル名の指定を "jam://難読化ファイル名" と書き換えてください。

なお、php.ini 中の設定項目ですが、

jam_stream.server_name_mask
難読化時に SERVER_NAME によるマスクを行う
jam_stream.max_memory
扱えるファイルサイズの上限

となっています。バーチャルドメインを設定している場合には jam_stream.server_name_mask = On で使うようにしてください。

難読化について

難読化処理は、zlib による圧縮と JAMMING_CODE による XOR 処理が主体となっています。 また、バーチャルドメイン対策として SERVER_NAME も併用できます。

この部分をカスタマイズすることにより、より安全な難読化ができるようになると思います。 コンパイル方法にも書いていますとおり、最低でも JAMMING_CODE は変更するようにしてください。

変更履歴

2004/12/28
PHP4.3.x に対応しました。PHP4.3.10 でのみテストしています。
2004/10/27
read only ファイルに対して正常にオープンできないバグを修正しました。

Presented by Kazuhiko Iwama.