uzullaの日記

本家:about等:Twitter
 | 

2008-05-01

ionCube PHP EncoderをつかってPHPアプリを暗号化した

| 02:04

仕事でionCube PHP Encoder(以下ipe)をつかってPHPアプリを暗号化したりした。

http://www.asial.co.jp/ioncube/

どんなもんかというと

<?php

phpinfo();
print "aaaa";
?>

こんなコードが

<?php //0035e
if(!extension_loaded('ionCube Loader')){$__oc=strtolower(substr(php_uname(),0,3));$__ln='/ioncube/ioncube_loader_'.$__oc.'_'.substr(phpversion(),0,3).(($__oc=='win')?'.dll':'.so');$__oid=$__id=realpath(ini_get('extension_dir'));$__here=dirname(__FILE__);if(strlen($__id)>1&&$__id[1]==':'){$__id=str_replace('\\','/',substr($__id,2));$__here=str_replace('\\','/',substr($__here,2));}$__rd=str_repeat('/..',substr_count($__id,'/')).$__here.'/';$__i=strlen($__rd);while($__i--){if($__rd[$__i]=='/'){$__lp=substr($__rd,0,$__i).$__ln;if(file_exists($__oid.$__lp)){$__ln=$__lp;break;}}}@dl($__ln);}else{die('The file '.__FILE__." is corrupted.\n");}if(function_exists('_il_exec')){return _il_exec();}echo('Site error: the file <b>'.__FILE__.'</b> requires the ionCube PHP Loader '.basename($__ln).' to be installed by the site administrator.');exit(199);
?>
4+oV55IZRKMmTbPhMHluPllc445Sxm8ZeFVUTPsiTmbh+dr/4gbJPHv6kgYB5bjOoCc544M4w8m0
G3821XHaRHeC5130ZUTq0DgWh7Q16oTatx18dsqJwuy0YTiLDSRvO8JQbwC96Sc8bYrbWZ9YE0eI
wQ/0+zSsKH2TfvCquFB+myYTukloO4UZNUGmzJPauFO6pBFoCKV+1m9l08MnqAK1oioqVyVQ4Ul9
r8Ts0K451guhjxt8+p76WwyVX8TFOvp7bbB2zw6WTzbXVKHdrnsdfMrjfl0SONyVAuj5zYfH4ga5
lq2Xss4XEpgCEZi6EFlvbleXc/GGunEr8uhrKcs9IZTzpnwVd1P0n0f8ipz3UoAlGDUBNwqfhDfn
cC5RmwrWVS91srMTQpH0DoRseiupxpr5mcPhAojdi8RHWfWQ2fP28MXy0QYHWAlvCgWt

こんなになる。

おまけで高速化も図られるらしい。

MACアドレスインストールサーバーを指定したりとか、ライセンスファイル方式をやったりできるらしい。

他の競合アプリにくらべて、安く(Zend Guard高杉)、なおかつ(個人的に試した限り)遜色ない。


アプリのデキ

UIはとても簡単でよい。

ソースのディレクトリと、出力先のディレクトリを指定したら後は実行するだけ。

オプションは色々あるが、特にいじらなくてもちゃんと暗号化はされる(当然か)


HTMLや画像ファイルなど、全部ごたまぜをsrcにしてOK(これはカイテキ)、指定の拡張子だけ(phpなど)変換され、指定されていない拡張子のファイルは単にコピーされる

出力先をhtdocsなどにしておくと、再デプロイが手軽ですね。FTPで直接アップロードする機能もあるらしい。


変換はかなり高速で、200ファイルは5秒くらいで処理される(キャッシュ効いているのかな?)。

ちょいといじる > スクランブル > テスト

もそんなに苦もなくできてステキ。


他の製品と比較すると

ZendGuardにくらべて単純なUIなので使いやすい。(ZGは色々できるのはいいが、UIがむずかしすぎる、どちらも体験版がでているので試してみると良い。俺はipeのほうがよかった)


サーバー側の設定

PHPに拡張を一つ入れる必要が有る。

ファイルをコピーして、php.iniに一行加えるだけなので、簡単。


一発で全部変換できるってのはムリ

一発で全部暗号化できるかというと、さすがに何も考えずにつくったPHPアプリの一括変換はムリ。

よく拡張子phpにした非phpなコンフィグファイル(リソースファイル)などを作ると思うが、これも暗号化処理されてしまうので問題が発生する。


ただ、リソースファイルは別途の暗号化が可能であり、特殊な関数で読み込める。この辺りまとめると

PHPアプリをプリコンパイルしたもの

・テキストなどを暗号化したもの

という二パターンが生成でき、拡張子にてどちらにするか指定することができる。


だから、phpという拡張子リソースファイルは、たとえばencなどという拡張子にでもして、それに合わせて全体のコードを書き換える必要が有る。


もちろん暗号化されたファイルはそのままfile()などで読み込むとダメなので、

function readencfile($filename){
	$res = false;
	if (function_exists('ioncube_read_file')) {
		$res = ioncube_read_file($filename);
		if (is_int($res)) $res = false;
	}
	else if ( ($fd = @fopen($filename, 'rb')) ) {
		$res = ($size = filesize($filename)) ? fread($fd, $size) : '';
		fclose($fd);
	}
	return $res;
}

こんな感じのコードを書いて、ioncube_read_fileという関数を用いて復号化して上げる。

基本的に、このリソースファイルの読み込み問題が暗号化で発生するほとんどの問題である。


ipeはSmartyに対応!などと唱っているが、様は上のようなコードをSmartyClassパッチすることで、Smartyテンプレートファイルを暗号リソースファイルにして動かせる、という意味であり、まあなんというか…言った物勝ちだなーとおもったw


そのほか、引っかかったところ

一部セッション周りがそのままではうまくうごかなかった、最適化の所為だろうか。

最初にob_start()を実行することでこの問題は解決出来た。(ちなみにZGでも同じ問題がでた、ZGとIPEは実装似てるんだろうな)


暗号化した後のデバッグは不可能だとおもったほうがよい。

エラーテキスト自体は普通なのだが、行番号が0になってしまいまったく追えない。(最初にスクランブルする作業では結構手間取った。)


ipeが悪いのか、なんなのか解らないが、Apacheが落ちることがあった。


感想

簡単だし、安いし、良いのではないでしょうか*1

*1:まあ、現在絶賛移植作業中なのだが

 |