PHPファイルを難読化する「YAK Pro」

「PHPファイルを難読化したい」というリクエストを受けましたのでやり方をいろいろと調べてみました。

OSSの開発が盛んな時期なのでちょっと何とも言えない気持ちもありますけど・・・。

自力でツールを作ることも考えましたが、有志が便利アプリを開発していたので紹介します。

YAK Pro

YAK Pro – Php Obfuscator

説明するより結果を見てもらったほうが早いと思うので。どれくらいのレベルまで難読化できるか試してみましょう。

このPHPが・・・。


<?php
$hello      = "hello ";
$world      = "world ";
$what       = "what ";
$a          = "a ";
$beautiful  = "beautiful ";
$day        = "day ";

for($i=0;$i<=7;++$i)        // small loop!
{
    echo $hello;    echo $world;                                echo PHP_EOL;
    echo $what;     echo $a;    echo $beautiful;    echo $day;  echo PHP_EOL;
}
echo "that's it!".PHP_EOL;
?>

こうなります。


<?php
goto IF8nM; xf_W1: FNJF5: goto C3HKQ; FwMGj: echo $GPDVR; goto Caizj; rOdKz: r9mi3: goto EDaji; H7Tml: echo $YrZcW; goto uhaZM; C3HKQ: ++$HXsLE; goto Nyagi; AwE1G: $KX8iK = "\167\x6f\162\154\144\x20"; goto j84nr; IF8nM: $DqgqD = "\150\145\x6c\x6c\157\x20"; goto AwE1G; WcpO2: $YrZcW = "\x62\x65\141\165\164\x69\146\165\154\40"; goto cME_6; uhaZM: echo $pkC5S; goto VP8vz; HI4Uo: $SAGQo = "\x61\40"; goto WcpO2; yzcmD: echo PHP_EOL; goto FwMGj; cME_6: $pkC5S = "\144\141\171\40"; goto H2QN7; j84nr: $GPDVR = "\x77\150\x61\164\x20"; goto HI4Uo; eFeWW: echo $KX8iK; goto yzcmD; Nyagi: goto r9mi3; goto B5rxI; VP8vz: echo PHP_EOL; goto xf_W1; EDaji: if (!($HXsLE <= 7)) { goto gIBD5; } goto AXSAF; Caizj: echo $SAGQo; goto H7Tml; H2QN7: $HXsLE = 0; goto rOdKz; B5rxI: gIBD5: goto qpFbC; AXSAF: echo $DqgqD; goto eFeWW; qpFbC: echo "\164\150\141\164\47\x73\x20\151\x74\41" . PHP_EOL;

全く解読できなくなりましたね。

デモサイトで試せるので、自分のファイルで試してみたい方はこちら(YAK Pro - Demo)からどうぞ。

「文字列リテラル、定数名はそのままにする」など細かく設定できるのが優れていますね。

実行時の設定は後ほど説明します。

環境


$ cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)

gitphpコマンドが実行できる環境を用意しましょう。

インストール方法

下記手順でインストールします。


$ cd /usr/local/
$ git clone https://github.com/pk-fr/yakpro-po.git
$ cd yakpro-po
$ git clone https://github.com/nikic/PHP-Parser.git
$ chmod a+x yakpro-po.php

$ cd /usr/local/bin
$ ln -s /usr/local/yakpro-po/yakpro-po.php yakpro-po

# 確認
$ yakpro-po --help

実行方法

基本的な実行方法は下記の通りです。

コマンド 説明
yakpro-po [source_filename] 指定したPHPファイルを難読化する
yakpro-po [source_filename] -o [target_filename] 指定したPHPファイルを難読化し、指定したファイル名で出力する
yakpro-po [source_directory] -o [target_directory] 指定したディレクトリ以下のPHPファイルを再起的に難読化し、指定したディレクトリ名で出力する

テスト用のファイルを作成して試してみます。


$ vim test.php
# デモと同じプログラムを作成

# 難読化前の実行結果
$ php test.php
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
thats it!

# 難読化(元ファイルはそのままに難読化したtest2.phpを新規に作成する)
$ yakpro-po test.php -o test2.php
Info:	Using [/usr/local/yakpro-po/yakpro-po.cnf] Config File...
Info:	yakpro-po version = 2.0.3
Info:	Process Mode		= file
Info:	source_file		= [/home/hoge/test.php]
Info:	target_file		= [test2.php]
Obfuscating /home/hoge/test.php
Info:	[variable      ] scrambled 	:        7
Info:	[function      ] scrambled 	:        0
Info:	[method        ] scrambled 	:        0
Info:	[property      ] scrambled 	:        0
Info:	[class         ] scrambled 	:        0
Info:	[class_constant] scrambled 	:        0
Info:	[constant      ] scrambled 	:        0
Info:	[label         ] scrambled 	:       25

# 難読化後の実行結果
$ php test2.php
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
hello world
what a beautiful day
thats it!

問題なさそうですね。

難読化の設定はオプションを付与することで設定できます。


$ yakpro-po test.php -o test2.php --no-obfuscate-variable-name

オプションはこちら(YAK Pro - Option

また、/usr/local/yakpro-po/yakpro-po.cnfを修正することでデフォルトの設定が変更できるので、毎回同じオプションを使うようであればデフォルトを変えたほうがいいでしょう。

まとめ

PHPが実行できる環境を用意するだけ簡単に難読化することができました。

ただ、フレームワークのテンプレート等PHPでないファイルはもちろん処理されないので、変数名や定数名は変更しないように設定したほうが良さそうです。

それとアノテーションには対応してないので、シェルスクリプトで難読化前後のファイルを比べて、アノテーション部分を差し込むなどちょっと工夫しなきゃいけないのが難点ですね。

ではまた。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ABOUTこの記事をかいた人

Yusuke Ito

20代後半プログラミング未経験から転職し、現在はWEBエンジニアとして働いています。 バックエンドが本職ですが、1人でサービスを立ち上げるためフロントエンドも勉強中です。 最近はDAppsやNEMの開発に夢中です。